{"$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":"D8","name":"Code Coverage","shortDescription":{"text":"Code Coverage"},"helpUri":"https://codehealth.canine.dev/dimensions/D8"},{"id":"D9","name":"Test Distribution","shortDescription":{"text":"Test Distribution"},"helpUri":"https://codehealth.canine.dev/dimensions/D9"},{"id":"D10","name":"Test Quality","shortDescription":{"text":"Test Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D10"},{"id":"D13","name":"Secret Scanning","shortDescription":{"text":"Secret Scanning"},"helpUri":"https://codehealth.canine.dev/dimensions/D13","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"]}},{"id":"D15","name":"Churn \u00D7 Complexity Hotspots","shortDescription":{"text":"Churn \u00D7 Complexity Hotspots"},"helpUri":"https://codehealth.canine.dev/dimensions/D15"},{"id":"D16","name":"Bus Factor","shortDescription":{"text":"Bus Factor"},"helpUri":"https://codehealth.canine.dev/dimensions/D16"},{"id":"D17","name":"Explicit Debt","shortDescription":{"text":"Explicit Debt"},"helpUri":"https://codehealth.canine.dev/dimensions/D17"},{"id":"D19","name":"Documentation Quality","shortDescription":{"text":"Documentation Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D19"},{"id":"D20","name":"ADR Quality","shortDescription":{"text":"ADR Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D20"},{"id":"D21","name":"Naming Consistency","shortDescription":{"text":"Naming Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D21"},{"id":"D22","name":"Internal API Consistency","shortDescription":{"text":"Internal API Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D22"},{"id":"D26","name":"Project Cohesion","shortDescription":{"text":"Project Cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/D26"},{"id":"D28","name":"Secrets (history)","shortDescription":{"text":"Secrets (history)"},"helpUri":"https://codehealth.canine.dev/dimensions/D28","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"]}},{"id":"D29","name":"Static Analysis (SAST)","shortDescription":{"text":"Static Analysis (SAST)"},"helpUri":"https://codehealth.canine.dev/dimensions/D29","relationships":[{"target":{"id":"CWE-79","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-77","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-79","CWE-89","CWE-78","CWE-94","CWE-77"]}},{"id":"D30","name":"Dependency Vulnerabilities","shortDescription":{"text":"Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D30","relationships":[{"target":{"id":"CWE-1395","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-937","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1395","CWE-937"]}},{"id":"D31","name":"IaC \u0026 Container Security","shortDescription":{"text":"IaC \u0026 Container Security"},"helpUri":"https://codehealth.canine.dev/dimensions/D31","relationships":[{"target":{"id":"CWE-1032","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-732","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-16","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1032","CWE-732","CWE-16"]}},{"id":"D34","name":"Knowledge Freshness","shortDescription":{"text":"Knowledge Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/D34"},{"id":"D35","name":"Change Coupling","shortDescription":{"text":"Change Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D35"},{"id":"D36","name":"Supply-chain Provenance \u0026 Signing","shortDescription":{"text":"Supply-chain Provenance \u0026 Signing"},"helpUri":"https://codehealth.canine.dev/dimensions/D36","relationships":[{"target":{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1357","CWE-494"]}},{"id":"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"]}],"properties":{"cwe":["CWE-1059"]}},{"id":"D40","name":"Network Egress Confinement","shortDescription":{"text":"Network Egress Confinement"},"helpUri":"https://codehealth.canine.dev/dimensions/D40"},{"id":"D41","name":"Kernel \u0026 Syscall Confinement","shortDescription":{"text":"Kernel \u0026 Syscall Confinement"},"helpUri":"https://codehealth.canine.dev/dimensions/D41"},{"id":"D43","name":"Malicious Dependencies","shortDescription":{"text":"Malicious Dependencies"},"helpUri":"https://codehealth.canine.dev/dimensions/D43","relationships":[{"target":{"id":"CWE-506","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-506"]}},{"id":"D44","name":"Platform End-of-Life","shortDescription":{"text":"Platform End-of-Life"},"helpUri":"https://codehealth.canine.dev/dimensions/D44"},{"id":"AC1","name":"Text alternatives","shortDescription":{"text":"Text alternatives"},"helpUri":"https://codehealth.canine.dev/dimensions/AC1"},{"id":"AC2","name":"Forms \u0026 labels","shortDescription":{"text":"Forms \u0026 labels"},"helpUri":"https://codehealth.canine.dev/dimensions/AC2"},{"id":"AC3","name":"Page structure","shortDescription":{"text":"Page structure"},"helpUri":"https://codehealth.canine.dev/dimensions/AC3"},{"id":"AC4","name":"Keyboard semantics","shortDescription":{"text":"Keyboard semantics"},"helpUri":"https://codehealth.canine.dev/dimensions/AC4"},{"id":"AC5","name":"ARIA correctness","shortDescription":{"text":"ARIA correctness"},"helpUri":"https://codehealth.canine.dev/dimensions/AC5"},{"id":"AC6","name":"Visual \u0026 motion safety","shortDescription":{"text":"Visual \u0026 motion safety"},"helpUri":"https://codehealth.canine.dev/dimensions/AC6"},{"id":"AC7","name":"A11y enforcement","shortDescription":{"text":"A11y enforcement"},"helpUri":"https://codehealth.canine.dev/dimensions/AC7"},{"id":"AX10","name":"Code composition","shortDescription":{"text":"Code composition"},"helpUri":"https://codehealth.canine.dev/dimensions/AX10"},{"id":"AX3","name":"Project dependency cycles","shortDescription":{"text":"Project dependency cycles"},"helpUri":"https://codehealth.canine.dev/dimensions/AX3"},{"id":"AX5","name":"Architecture \u0026 structure","shortDescription":{"text":"Architecture \u0026 structure"},"helpUri":"https://codehealth.canine.dev/dimensions/AX5"},{"id":"AX7","name":"Slice cohesion","shortDescription":{"text":"Slice cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/AX7"},{"id":"AX8","name":"Test isolation","shortDescription":{"text":"Test isolation"},"helpUri":"https://codehealth.canine.dev/dimensions/AX8"},{"id":"AX9","name":"CQS / query purity","shortDescription":{"text":"CQS / query purity"},"helpUri":"https://codehealth.canine.dev/dimensions/AX9"},{"id":"AXB2","name":"Runtime readiness","shortDescription":{"text":"Runtime readiness"},"helpUri":"https://codehealth.canine.dev/dimensions/AXB2"},{"id":"M1","name":"Documentation (README)","shortDescription":{"text":"Documentation (README)"},"helpUri":"https://codehealth.canine.dev/dimensions/M1"},{"id":"M2","name":"Architecture documentation","shortDescription":{"text":"Architecture documentation"},"helpUri":"https://codehealth.canine.dev/dimensions/M2"},{"id":"M3","name":"Folder \u0026 project structure","shortDescription":{"text":"Folder \u0026 project structure"},"helpUri":"https://codehealth.canine.dev/dimensions/M3"},{"id":"M4","name":"Documentation accuracy","shortDescription":{"text":"Documentation accuracy"},"helpUri":"https://codehealth.canine.dev/dimensions/M4"},{"id":"P1","name":"CI/CD gates","shortDescription":{"text":"CI/CD gates"},"helpUri":"https://codehealth.canine.dev/dimensions/P1"},{"id":"P12","name":"CI test-gate honesty","shortDescription":{"text":"CI test-gate honesty"},"helpUri":"https://codehealth.canine.dev/dimensions/P12"},{"id":"P2","name":"Observability","shortDescription":{"text":"Observability"},"helpUri":"https://codehealth.canine.dev/dimensions/P2"},{"id":"P3","name":"Security \u0026 performance tooling","shortDescription":{"text":"Security \u0026 performance tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/P3"},{"id":"P4","name":"Deployment \u0026 Rollback","shortDescription":{"text":"Deployment \u0026 Rollback"},"helpUri":"https://codehealth.canine.dev/dimensions/P4"},{"id":"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":"P7","name":"Outbound HTTP resilience","shortDescription":{"text":"Outbound HTTP resilience"},"helpUri":"https://codehealth.canine.dev/dimensions/P7"},{"id":"P8","name":"Schema migrations","shortDescription":{"text":"Schema migrations"},"helpUri":"https://codehealth.canine.dev/dimensions/P8"},{"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":"R11","name":"Import Boundaries","shortDescription":{"text":"Import Boundaries"},"helpUri":"https://codehealth.canine.dev/dimensions/R11"},{"id":"R2","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/R2"},{"id":"R3","name":"Large Files","shortDescription":{"text":"Large Files"},"helpUri":"https://codehealth.canine.dev/dimensions/R3"},{"id":"R4","name":"Test Coverage","shortDescription":{"text":"Test Coverage"},"helpUri":"https://codehealth.canine.dev/dimensions/R4"},{"id":"R6","name":"Tooling","shortDescription":{"text":"Tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/R6"},{"id":"R7","name":"Dead Code","shortDescription":{"text":"Dead Code"},"helpUri":"https://codehealth.canine.dev/dimensions/R7"},{"id":"R8","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/R8"},{"id":"R9","name":"Circular Imports","shortDescription":{"text":"Circular Imports"},"helpUri":"https://codehealth.canine.dev/dimensions/R9"},{"id":"S1","name":"Web-Security Posture","shortDescription":{"text":"Web-Security Posture"},"helpUri":"https://codehealth.canine.dev/dimensions/S1"},{"id":"SC1","name":"Supply-chain hygiene","shortDescription":{"text":"Supply-chain hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/SC1"},{"id":"X9","name":"Subsumed condition operand","shortDescription":{"text":"Subsumed condition operand"},"helpUri":"https://codehealth.canine.dev/dimensions/X9"}]}},"results":[{"ruleId":"D1","level":"warning","message":{"text":"AgentConfigFields.AgentConfigFields (cyclomatic 170): AgentConfigFields.AgentConfigFields has cyclomatic complexity 170 (threshold 15). Of this number, 124 points are the body\u0027s own statements and 46 belong to 14 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentConfigFields.tsx"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b98052a05a361419fe434804214d1dc908b88b681c91886834d0bf0253b20f5"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_acp::run_harness (cyclomatic 169): buzz_acp::run_harness has cyclomatic complexity 169 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own 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/buzz-acp/src/lib.rs"},"region":{"startLine":2575}}}],"partialFingerprints":{"codehealthFindingId/v1":"98eca74be032a4c95adeebd65e65bb9a731c3f6587ef1765c47dc8dad04be321"}},{"ruleId":"D1","level":"warning","message":{"text":"AnimatedAvatarCapture.AnimatedAvatarCapture (cyclomatic 162): AnimatedAvatarCapture.AnimatedAvatarCapture has cyclomatic complexity 162 (threshold 15). Of this number, 98 points are the body\u0027s own statements and 64 belong to 19 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/AnimatedAvatarCapture.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"601709952b975f1e2bf47fffaf6f6b315fbb714e10417eb936666d105e80b3bd"}},{"ruleId":"D1","level":"warning","message":{"text":"_MessageList.build (cyclomatic 161): _MessageList.build has cyclomatic complexity 161 (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":"mobile/lib/features/channels/channel_detail_page/message_list.dart"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"7968c37b1bba43bbeb6e222a5aaa89f7e9dc3b462bc2b8b465d768393b567c00"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::handlers::ingest::ingest_event_inner (cyclomatic 149): buzz_relay::handlers::ingest::ingest_event_inner has cyclomatic complexity 149 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own 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/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":2252}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a57d05e60bcc9d3f422007c05928e6fe6d5e7e12e24987429fef0a0149202e8"}},{"ruleId":"D1","level":"warning","message":{"text":"ProfileAvatarEditor.ProfileAvatarEditor (cyclomatic 148): ProfileAvatarEditor.ProfileAvatarEditor has cyclomatic complexity 148 (threshold 15). Of this number, 85 points are the body\u0027s own statements and 63 belong to 26 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/ProfileAvatarEditor.tsx"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb57196301f4ba2c2f68dd9eb582d76aebf4b48fc945dbe54f1c65990abb861c"}},{"ruleId":"D1","level":"warning","message":{"text":"UserProfilePanel.UserProfilePanel (cyclomatic 147): UserProfilePanel.UserProfilePanel has cyclomatic complexity 147 (threshold 15). Of this number, 93 points are the body\u0027s own statements and 54 belong to 22 function literals inside it that branch. 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":"desktop/src/features/profile/ui/UserProfilePanel.tsx"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd16cbb9552da086e4ed1f90bbcddbf380a879e9e0ea1ca80dd77df565e45367"}},{"ruleId":"D1","level":"warning","message":{"text":"ThreadDetailPage.build (cyclomatic 138): ThreadDetailPage.build has cyclomatic complexity 138 (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":"mobile/lib/features/channels/thread_detail_page.dart"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"c471382d395a20d926765ef9825175b690cbfecba14a9e73bee2cd4a8f866535"}},{"ruleId":"D1","level":"warning","message":{"text":"AgentCreationPreview.AgentCreationPreview (cyclomatic 138): AgentCreationPreview.AgentCreationPreview has cyclomatic complexity 138 (threshold 15). Of this number, 91 points are the body\u0027s own statements and 47 belong to 15 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentCreationPreview.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7d0856624d3b340d829595724c6007cb3195667d5837bbced9c0e36bd08a9f1"}},{"ruleId":"D1","level":"warning","message":{"text":"useMentionSendFlow.useMentionSendFlow (cyclomatic 138): useMentionSendFlow.useMentionSendFlow has cyclomatic complexity 138 (threshold 15). Most of this is not in the body itself: 9 of the 138 points are its own statements and the rest belongs to 18 function literals inside it that branch (lines 284, 726, 530, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useMentionSendFlow.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"896ad01b8478b3532900c005fa3c435e0a338c45ff01aff332e118da8b746f6b"}},{"ruleId":"D1","level":"warning","message":{"text":"ChannelPane.ChannelPane (cyclomatic 128): ChannelPane.ChannelPane has cyclomatic complexity 128 (threshold 15). Of this number, 97 points are the body\u0027s own statements and 31 belong to 11 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/ChannelPane.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee6a796534c0acf4f81705b4e83e4e1cb7fc41e1fd74d1f4124e19b6c315bd1b"}},{"ruleId":"D1","level":"warning","message":{"text":"AgentDefinitionDialog.AgentDefinitionDialog (cyclomatic 124): AgentDefinitionDialog.AgentDefinitionDialog has cyclomatic complexity 124 (threshold 15). Of this number, 86 points are the body\u0027s own statements and 38 belong to 9 function literals inside it that branch. 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":"desktop/src/features/agents/ui/AgentDefinitionDialog.tsx"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f33d1383a61f17c2e082e1dcee88eb7b1aa19fb76b95b6ab1ffde5f4281f677"}},{"ruleId":"D1","level":"warning","message":{"text":"TerminalSubstrate.TerminalSubstrate (cyclomatic 123): TerminalSubstrate.TerminalSubstrate has cyclomatic complexity 123 (threshold 15). Most of this is not in the body itself: 10 of the 123 points are its own statements and the rest belongs to 39 function literals inside it that branch (lines 398, 685, 190, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/terminal/TerminalSubstrate.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"79f85f55dee1b4270a9c1672a7d270cc4e4335f4f5b569de0441eb855f458b3d"}},{"ruleId":"D1","level":"warning","message":{"text":"useAnchoredScroll.useAnchoredScroll (cyclomatic 118): useAnchoredScroll.useAnchoredScroll has cyclomatic complexity 118 (threshold 15). Most of this is not in the body itself: 2 of the 118 points are its own statements and the rest belongs to 27 function literals inside it that branch (lines 607, 432, 880, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useAnchoredScroll.ts"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"883fddb14780f3ab9808328c83b60a2bf570283a0e16abfd2fead6377891cddf"}},{"ruleId":"D1","level":"warning","message":{"text":"ImageAvatarCapture.build (cyclomatic 114): ImageAvatarCapture.build has cyclomatic complexity 114 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/profile/image_avatar_capture.dart"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4429afe78a213255712efb04200888c89a1680adc0a5630c0babbd655203250"}},{"ruleId":"D1","level":"warning","message":{"text":"ForumComposer.ForumComposerVisit (cyclomatic 112): ForumComposer.ForumComposerVisit has cyclomatic complexity 112 (threshold 15). Of this number, 39 points are the body\u0027s own statements and 73 belong to 21 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/forum/ui/ForumComposer.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f825ed0836004711e4dc5f8e1c6a9dc7ff0577f3a214972a63f7f51dbbb4068"}},{"ruleId":"D1","level":"warning","message":{"text":"markdown.ImageZoomOverlay (cyclomatic 112): markdown.ImageZoomOverlay has cyclomatic complexity 112 (threshold 15). Of this number, 49 points are the body\u0027s own statements and 63 belong to 24 function literals inside it that branch. 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":"desktop/src/shared/ui/markdown.tsx"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"fde26ff2574540617ffa24b3cfacd6b91d5ba9dba56d8da70969abcb3793ac93"}},{"ruleId":"D1","level":"warning","message":{"text":"MessageComposer.MessageComposerImpl (cyclomatic 109): MessageComposer.MessageComposerImpl has cyclomatic complexity 109 (threshold 15). Of this number, 42 points are the body\u0027s own statements and 67 belong to 17 function literals inside it that branch. 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":"desktop/src/features/messages/ui/MessageComposer.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dba39e155688a86ebecef1c7c15fbd9a48ed46c809150036156b5df36b1a313"}},{"ruleId":"D1","level":"warning","message":{"text":"AgentInstanceEditDialog.AgentInstanceEditDialog (cyclomatic 108): AgentInstanceEditDialog.AgentInstanceEditDialog has cyclomatic complexity 108 (threshold 15). Of this number, 80 points are the body\u0027s own statements and 28 belong to 11 function literals inside it that branch. 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":"desktop/src/features/agents/ui/AgentInstanceEditDialog.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"49f338d72570f8d94eaab19616bfdfae55b39940f6c2098eea28c340a667cf11"}},{"ruleId":"D1","level":"warning","message":{"text":"useUnreadChannels.useUnreadChannels (cyclomatic 107): useUnreadChannels.useUnreadChannels has cyclomatic complexity 107 (threshold 15). Most of this is not in the body itself: 3 of the 107 points are its own statements and the rest belongs to 18 function literals inside it that branch (lines 670, 791, 426, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/useUnreadChannels.ts"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"badc4fa2d132036edcd5f55a38ded2fbdc68114b6a929ed85e330bd1bd322e8c"}},{"ruleId":"D1","level":"warning","message":{"text":"MessageTimeline.MessageTimelineBase (cyclomatic 106): MessageTimeline.MessageTimelineBase has cyclomatic complexity 106 (threshold 15). Of this number, 75 points are the body\u0027s own statements and 31 belong to 11 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/MessageTimeline.tsx"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"09158b7b1f7b5b1fb9b2b4b753a7f1bf20be1b562bb0e9e9d1f6b37697c568a0"}},{"ruleId":"D1","level":"warning","message":{"text":"huddlePresenceRuntime.startHuddlePresenceRuntime (cyclomatic 105): huddlePresenceRuntime.startHuddlePresenceRuntime has cyclomatic complexity 105 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 84 belong to 14 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/lib/huddlePresenceRuntime.ts"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"55515a46126a25c80108fa293590f796a760e3fdda83d67c4898e735b3120e6f"}},{"ruleId":"D1","level":"warning","message":{"text":"HostedCommunityOnboarding.HostedCommunityOnboarding (cyclomatic 103): HostedCommunityOnboarding.HostedCommunityOnboarding has cyclomatic complexity 103 (threshold 15). Of this number, 54 points are the body\u0027s own statements and 49 belong to 21 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/communities/ui/HostedCommunityOnboarding.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d27f340e49c40442c99dc7d49eff77eb7998b4cecafe1ca5b210f6070e1e551"}},{"ruleId":"D1","level":"warning","message":{"text":"NostrKeyImportForm.NostrKeyImportForm (cyclomatic 100): NostrKeyImportForm.NostrKeyImportForm has cyclomatic complexity 100 (threshold 15). Of this number, 67 points are the body\u0027s own statements and 33 belong to 17 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/NostrKeyImportForm.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"f76d51e924d7474e79e0c71d29e91efc3665a9f4b79d2c243569ef35557fdd85"}},{"ruleId":"D1","level":"warning","message":{"text":"ComposeBar.build (cyclomatic 99): ComposeBar.build has cyclomatic complexity 99 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/compose_bar/compose_bar_widget.dart"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"17ad71e78c4acf027643603fb63233bc6b9591d2cb855ff1308171c7129b26b3"}},{"ruleId":"D1","level":"warning","message":{"text":"HuddleBar.HuddleBar (cyclomatic 99): HuddleBar.HuddleBar has cyclomatic complexity 99 (threshold 15). Of this number, 42 points are the body\u0027s own statements and 57 belong to 22 function literals inside it that branch. 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":"desktop/src/features/huddle/components/HuddleBar.tsx"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"acb5fe64f6f2e98fa47a76292dd7e2f956f79523e3ef66eec346d2267d474762"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowDialog.WorkflowDialog (cyclomatic 96): WorkflowDialog.WorkflowDialog has cyclomatic complexity 96 (threshold 15). Of this number, 59 points are the body\u0027s own statements and 37 belong to 17 function literals inside it that branch. 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":"desktop/src/features/workflows/ui/WorkflowDialog.tsx"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"b035814beb39723d2d45921dda8ed529a2f6f23152898108e38bbac868f5f217"}},{"ruleId":"D1","level":"warning","message":{"text":"MembersSidebar.MembersSidebar (cyclomatic 95): MembersSidebar.MembersSidebar has cyclomatic complexity 95 (threshold 15). Of this number, 56 points are the body\u0027s own statements and 39 belong to 17 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/MembersSidebar.tsx"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf000dc393516d1798ac2a2229cb9db97f691f0d8a77ac9050ca41d5fd20a593"}},{"ruleId":"D1","level":"warning","message":{"text":"CommunityOnboardingFlow.CommunityOnboardingFlow (cyclomatic 93): CommunityOnboardingFlow.CommunityOnboardingFlow has cyclomatic complexity 93 (threshold 15). Of this number, 44 points are the body\u0027s own statements and 49 belong to 21 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/CommunityOnboardingFlow.tsx"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"62c1f7d98976c6b4ab3dc180e9759c526554453fb8d0de41ce554a37294f0ecf"}},{"ruleId":"D1","level":"warning","message":{"text":"MessageThreadPanel.MessageThreadPanel (cyclomatic 91): MessageThreadPanel.MessageThreadPanel has cyclomatic complexity 91 (threshold 15). Of this number, 41 points are the body\u0027s own statements and 50 belong to 12 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/MessageThreadPanel.tsx"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"7887e5b0192d7504619e4bd77a98ccd8659ee6cf75fb8f68c18d2f837f578aba"}},{"ruleId":"D1","level":"warning","message":{"text":"HuddleContext.HuddleProvider (cyclomatic 89): HuddleContext.HuddleProvider has cyclomatic complexity 89 (threshold 15). Most of this is not in the body itself: 10 of the 89 points are its own statements and the rest belongs to 35 function literals inside it that branch (lines 832, 626, 706, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/HuddleContext.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"025cd310e74f2ae36e62fe85821e38f999dacddc781e57fd48f099e420437b62"}},{"ruleId":"D1","level":"warning","message":{"text":"useMentions.useMentions (cyclomatic 88): useMentions.useMentions has cyclomatic complexity 88 (threshold 15). Most of this is not in the body itself: 9 of the 88 points are its own statements and the rest belongs to 23 function literals inside it that branch (lines 828, 492, 601, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useMentions.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"596dd4fc39a56b062f0fae4228e78a2b296f5f3d6d7a0a4f1d68ac24d17e1d14"}},{"ruleId":"D1","level":"warning","message":{"text":"HomeView.HomeView (cyclomatic 87): HomeView.HomeView has cyclomatic complexity 87 (threshold 15). Of this number, 43 points are the body\u0027s own statements and 44 belong to 22 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/ui/HomeView.tsx"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"2617ad174504c59c600190eeea96816e5ed1587bdf909afefa928c0a49866a7d"}},{"ruleId":"D1","level":"warning","message":{"text":"InviteRedeemForm.InviteRedeemForm (cyclomatic 87): InviteRedeemForm.InviteRedeemForm has cyclomatic complexity 87 (threshold 15). Of this number, 48 points are the body\u0027s own statements and 39 belong to 5 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/InviteRedeemForm.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ed4f256c95b1b18eb18bb6eb49a03121ad941a7d1396f043d563e1a9267d60c"}},{"ruleId":"D1","level":"warning","message":{"text":"VideoPlayer.VideoReviewDialog (cyclomatic 87): VideoPlayer.VideoReviewDialog has cyclomatic complexity 87 (threshold 15). Of this number, 36 points are the body\u0027s own statements and 51 belong to 20 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/VideoPlayer.tsx"},"region":{"startLine":1198}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b772576b227e6ff9aa1b0311b510c7b040a12c36b19d42b5d07a95f0cf9bfcc"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::run_relay_main (cyclomatic 86): buzz_relay::run_relay_main has cyclomatic complexity 86 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own 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/buzz-relay/src/main.rs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"470ea06cd249acf8a6cf73bbf15749822d510b1d8985d38adcf67cc3903bbf19"}},{"ruleId":"D1","level":"warning","message":{"text":"AnimatedAvatarCapture.build (cyclomatic 86): AnimatedAvatarCapture.build has cyclomatic complexity 86 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/profile/animated_avatar_capture.dart"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"5397da1a1a09d366f3e79ad729d49be1b69b5edcd9144b409562d2d602da86d4"}},{"ruleId":"D1","level":"warning","message":{"text":"useObservedUnreadPersistence.useObservedUnreadPersistence (cyclomatic 86): useObservedUnreadPersistence.useObservedUnreadPersistence has cyclomatic complexity 86 (threshold 15). Most of this is not in the body itself: 1 of the 86 points is its own statement and the rest belongs to 27 function literals inside it that branch (lines 147, 379, 285, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/useObservedUnreadPersistence.ts"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c87d7b68c6dd582cf043b808849bd341ffee0bbe63559106cc3a7ef67d5e92f"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectDetailScreen.ProjectDetailScreen (cyclomatic 86): ProjectDetailScreen.ProjectDetailScreen has cyclomatic complexity 86 (threshold 15). Of this number, 49 points are the body\u0027s own statements and 37 belong to 16 function literals inside it that branch. 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":"desktop/src/features/projects/ui/ProjectDetailScreen.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d24dc7f6a183839576d4583c5bc5007d40a1d8744d79b4eab430241f069a521"}},{"ruleId":"D1","level":"warning","message":{"text":"ChannelDetailPage.build (cyclomatic 85): ChannelDetailPage.build has cyclomatic complexity 85 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_detail_page.dart"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d7b018d20eac909b28509fc2617359cc53160405ef47b29de5a6d702b15c60a"}},{"ruleId":"D1","level":"warning","message":{"text":"MessageRow.MessageRow (cyclomatic 85): MessageRow.MessageRow has cyclomatic complexity 85 (threshold 15). Of this number, 65 points are the body\u0027s own statements and 20 belong to 9 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/MessageRow.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae9bc64b8983b0b99dc5283c4e2687273036f2700eab514453e44687d07d247f"}},{"ruleId":"D1","level":"warning","message":{"text":"ProfileSettingsCard.ProfileSettingsCard (cyclomatic 85): ProfileSettingsCard.ProfileSettingsCard has cyclomatic complexity 85 (threshold 15). Of this number, 50 points are the body\u0027s own statements and 35 belong to 18 function literals inside it that branch. 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":"desktop/src/features/settings/ui/ProfileSettingsCard.tsx"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"99ebe278af03bd085e8e8451ec8ea9f888cee52875c2650c7423617e6e17694b"}},{"ruleId":"D1","level":"warning","message":{"text":"NostrBindConsentDialog.NostrBindConsentDialog (cyclomatic 84): NostrBindConsentDialog.NostrBindConsentDialog has cyclomatic complexity 84 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 60 belong to 12 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/NostrBindConsentDialog.tsx"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e6efd95b904341ba2a430030fbf69b948bb15b79dd69d93fd6c7b947773112b"}},{"ruleId":"D1","level":"warning","message":{"text":"HostedCommunitiesSettingsCard.HostedCommunitiesSettingsCard (cyclomatic 84): HostedCommunitiesSettingsCard.HostedCommunitiesSettingsCard has cyclomatic complexity 84 (threshold 15). Of this number, 38 points are the body\u0027s own statements and 46 belong to 19 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/HostedCommunitiesSettingsCard.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9fed1a9c2ac4ec5115f06052a0ca2a6b99fb42c0539a618e555d821baa57b3c"}},{"ruleId":"D1","level":"warning","message":{"text":"UserProfilePanelSections.ProfileSummaryView (cyclomatic 83): UserProfilePanelSections.ProfileSummaryView has cyclomatic complexity 83 (threshold 15). Of this number, 66 points are the body\u0027s own statements and 17 belong to 5 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/UserProfilePanelSections.tsx"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7a0d52f4c9a872d96fdc3330745cac5b289ed7658cc104432a655018eb1f92a"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowFormBuilder.WorkflowFormBuilder (cyclomatic 83): WorkflowFormBuilder.WorkflowFormBuilder has cyclomatic complexity 83 (threshold 15). Of this number, 31 points are the body\u0027s own statements and 52 belong to 18 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/WorkflowFormBuilder.tsx"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cb9930bb298120942b71c581777e5c6125cf3cd40d58da07a3aed744890b83f"}},{"ruleId":"D1","level":"warning","message":{"text":"CommunityCatalogDialog.CommunityCatalogDialog (cyclomatic 81): CommunityCatalogDialog.CommunityCatalogDialog has cyclomatic complexity 81 (threshold 15). Of this number, 50 points are the body\u0027s own statements and 31 belong to 13 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/CommunityCatalogDialog.tsx"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"67cd9e76cf171645360c4cfe70ccc519e9004799cfba9fcad8ad66983eccf8f1"}},{"ruleId":"D1","level":"warning","message":{"text":"TopbarSearch.TopbarSearch (cyclomatic 81): TopbarSearch.TopbarSearch has cyclomatic complexity 81 (threshold 15). Of this number, 37 points are the body\u0027s own statements and 44 belong to 10 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/search/ui/TopbarSearch.tsx"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2b0394e8ae7ce17989508d8fc4832ae8ab1c7979abcc92212b56677820b4bfe"}},{"ruleId":"D1","level":"warning","message":{"text":"EncryptedBackupCreator.EncryptedBackupCreator (cyclomatic 80): EncryptedBackupCreator.EncryptedBackupCreator has cyclomatic complexity 80 (threshold 15). Of this number, 40 points are the body\u0027s own statements and 40 belong to 15 function literals inside it that branch. 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":"desktop/src/features/onboarding/ui/EncryptedBackupCreator.tsx"},"region":{"startLine":361}}}],"partialFingerprints":{"codehealthFindingId/v1":"f607b9deeeb43e09770399001cd8bcfbbe1e5c93878b175795d0126f1bc83392"}},{"ruleId":"D1","level":"warning","message":{"text":"AgentsView.AgentsView (cyclomatic 79): AgentsView.AgentsView has cyclomatic complexity 79 (threshold 15). Of this number, 50 points are the body\u0027s own statements and 29 belong to 25 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentsView.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"fef495c0feea8e5104615e2c2787e7661574b16684ef4d649f61fcff2f480ac9"}},{"ruleId":"D1","level":"warning","message":{"text":"useRichTextEditor.useRichTextEditor (cyclomatic 77): useRichTextEditor.useRichTextEditor has cyclomatic complexity 77 (threshold 15). Most of this is not in the body itself: 1 of the 77 points is its own statement and the rest belongs to 21 function literals inside it that branch (lines 424, 227, 739, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useRichTextEditor.ts"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3c188e2e2d9f908f5ba445c233b577e3abcfccd2037cf533f07ead7c7248642"}},{"ruleId":"D1","level":"warning","message":{"text":"ChannelBrowserDialog.ChannelBrowserDialog (cyclomatic 74): ChannelBrowserDialog.ChannelBrowserDialog has cyclomatic complexity 74 (threshold 15). Of this number, 30 points are the body\u0027s own statements and 44 belong to 17 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/ChannelBrowserDialog.tsx"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe22b20554defd6dc0538f5afba502d291b377419959278385e4f61dc85660a8"}},{"ruleId":"D1","level":"warning","message":{"text":"AudioMessageAttachment.AudioMessageAttachment (cyclomatic 74): AudioMessageAttachment.AudioMessageAttachment has cyclomatic complexity 74 (threshold 15). Of this number, 26 points are the body\u0027s own statements and 48 belong to 27 function literals inside it that branch. 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":"desktop/src/features/messages/ui/AudioMessageAttachment.tsx"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"6512b916f9199e44923877edecafc803cc6413a07fe0410b01ada9e791734130"}},{"ruleId":"D1","level":"warning","message":{"text":"ProfileEditPage.build (cyclomatic 73): ProfileEditPage.build has cyclomatic complexity 73 (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":"mobile/lib/features/profile/profile_edit_page.dart"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"3df49688ae6b5978301dff5597480b443b3f2336a14d62406ed4b7c48a42d0ca"}},{"ruleId":"D1","level":"warning","message":{"text":"useMediaUpload.useMediaUpload (cyclomatic 72): useMediaUpload.useMediaUpload has cyclomatic complexity 72 (threshold 15). Most of this is not in the body itself: 3 of the 72 points are its own statements and the rest belongs to 41 function literals inside it that branch (lines 626, 283, 322, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useMediaUpload.ts"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfba5398f53db31589b68d94f4417cd2cf2ec010d02d700425172095048dafba"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowMessagePicker.WorkflowMessagePicker (cyclomatic 72): WorkflowMessagePicker.WorkflowMessagePicker has cyclomatic complexity 72 (threshold 15). Of this number, 34 points are the body\u0027s own statements and 38 belong to 17 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/WorkflowMessagePicker.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"99a69d73e335ed9c9dddeae29f3754e5a6e675ea3519c14804c4447ad36b30e9"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_acp::pool::run_prompt_task (cyclomatic 71): buzz_acp::pool::run_prompt_task has cyclomatic complexity 71 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own 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/buzz-acp/src/pool.rs"},"region":{"startLine":2323}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdce1f61899b640529e15713d7b3618cb47a2d44a8b8d04f11ce0a836bdd7c93"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::huddle::tts::tts_worker (cyclomatic 71): buzz_desktop::huddle::tts::tts_worker has cyclomatic complexity 71 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/huddle/tts.rs"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"576c0a9f6a02c1c4529da7db9e85c6979a7455f736fa0974d3db77b5e3cb78b2"}},{"ruleId":"D1","level":"warning","message":{"text":"InboxDetailPane.InboxMessageDetailPane (cyclomatic 71): InboxDetailPane.InboxMessageDetailPane has cyclomatic complexity 71 (threshold 15). Of this number, 49 points are the body\u0027s own statements and 22 belong to 8 function literals inside it that branch. 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":"desktop/src/features/home/ui/InboxDetailPane.tsx"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc6c8a1b752606ddef09c84174047d4ce5c83a5fe1abee42487699c036fdce13"}},{"ruleId":"D1","level":"warning","message":{"text":"NewMessageScreen.NewMessageScreen (cyclomatic 71): NewMessageScreen.NewMessageScreen has cyclomatic complexity 71 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 52 belong to 14 function literals inside it that branch. 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":"desktop/src/features/messages/ui/NewMessageScreen.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"d83be7cd642825cafa991378889bec75aeee0c2efc05e4738d8f27b5b1da9b79"}},{"ruleId":"D1","level":"warning","message":{"text":"ChannelDetailsPage.build (cyclomatic 70): ChannelDetailsPage.build has cyclomatic complexity 70 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_details_page.dart"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"b72e5f890bccb822ff1497dbdad068ea33d89b881a85534d67c63a44229c66a6"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::api::bridge::query_events_authed (cyclomatic 69): buzz_relay::api::bridge::query_events_authed has cyclomatic complexity 69 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/bridge.rs"},"region":{"startLine":1306}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e482b532b101d494d7b2970208e938c342cf085edbbaec2939ee8ca3cf6561f"}},{"ruleId":"D1","level":"warning","message":{"text":"Config::from_env (cyclomatic 67): Config::from_env has cyclomatic complexity 67 (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/buzz-relay/src/config.rs"},"region":{"startLine":605}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf2ec59f998a7001c97c04663d1534effc7c6a4dbffda9e6840bdee0b1d6e188"}},{"ruleId":"D1","level":"warning","message":{"text":"ChannelScreen.ChannelScreen (cyclomatic 66): ChannelScreen.ChannelScreen has cyclomatic complexity 66 (threshold 15). Of this number, 40 points are the body\u0027s own statements and 26 belong to 13 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/ChannelScreen.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4470951e8958f9c3c74202f8fe4b1b1dfc85f0f3834cd0854899db375e0dbf1"}},{"ruleId":"D1","level":"warning","message":{"text":"HostedCommunityCreateFlow.HostedCommunityCreateFlow (cyclomatic 66): HostedCommunityCreateFlow.HostedCommunityCreateFlow has cyclomatic complexity 66 (threshold 15). Of this number, 33 points are the body\u0027s own statements and 33 belong to 16 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/communities/ui/HostedCommunityCreateFlow.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a006dacb57bed25a7981480b39591beb07760cae9f3ba38a071848bc2cce0a3"}},{"ruleId":"D1","level":"warning","message":{"text":"agentSessionTranscript.processTranscriptEvent (cyclomatic 65): agentSessionTranscript.processTranscriptEvent has cyclomatic complexity 65 (threshold 15). Of this number, 63 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/agentSessionTranscript.ts"},"region":{"startLine":700}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ca2db35035bf9bd5f3750439d17e7fe9c84f3f9381c90a6f3821db0da943339"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_acp::relay::run_background_task (cyclomatic 64): buzz_acp::relay::run_background_task has cyclomatic complexity 64 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/relay.rs"},"region":{"startLine":1736}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e03b6587b230b93acbb60b05b26175b8392b1d015a44a4d9c46e2cb60331340"}},{"ruleId":"D1","level":"warning","message":{"text":"UserProfilePopover.UserProfilePopoverBody (cyclomatic 64): UserProfilePopover.UserProfilePopoverBody has cyclomatic complexity 64 (threshold 15). Of this number, 63 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/UserProfilePopover.tsx"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"6995d2800dd97716960c72bfc9e9d899e5d287684e15060762ac6a683bf54007"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectsView.ProjectsView (cyclomatic 64): ProjectsView.ProjectsView has cyclomatic complexity 64 (threshold 15). Of this number, 34 points are the body\u0027s own statements and 30 belong to 15 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectsView.tsx"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b543f41915866996a238d3559fc21bca85c5f4b54cde658656c061f5c559d5c"}},{"ruleId":"D1","level":"warning","message":{"text":"ChannelManagementSheet.ChannelManagementSheet (cyclomatic 62): ChannelManagementSheet.ChannelManagementSheet has cyclomatic complexity 62 (threshold 15). Of this number, 58 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/ChannelManagementSheet.tsx"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f4f6572181890506f8a1d1a4d47d26565e943ff566e1b4ccb5cdafb7d8ac704"}},{"ruleId":"D1","level":"warning","message":{"text":"MentionAutocomplete.MentionAutocomplete (cyclomatic 62): MentionAutocomplete.MentionAutocomplete has cyclomatic complexity 62 (threshold 15). Most of this is not in the body itself: 7 of the 62 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 246, 109, 137, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/MentionAutocomplete.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"6efb7564b9282883a9dd77dfc145ecf1bcf540f9876d6670f68b19cd787def74"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectRepositoryActionsPanel.ProjectRepositoryActionsPanel (cyclomatic 62): ProjectRepositoryActionsPanel.ProjectRepositoryActionsPanel has cyclomatic complexity 62 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectRepositoryActionsPanel.tsx"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"425b0dea4d9888cb4c401b329f38469d1b2aae2f0065f3b8963c7a873776a28f"}},{"ruleId":"D1","level":"warning","message":{"text":"ProfileAvatarEditor.build (cyclomatic 61): ProfileAvatarEditor.build has cyclomatic complexity 61 (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":"mobile/lib/features/profile/profile_avatar_editor.dart"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"f09be9a17a431dfe05945ba5e467bf1606c62e53ac62dbac34540f060526ee66"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectWorkspaceTabs.WorkspaceTabs (cyclomatic 61): ProjectWorkspaceTabs.WorkspaceTabs has cyclomatic complexity 61 (threshold 15). Of this number, 50 points are the body\u0027s own statements and 11 belong to 9 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectWorkspaceTabs.tsx"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"cee578b19aa9bc0558bbb8582a946f61a0105e17b8b33b95190c52c0b9f22002"}},{"ruleId":"D1","level":"warning","message":{"text":"useSearchResults.useSearchResults (cyclomatic 61): useSearchResults.useSearchResults has cyclomatic complexity 61 (threshold 15). Of this number, 25 points are the body\u0027s own statements and 36 belong to 13 function literals inside it that branch. 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":"desktop/src/features/search/useSearchResults.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"d821bd581d87c4006ff96ea84a3b681035611fd80bba72639584cfa3000da94c"}},{"ruleId":"D1","level":"warning","message":{"text":"AppSidebar.AppSidebar (cyclomatic 61): AppSidebar.AppSidebar has cyclomatic complexity 61 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 38 belong to 21 function literals inside it that branch. 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":"desktop/src/features/sidebar/ui/AppSidebar.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"566b0ab9f6a84db593d066c1e740ac34957773725bce49c321f50860c4309772"}},{"ruleId":"D1","level":"warning","message":{"text":"useManagedAgentActions.useManagedAgentActions (cyclomatic 60): useManagedAgentActions.useManagedAgentActions has cyclomatic complexity 60 (threshold 15). Of this number, 43 points are the body\u0027s own statements and 17 belong to 8 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/useManagedAgentActions.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"3977c4d3a11c924525b738740ab72b51aec1fdccafeb7b68e970b69fab19dc59"}},{"ruleId":"D1","level":"warning","message":{"text":"HuddlePresenceTracker.apply (cyclomatic 60): HuddlePresenceTracker.apply has cyclomatic complexity 60 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/lib/huddlePresence.ts"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce70b84cbb314f55df81bf3dfba8d789edd6e99916715965cae4149e4be04e2b"}},{"ruleId":"D1","level":"warning","message":{"text":"workflowFormTypes.yamlToFormState (cyclomatic 59): workflowFormTypes.yamlToFormState has cyclomatic complexity 59 (threshold 15). Of this number, 58 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/workflowFormTypes.ts"},"region":{"startLine":408}}}],"partialFingerprints":{"codehealthFindingId/v1":"b539e160c94f30a70a90e44a832175c4180c6a1d76110b2bcd2690061ffa0a7f"}},{"ruleId":"D1","level":"warning","message":{"text":"MachineOnboardingFlow.MachineOnboardingFlow (cyclomatic 58): MachineOnboardingFlow.MachineOnboardingFlow has cyclomatic complexity 58 (threshold 15). Of this number, 42 points are the body\u0027s own statements and 16 belong to 10 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/MachineOnboardingFlow.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8d7a22eb67a96e3e9caf0aad8ff60adce21744a3fb391c2de1556db5d322c35"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::audio::handler::handle_active_audio_connection (cyclomatic 57): buzz_relay::audio::handler::handle_active_audio_connection has cyclomatic complexity 57 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own 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/buzz-relay/src/audio/handler.rs"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"b716b7a2948aacd78f44c8cfdad236ef43edb1358a563de97cf2a3cde7871eec"}},{"ruleId":"D1","level":"warning","message":{"text":"useAgentAddressLockPicker.useAgentAddressLockPicker (cyclomatic 56): useAgentAddressLockPicker.useAgentAddressLockPicker has cyclomatic complexity 56 (threshold 15). Most of this is not in the body itself: 3 of the 56 points are its own statements and the rest belongs to 12 function literals inside it that branch (lines 194, 295, 346, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useAgentAddressLockPicker.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"90fbcbf4755fc4a9d741dcbaef14e2456998b24e1cb2fe6319a10b0849c7d556"}},{"ruleId":"D1","level":"warning","message":{"text":"VideoPlayer.VideoPlayer (cyclomatic 56): VideoPlayer.VideoPlayer has cyclomatic complexity 56 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 37 belong to 18 function literals inside it that branch. 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":"desktop/src/shared/ui/VideoPlayer.tsx"},"region":{"startLine":674}}}],"partialFingerprints":{"codehealthFindingId/v1":"74e6888ef796423b5a11c822224da57e51b761ae10ba2a8444c83004514e284c"}},{"ruleId":"D1","level":"warning","message":{"text":"BeeRefreshIndicator.build (cyclomatic 55): BeeRefreshIndicator.build has cyclomatic complexity 55 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/widgets/bee_refresh_indicator.dart"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"c481952d4e7856eeb6e852a35176ca2615cb0f17d74f162faf9da51ffb328024"}},{"ruleId":"D1","level":"warning","message":{"text":"usePersonaActions.usePersonaActions (cyclomatic 55): usePersonaActions.usePersonaActions has cyclomatic complexity 55 (threshold 15). Of this number, 52 points are the body\u0027s own statements and 3 belong to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/usePersonaActions.ts"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"68a70d0ef3bb596b4b6f780796c04bbb06405d42150e0cf20745ad357d90ee46"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::handlers::side_effects::validate_admin_event (cyclomatic 54): buzz_relay::handlers::side_effects::validate_admin_event has cyclomatic complexity 54 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/side_effects.rs"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb77a22330be60ba08d375ec51a98f8d9c7910df318d10599532d62d14d305c0"}},{"ruleId":"D1","level":"warning","message":{"text":"formatTimelineMessages.formatTimelineMessages (cyclomatic 54): formatTimelineMessages.formatTimelineMessages has cyclomatic complexity 54 (threshold 15). Of this number, 41 points are the body\u0027s own statements and 13 belong to 6 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/formatTimelineMessages.ts"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0636bb76728b22bb084ab6f68378bf4ac6f7ecc9a3c62ee1197640819649f68"}},{"ruleId":"D1","level":"warning","message":{"text":"useHuddlePresentation.useHuddlePresentation (cyclomatic 53): useHuddlePresentation.useHuddlePresentation has cyclomatic complexity 53 (threshold 15). Most of this is not in the body itself: 5 of the 53 points are its own statements and the rest belongs to 26 function literals inside it that branch (lines 395, 189, 109, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/app/useHuddlePresentation.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c3fe394066bb8b540eb0cad09054bd10585a7b5907af9480ce8fac8d4c92359"}},{"ruleId":"D1","level":"warning","message":{"text":"welcomeKickoff.useWelcomeKickoff (cyclomatic 53): welcomeKickoff.useWelcomeKickoff has cyclomatic complexity 53 (threshold 15). Most of this is not in the body itself: 5 of the 53 points are its own statements and the rest belongs to 12 function literals inside it that branch (lines 576, 725, 560, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/welcomeKickoff.ts"},"region":{"startLine":494}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfc366a583f687f30227d6fd15c66d3c33ba8560ebb44c381adecad5392b1592"}},{"ruleId":"D1","level":"warning","message":{"text":"InboxListPane.InboxListPane (cyclomatic 52): InboxListPane.InboxListPane has cyclomatic complexity 52 (threshold 15). Most of this is not in the body itself: 13 of the 52 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 309, 713, 301, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/ui/InboxListPane.tsx"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b774bbfca7c67d777a19737dc9034c696fdd59030808783610b49aa91726d7d"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectPullRequestsPanel.ProjectPullRequestDetail (cyclomatic 52): ProjectPullRequestsPanel.ProjectPullRequestDetail has cyclomatic complexity 52 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 31 belong to 8 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectPullRequestsPanel.tsx"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"a89315fbde730ccc62cc094012733e240184c3498df431917404544357daf509"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_acp::relay::handle_ws_message (cyclomatic 51): buzz_acp::relay::handle_ws_message has cyclomatic complexity 51 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own 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/buzz-acp/src/relay.rs"},"region":{"startLine":2173}}}],"partialFingerprints":{"codehealthFindingId/v1":"adddf354e2608d58a2347271d31d1c81d017c547781d97a5353428193aec42d8"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaImageViewerPage.build (cyclomatic 51): MediaImageViewerPage.build has cyclomatic complexity 51 (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":"mobile/lib/features/channels/media_viewer_page.dart"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"f13723268842486e2d65d35238dcbed1df83ae3be2d7b29b080595dc93e710bb"}},{"ruleId":"D1","level":"warning","message":{"text":"modelCapabilities.generateDatabricksLabel (cyclomatic 51): modelCapabilities.generateDatabricksLabel has cyclomatic complexity 51 (threshold 15). Of this number, 48 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/modelCapabilities.ts"},"region":{"startLine":514}}}],"partialFingerprints":{"codehealthFindingId/v1":"956601ef3bdfccaefc6b9107f4a91a04afb09c5245a0ed1c10049bcd70c27cd3"}},{"ruleId":"D1","level":"warning","message":{"text":"TerminalBootstrap.TerminalBootstrap (cyclomatic 51): TerminalBootstrap.TerminalBootstrap has cyclomatic complexity 51 (threshold 15). Most of this is not in the body itself: 8 of the 51 points are its own statements and the rest belongs to 21 function literals inside it that branch (lines 147, 283, 103, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/terminal/TerminalBootstrap.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"f78ff1defb714486be2a0837a8f7101217bfb5ca0b87465c6bdb595aed85b934"}},{"ruleId":"D1","level":"warning","message":{"text":"ActivityPage.build (cyclomatic 50): ActivityPage.build has cyclomatic complexity 50 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/activity/activity_page.dart"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"6844f6821eff607d59b1001b85146979c0a26b820ff2ed49c06792dacd90cb95"}},{"ruleId":"D1","level":"warning","message":{"text":"useLiveChannelUpdates.useLiveChannelUpdates (cyclomatic 50): useLiveChannelUpdates.useLiveChannelUpdates has cyclomatic complexity 50 (threshold 15). Most of this is not in the body itself: 2 of the 50 points are its own statements and the rest belongs to 11 function literals inside it that branch (lines 245, 209, 390, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/useLiveChannelUpdates.ts"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bfb252d56c63b273033b93739eb8826ca81fafbf336f48aa5e316d01f1258ef"}},{"ruleId":"D1","level":"warning","message":{"text":"BackupStep.BackupStep (cyclomatic 50): BackupStep.BackupStep has cyclomatic complexity 50 (threshold 15). Of this number, 36 points are the body\u0027s own statements and 14 belong to 6 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/BackupStep.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2455852cb45e7c33fb6e5349e25f5c3e5ab3329e74190a4edcb11d54024a047"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowTriggerConditions.WorkflowTriggerConditions (cyclomatic 50): WorkflowTriggerConditions.WorkflowTriggerConditions has cyclomatic complexity 50 (threshold 15). Most of this is not in the body itself: 8 of the 50 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 275, 177, 154, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/WorkflowTriggerConditions.tsx"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9ccceaf8712a692a6d53b14dd20b5eaffd2b340df26c2054be0bc98530f19a3"}},{"ruleId":"D1","level":"warning","message":{"text":"markdown.createMarkdownComponents (cyclomatic 50): markdown.createMarkdownComponents has cyclomatic complexity 50 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 31 belong to 10 function literals inside it that branch. 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":"desktop/src/shared/ui/markdown.tsx"},"region":{"startLine":1212}}}],"partialFingerprints":{"codehealthFindingId/v1":"dddbf9bb07679b57b8251a1776fd896d448417b1fc9de86ef398c27ef0893349"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::huddle::playout::run_playout_recv_loop (cyclomatic 49): buzz_desktop::huddle::playout::run_playout_recv_loop has cyclomatic complexity 49 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/huddle/playout.rs"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"31035d025f5109e345e17c2a6851fb53200d1a2551db933843b0bec538621d5c"}},{"ruleId":"D1","level":"warning","message":{"text":"HuddleIndicator.HuddleIndicator (cyclomatic 49): HuddleIndicator.HuddleIndicator has cyclomatic complexity 49 (threshold 15). Most of this is not in the body itself: 15 of the 49 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 61, 219, 81, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/components/HuddleIndicator.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dd860699d745b92dfcca10b95f4f3f5a5257359a2c50ff453ab033c0f1ccfb7"}},{"ruleId":"D1","level":"warning","message":{"text":"TimelineMessageList.VirtualizedTimelineRows (cyclomatic 49): TimelineMessageList.VirtualizedTimelineRows has cyclomatic complexity 49 (threshold 15). Most of this is not in the body itself: 3 of the 49 points are its own statements and the rest belongs to 13 function literals inside it that branch (lines 497, 630, 713, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/TimelineMessageList.tsx"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"41d8502967d9cbe73c9eda03055f060bb18fd9d01d689c57194f309a1e1dd30b"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectConversationPanel.ProjectConversationPanel (cyclomatic 48): ProjectConversationPanel.ProjectConversationPanel has cyclomatic complexity 48 (threshold 15). Of this number, 42 points are the body\u0027s own statements and 6 belong to 5 function literals inside it that branch. 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":"desktop/src/features/projects/ui/ProjectConversationPanel.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"43fe9ff245c6fc94d47145ebea37d64f1610a6eeb0966e72304a41b6606d22a1"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::handlers::imeta::validate_imeta_tags (cyclomatic 47): buzz_relay::handlers::imeta::validate_imeta_tags has cyclomatic complexity 47 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/imeta.rs"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"67317b2b02ddacd2c4995e66c48fb1854cb5a19a2e594a26754432ee55974f58"}},{"ruleId":"D1","level":"warning","message":{"text":"ChannelsNotifier._fetchChannels (cyclomatic 47): ChannelsNotifier._fetchChannels has cyclomatic complexity 47 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channels_provider.dart"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cd461907b95c8a2ac9df7bf18e47b1e70af54d6a8abe6b38cac409a5e1c9b9c"}},{"ruleId":"D1","level":"warning","message":{"text":"App.CommunityApp (cyclomatic 47): App.CommunityApp has cyclomatic complexity 47 (threshold 15). Of this number, 26 points are the body\u0027s own statements and 21 belong to 7 function literals inside it that branch. 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":"desktop/src/app/App.tsx"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa66a9a1823f70b255a4fb4472d99f8d13203cd1e1ad37a4de57002bbbc5c94b"}},{"ruleId":"D1","level":"warning","message":{"text":"plainTextProjection.buildPlainTextProjection (cyclomatic 47): plainTextProjection.buildPlainTextProjection has cyclomatic complexity 47 (threshold 15). Of this number, 35 points are the body\u0027s own statements and 12 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/plainTextProjection.ts"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"e42bd1ed0ec00173499518a7e9b9fa0aabb35253f158aaee4ae2858f187c5d5c"}},{"ruleId":"D1","level":"warning","message":{"text":"PullRequestReviewersRow.PullRequestReviewersRow (cyclomatic 47): PullRequestReviewersRow.PullRequestReviewersRow has cyclomatic complexity 47 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 23 belong to 7 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/PullRequestReviewersRow.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fad0f297ce5613f3b857793e21aeb3c40d192813394272c9858b8ed32659126"}},{"ruleId":"D1","level":"warning","message":{"text":"AcpClient::read_until_response_with_idle_timeout (cyclomatic 46): AcpClient::read_until_response_with_idle_timeout has cyclomatic complexity 46 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/acp.rs"},"region":{"startLine":1371}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ba0caedfaef833e9be9bf4ec617c6c7c9c70cb15e9598aa30689899a7cf5c5a"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::run (cyclomatic 46): buzz_desktop::run has cyclomatic complexity 46 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/lib.rs"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"e810beb3e6dd87fb19e844d80f7f698c2cc8018b7c0e8f3717ee51dc7e4cfedb"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_acp::handle_prompt_result (cyclomatic 45): buzz_acp::handle_prompt_result has cyclomatic complexity 45 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own 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/buzz-acp/src/lib.rs"},"region":{"startLine":4655}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ca22dbb7cff14ac100a8bf87a845a7b1187c35150869946419e2d3885a28ccc"}},{"ruleId":"D1","level":"warning","message":{"text":"AppShell.AppShell (cyclomatic 45): AppShell.AppShell has cyclomatic complexity 45 (threshold 15). Of this number, 25 points are the body\u0027s own statements and 20 belong to 8 function literals inside it that branch. 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":"desktop/src/app/AppShell.tsx"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1e33d0c20b7edf270c27e27feef3802562c4919635341528e261811de62a2ba"}},{"ruleId":"D1","level":"warning","message":{"text":"useInboxSelectionAnchor.useInboxSelectionAnchor (cyclomatic 45): useInboxSelectionAnchor.useInboxSelectionAnchor has cyclomatic complexity 45 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 25 belong to 11 function literals inside it that branch. 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":"desktop/src/features/home/useInboxSelectionAnchor.ts"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"84ea35bebf6aeb08aa3ff6601f2c2ecdf4e551983a0a75fedde9f82d7b22b8e2"}},{"ruleId":"D1","level":"warning","message":{"text":"useInboxThreadContext.useInboxThreadContext (cyclomatic 45): useInboxThreadContext.useInboxThreadContext has cyclomatic complexity 45 (threshold 15). Most of this is not in the body itself: 6 of the 45 points are its own statements and the rest belongs to 12 function literals inside it that branch (lines 81, 110, 279, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/useInboxThreadContext.ts"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"26138d126be84516fbd7a645ff8b16d55b125a43a39306380e4d579f1d0b65bc"}},{"ruleId":"D1","level":"warning","message":{"text":"useVoiceNoteRecorder.useVoiceNoteRecorder (cyclomatic 45): useVoiceNoteRecorder.useVoiceNoteRecorder has cyclomatic complexity 45 (threshold 15). Most of this is not in the body itself: 1 of the 45 points is its own statement and the rest belongs to 7 function literals inside it that branch (lines 68, 125, 184, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useVoiceNoteRecorder.ts"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"73f71bb197cf30b2db98f85802c004bf3a7f38c0274fce28fd83ca96d7484c86"}},{"ruleId":"D1","level":"warning","message":{"text":"useComposerLinkPreviews.useComposerLinkPreviews (cyclomatic 45): useComposerLinkPreviews.useComposerLinkPreviews has cyclomatic complexity 45 (threshold 15). Most of this is not in the body itself: 13 of the 45 points are its own statements and the rest belongs to 17 function literals inside it that branch (lines 443, 457, 385, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useComposerLinkPreviews.tsx"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1850bed47832205e7e5badebfa7ebba23aec1a88510f3dd3f613a3bc417001c"}},{"ruleId":"D1","level":"warning","message":{"text":"SetStatusDialog.SetStatusDialog (cyclomatic 45): SetStatusDialog.SetStatusDialog has cyclomatic complexity 45 (threshold 15). Of this number, 32 points are the body\u0027s own statements and 13 belong to 5 function literals inside it that branch. 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":"desktop/src/features/user-status/ui/SetStatusDialog.tsx"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f2f966a4b272f5224e37e00c2ffbeffd9b716560c403b195c6cfae2375093e6"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::api::git::policy::hook_policy_check (cyclomatic 44): buzz_relay::api::git::policy::hook_policy_check 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/buzz-relay/src/api/git/policy.rs"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d764387ee57b198f2b583ea607cab434185ce68875f7de6f19688f7e1c86a2b"}},{"ruleId":"D1","level":"warning","message":{"text":"AgentDefaultsEditor.AgentDefaultsEditor (cyclomatic 44): AgentDefaultsEditor.AgentDefaultsEditor has cyclomatic complexity 44 (threshold 15). Of this number, 39 points are the body\u0027s own statements and 5 belong to 4 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentDefaultsEditor.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c0963c64518971f860a59dd9acfe06b74323518e5df11a1d148346c71fb2846"}},{"ruleId":"D1","level":"warning","message":{"text":"ChannelManagementSheet.ChannelManagementPanelContent (cyclomatic 44): ChannelManagementSheet.ChannelManagementPanelContent 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":"desktop/src/features/channels/ui/ChannelManagementSheet.tsx"},"region":{"startLine":673}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a93992766286408fe2f07ad7e030ed15c68da795244d3649a9440bbbe38416f"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_db::store::event::query_events_on (cyclomatic 43): buzz_db::store::event::query_events_on has cyclomatic complexity 43 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/event.rs"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"48ec1509484d1e6f4866399cdb53f03e1f00043cb6e7509f986a81589fbe0417"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::handlers::req::handle_req (cyclomatic 43): buzz_relay::handlers::req::handle_req has cyclomatic complexity 43 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/req.rs"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbc9e72dc31b862ed35d7732b6960b6d63a39e3297bf9497dd032d6b5826b72d"}},{"ruleId":"D1","level":"warning","message":{"text":"PersonaShareDialog.SnapshotShareDialog (cyclomatic 43): PersonaShareDialog.SnapshotShareDialog has cyclomatic complexity 43 (threshold 15). Of this number, 37 points are the body\u0027s own statements and 6 belong to 5 function literals inside it that branch. 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":"desktop/src/features/agents/ui/PersonaShareDialog.tsx"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"987176aa0c4bd915cf81268812121addd226e745f19e8264f4cfeac47867f807"}},{"ruleId":"D1","level":"warning","message":{"text":"OnboardingFlow.OnboardingFlow (cyclomatic 43): OnboardingFlow.OnboardingFlow has cyclomatic complexity 43 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 19 belong to 5 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/OnboardingFlow.tsx"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"dde2d324f2f2d89b70ebb4fdcec4e53525697e194256a02ef34e60dedcfeb2a7"}},{"ruleId":"D1","level":"warning","message":{"text":"IssueAssigneesRow.IssueAssigneesRow (cyclomatic 43): IssueAssigneesRow.IssueAssigneesRow has cyclomatic complexity 43 (threshold 15). Of this number, 25 points are the body\u0027s own statements and 18 belong to 6 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/IssueAssigneesRow.tsx"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"00103a22acdfa0f5759003a5173c08b530a39543c98d5e0e4a3a294ef7f844ee"}},{"ruleId":"D1","level":"warning","message":{"text":"PullRequestReviewCard.PullRequestReviewCard (cyclomatic 43): PullRequestReviewCard.PullRequestReviewCard has cyclomatic complexity 43 (threshold 15). Of this number, 30 points are the body\u0027s own statements and 13 belong to 4 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/PullRequestReviewCard.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d0282d709c331e14c743ac470695ca3e0566b903eb2dcd0a446644acfc8de75"}},{"ruleId":"D1","level":"warning","message":{"text":"HuddleTransport._handleJoined (cyclomatic 42): HuddleTransport._handleJoined has cyclomatic complexity 42 (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":"mobile/lib/shared/huddle/huddle_transport.dart"},"region":{"startLine":437}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dd6c5bea8a8928c10c26318c4d50cc73ba387b873fce00ac492bb1e2546e7f2"}},{"ruleId":"D1","level":"warning","message":{"text":"AdminConsoleSettingsCard.AdminConsoleSettingsSession (cyclomatic 42): AdminConsoleSettingsCard.AdminConsoleSettingsSession has cyclomatic complexity 42 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 19 belong to 4 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/AdminConsoleSettingsCard.tsx"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"00595dfa66ce736bde5e7d5fefaf65210886d88584f2e5f7e1af15aea1d3a288"}},{"ruleId":"D1","level":"warning","message":{"text":"useCommunityJoinAlerts.useCommunityJoinAlerts (cyclomatic 42): useCommunityJoinAlerts.useCommunityJoinAlerts has cyclomatic complexity 42 (threshold 15). Most of this is not in the body itself: 5 of the 42 points are its own statements and the rest belongs to 13 function literals inside it that branch (lines 303, 231, 523, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/community-members/useCommunityJoinAlerts.ts"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a6257951325129385a9109d30a7eaa28d68b4696f7d63de34c8b6fc58478ccc"}},{"ruleId":"D1","level":"warning","message":{"text":"useTtsSubscription.useTtsSubscription (cyclomatic 42): useTtsSubscription.useTtsSubscription has cyclomatic complexity 42 (threshold 15). Most of this is not in the body itself: 1 of the 42 points is its own statement and the rest belongs to 15 function literals inside it that branch (lines 129, 40, 104, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/lib/useTtsSubscription.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"b12a3432ac18f6e89e583baade83a61cfc022c45750e7098492da202fc1947a2"}},{"ruleId":"D1","level":"warning","message":{"text":"MobilePairingCard.MobilePairingCard (cyclomatic 42): MobilePairingCard.MobilePairingCard has cyclomatic complexity 42 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 19 belong to 12 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/MobilePairingCard.tsx"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f2147aafcaba4ef642ab549ed6b151b84f5c2ac66d446537fe73eedfe91247d"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowAuthorPicker.WorkflowAuthorPicker (cyclomatic 42): WorkflowAuthorPicker.WorkflowAuthorPicker has cyclomatic complexity 42 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 26 belong to 10 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/WorkflowAuthorPicker.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3e203e000ab22823438dd7a3abb1a569343d15d42efcfa6a36279345b380f2f"}},{"ruleId":"D1","level":"warning","message":{"text":"InvitePage.InvitePage (cyclomatic 42): InvitePage.InvitePage has cyclomatic complexity 42 (threshold 15). Of this number, 25 points are the body\u0027s own statements and 17 belong to 11 function literals inside it that branch. 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":"web/src/features/invite/ui/InvitePage.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b6e3f8e49258a861b7eb92c4ee949321819bc19adea953a4492668fcdef7a73"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_pair_relay::handle_conn (cyclomatic 41): buzz_pair_relay::handle_conn has cyclomatic complexity 41 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own 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/buzz-pair-relay/src/lib.rs"},"region":{"startLine":620}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a4b542e0b287414df6d7a4a1674220412860c0540d4566cf751fb87eb248c25"}},{"ruleId":"D1","level":"warning","message":{"text":"CommunityEditForm.CommunityEditForm (cyclomatic 41): CommunityEditForm.CommunityEditForm has cyclomatic complexity 41 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 22 belong to 4 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/communities/ui/CommunityEditForm.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c1b7e15b89a55dc2dd48b1a039fbbbc19d6387a282df088f0d2d8f4efb92e2a"}},{"ruleId":"D1","level":"warning","message":{"text":"MeshComputeSettingsCard.MeshComputeSettingsCard (cyclomatic 41): MeshComputeSettingsCard.MeshComputeSettingsCard has cyclomatic complexity 41 (threshold 15). Of this number, 31 points are the body\u0027s own statements and 10 belong to 4 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/mesh-compute/ui/MeshComputeSettingsCard.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b68c6ec2af4cb29dd1cbc8d2e092897df9f8e82238a690b5702b3188920a5e3"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowDetailPanel.WorkflowDetailPanel (cyclomatic 41): WorkflowDetailPanel.WorkflowDetailPanel has cyclomatic complexity 41 (threshold 15). Of this number, 30 points are the body\u0027s own statements and 11 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/WorkflowDetailPanel.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"1df5e183bb92f9fc74f0a66b3253849c72da08d37ed23b17e0bb2cbea2b8a0bc"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_media::auth::verify_blossom_auth_event_for_verb (cyclomatic 40): buzz_media::auth::verify_blossom_auth_event_for_verb has cyclomatic complexity 40 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-media/src/auth.rs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a2400c58074ee8f076fb9a5d1a1801909dbf8a3f5c2b2780a8eefc7aa80a04d"}},{"ruleId":"D1","level":"warning","message":{"text":"AdminConsoleStaffingTab.RestrictionsSection (cyclomatic 40): AdminConsoleStaffingTab.RestrictionsSection has cyclomatic complexity 40 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 16 belong to 6 function literals inside it that branch. 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":"desktop/src/features/admin-console/AdminConsoleStaffingTab.tsx"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f68d9ba185b982760bc54a3856efef509505ea4dbe72584a60acf3f4130b284"}},{"ruleId":"D1","level":"warning","message":{"text":"IdentityRecoveryPairing.IdentityRecoveryPairing (cyclomatic 40): IdentityRecoveryPairing.IdentityRecoveryPairing has cyclomatic complexity 40 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 17 belong to 11 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/IdentityRecoveryPairing.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"a94e3f9a3da398070e4652fc1033769ebeb667ed34d8644f839280225e00932c"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::migration::sync_shared_agent_data (cyclomatic 39): buzz_desktop::migration::sync_shared_agent_data has cyclomatic complexity 39 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/migration.rs"},"region":{"startLine":785}}}],"partialFingerprints":{"codehealthFindingId/v1":"31d4aeac7bea4dd2ff794f15a7069d3deb68ddc2b0f51a573b9b3fb485bb3851"}},{"ruleId":"D1","level":"warning","message":{"text":"buildMentionCandidates.buildMentionCandidates (cyclomatic 39): buildMentionCandidates.buildMentionCandidates has cyclomatic complexity 39 (threshold 15). Of this number, 25 points are the body\u0027s own statements and 14 belong to one function literal inside it that branches. 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":"desktop/src/features/messages/lib/buildMentionCandidates.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"50dcc4788df5e1219fe212ce2b6034b245071c699fd11240762a5386323f303b"}},{"ruleId":"D1","level":"warning","message":{"text":"ComposerImageEditor.ComposerImageEditor (cyclomatic 39): ComposerImageEditor.ComposerImageEditor has cyclomatic complexity 39 (threshold 15). Most of this is not in the body itself: 5 of the 39 points are its own statements and the rest belongs to 13 function literals inside it that branch (lines 219, 252, 274, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/ComposerImageEditor.tsx"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"8640f29637baa40b1d19774307ee8f8d120a7aea7bc17a7293e33897fb02cf13"}},{"ruleId":"D1","level":"warning","message":{"text":"ComposerAttachments.MediaAttachmentItem (cyclomatic 39): ComposerAttachments.MediaAttachmentItem has cyclomatic complexity 39 (threshold 15). Of this number, 35 points are the body\u0027s own statements and 4 belong to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/ComposerAttachments.tsx"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a69dfd7c89af9e32d9190485b5c753a0c9ede7c394d7bb6a1b155a203782a56"}},{"ruleId":"D1","level":"warning","message":{"text":"ChannelContextMenu.ChannelContextMenuItems (cyclomatic 39): ChannelContextMenu.ChannelContextMenuItems has cyclomatic complexity 39 (threshold 15). Of this number, 36 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. 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":"desktop/src/features/sidebar/ui/ChannelContextMenu.tsx"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8d3eebb886a1cc0bcb138d30ed46e528d8553b951552ef1d5079a218482bfb2"}},{"ruleId":"D1","level":"warning","message":{"text":"ChannelCombobox.ChannelCombobox (cyclomatic 39): ChannelCombobox.ChannelCombobox has cyclomatic complexity 39 (threshold 15). Of this number, 27 points are the body\u0027s own statements and 12 belong to 5 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/ChannelCombobox.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1497151ecfc223e363731673d20b0c4ff6c23a4010ce320eccd33a3dc779c74"}},{"ruleId":"D1","level":"warning","message":{"text":"Config::from_args (cyclomatic 38): Config::from_args has cyclomatic complexity 38 (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/buzz-acp/src/config.rs"},"region":{"startLine":933}}}],"partialFingerprints":{"codehealthFindingId/v1":"3774fc840157ca9a635087a6c8aa236387740a28ea9976d775fa2d77c879728a"}},{"ruleId":"D1","level":"warning","message":{"text":"RunCtx::run (cyclomatic 38): RunCtx::run has cyclomatic complexity 38 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/agent.rs"},"region":{"startLine":318}}}],"partialFingerprints":{"codehealthFindingId/v1":"228b670a07b89f67572a79cf7bc1ed42da74c17c439422239d34f3fb71587f99"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::handlers::count::handle_count (cyclomatic 38): buzz_relay::handlers::count::handle_count has cyclomatic complexity 38 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/count.rs"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7c58145366cb518faf9c371c5cbeb4dc651bb34ead5b1abf1a05199e80b893f"}},{"ruleId":"D1","level":"warning","message":{"text":"agentConfigControls.AgentModelField (cyclomatic 38): agentConfigControls.AgentModelField has cyclomatic complexity 38 (threshold 15). Of this number, 34 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. 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":"desktop/src/features/agents/ui/agentConfigControls.tsx"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bb07e81dd15e3e96e6f8b246d1bf40976a2888bca6c4409db8199e5a8f3e0c5"}},{"ruleId":"D1","level":"warning","message":{"text":"AgentSessionThreadPanel.AgentSessionThreadPanel (cyclomatic 38): AgentSessionThreadPanel.AgentSessionThreadPanel has cyclomatic complexity 38 (threshold 15). Of this number, 37 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/AgentSessionThreadPanel.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"2830a8821f86d33a8b1f1e1bd48ca652fa956a7ab4dfc05a6b4cc41d5b664073"}},{"ruleId":"D1","level":"warning","message":{"text":"MaskedAvatarBadgeFrame.MaskedAvatarBadgeFrame (cyclomatic 38): MaskedAvatarBadgeFrame.MaskedAvatarBadgeFrame has cyclomatic complexity 38 (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":"desktop/src/features/profile/ui/MaskedAvatarBadgeFrame.tsx"},"region":{"startLine":751}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea428184c3bbd9973d795b6ace8b237efe3395e9fa39a82003f2dde46a687f43"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::handlers::relay_admin::execute_relay_admin_command (cyclomatic 37): buzz_relay::handlers::relay_admin::execute_relay_admin_command 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/buzz-relay/src/handlers/relay_admin.rs"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e26d39eaa56bf6554b201ed956460d93963a5a24314bfa7d91e0da04181fd39"}},{"ruleId":"D1","level":"warning","message":{"text":"AgentRuntimeAvatarControl.AgentRuntimeAvatarControl (cyclomatic 37): AgentRuntimeAvatarControl.AgentRuntimeAvatarControl has cyclomatic complexity 37 (threshold 15). Of this number, 36 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentRuntimeAvatarControl.tsx"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"60dc9ba0f559874b1170309231faa6779b5db8dd1df79f5b839c16382b44733e"}},{"ruleId":"D1","level":"warning","message":{"text":"useObserverEvents.useLoadArchivedObserverEvents (cyclomatic 37): useObserverEvents.useLoadArchivedObserverEvents has cyclomatic complexity 37 (threshold 15). Most of this is not in the body itself: 2 of the 37 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 272, 210, 381, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/useObserverEvents.ts"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e900efd305c3617e4cfa0f01ed9a52a3636e8a68e25ae8ab817132dd3e48d14"}},{"ruleId":"D1","level":"warning","message":{"text":"useAgentManagement.useAgentManagement (cyclomatic 37): useAgentManagement.useAgentManagement has cyclomatic complexity 37 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 17 belong to 8 function literals inside it that branch. 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":"desktop/src/features/agents/useAgentManagement.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"edd10590327265fa6a638cc7a1f44e4ec46a115d0e29ef9298af41b441a4916f"}},{"ruleId":"D1","level":"warning","message":{"text":"AddMemberDialog.DirectAddMemberForm (cyclomatic 37): AddMemberDialog.DirectAddMemberForm has cyclomatic complexity 37 (threshold 15). Of this number, 25 points are the body\u0027s own statements and 12 belong to 5 function literals inside it that branch. 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":"desktop/src/features/community-members/ui/AddMemberDialog.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"53f772812d019dd01636f91ead836f86694cb7dc7c83e0acca88af92ab690827"}},{"ruleId":"D1","level":"warning","message":{"text":"MicControls.MicControls (cyclomatic 37): MicControls.MicControls has cyclomatic complexity 37 (threshold 15). Of this number, 34 points are the body\u0027s own statements and 3 belong to 3 function literals inside it that branch. 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":"desktop/src/features/huddle/components/MicControls.tsx"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"773065a48aa2f4830ee4d702bda8962b5cb29cc7d1c68491cc76b371ea34b181"}},{"ruleId":"D1","level":"warning","message":{"text":"SystemMessageRow.SystemMessageRow (cyclomatic 37): SystemMessageRow.SystemMessageRow has cyclomatic complexity 37 (threshold 15). Of this number, 27 points are the body\u0027s own statements and 10 belong to 7 function literals inside it that branch. 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":"desktop/src/features/messages/ui/SystemMessageRow.tsx"},"region":{"startLine":649}}}],"partialFingerprints":{"codehealthFindingId/v1":"d709b172dfcb7e08f45b57632b668b8af32e94f37f3639ea600cccb79f68a633"}},{"ruleId":"D1","level":"warning","message":{"text":"machineOnboarding.useMachineOnboardingState (cyclomatic 37): machineOnboarding.useMachineOnboardingState has cyclomatic complexity 37 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 14 belong to 7 function literals inside it that branch. 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":"desktop/src/features/onboarding/machineOnboarding.ts"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"097228631d8c1d43d11ada2f707919fafdc95d0de31fe6f8f6152ba2c86e1590"}},{"ruleId":"D1","level":"warning","message":{"text":"SettingsPanels.ThemeSettingsCard (cyclomatic 37): SettingsPanels.ThemeSettingsCard has cyclomatic complexity 37 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 13 belong to 4 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/SettingsPanels.tsx"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"00c573eef277e7eba695aa7291c2898e6fa40ee69424ff67fcdea6ec5ee495b6"}},{"ruleId":"D1","level":"warning","message":{"text":"workflowTriggerDescription.workflowTriggerDescription (cyclomatic 37): workflowTriggerDescription.workflowTriggerDescription 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":"desktop/src/features/workflows/ui/workflowTriggerDescription.ts"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"c07ce7135d1c8e57127b4119d094af8886a5da02ce89db464816b620ed64f029"}},{"ruleId":"D1","level":"warning","message":{"text":"UsageTracker::record (cyclomatic 36): UsageTracker::record has cyclomatic complexity 36 (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/buzz-acp/src/usage.rs"},"region":{"startLine":560}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7b678fd03f8c39254c3c7476ef29ec88f2984d4aa1387e1f69ddbe0e62d8eaa"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_agent::llm::openrouter_post (cyclomatic 36): buzz_agent::llm::openrouter_post has cyclomatic complexity 36 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/llm.rs"},"region":{"startLine":2258}}}],"partialFingerprints":{"codehealthFindingId/v1":"c375b39b014e7c10d38b671852c7f88762f51a067b8352e193eb21314cff45bf"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::migration::pollen::migrate_pollen_agent_name_in_file (cyclomatic 36): buzz_desktop::migration::pollen::migrate_pollen_agent_name_in_file has cyclomatic complexity 36 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/migration/pollen.rs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"23fca6fc792043dcc4349f55c9c0b23333b26c0aa6f051e65dccfadeeacacd2e"}},{"ruleId":"D1","level":"warning","message":{"text":"_HuddleCallAvatar.build (cyclomatic 36): _HuddleCallAvatar.build has cyclomatic complexity 36 (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":"mobile/lib/features/channels/channel_detail_page/huddle_call_avatar.dart"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e68cfe0f0b3477eb532af161e80d1d07b99545af5252d322765fd55b17e9966"}},{"ruleId":"D1","level":"warning","message":{"text":"CommunitySwitcher.CommunitySwitcher (cyclomatic 36): CommunitySwitcher.CommunitySwitcher has cyclomatic complexity 36 (threshold 15). Of this number, 27 points are the body\u0027s own statements and 9 belong to 4 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/communities/ui/CommunitySwitcher.tsx"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a9e42cf484a1a2cf278e88126e3b38fca73b3815e3c0c04fc453880997a7e77"}},{"ruleId":"D1","level":"warning","message":{"text":"DeviceVoiceNotePlayerController._loadPendingRemote (cyclomatic 35): DeviceVoiceNotePlayerController._loadPendingRemote 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":"mobile/lib/features/channels/voice_note_recording.dart"},"region":{"startLine":591}}}],"partialFingerprints":{"codehealthFindingId/v1":"025a54df17fa977dba3b91c63fb2ef96350851b6b72fcd992993248511d3baab"}},{"ruleId":"D1","level":"warning","message":{"text":"TeamDialog.TeamDialog (cyclomatic 35): TeamDialog.TeamDialog has cyclomatic complexity 35 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 13 belong to 8 function literals inside it that branch. 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":"desktop/src/features/agents/ui/TeamDialog.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d6ae993c53427c44626f575e34ecf7685ea041d0f26b7fcd24fd0a58029b45b"}},{"ruleId":"D1","level":"warning","message":{"text":"useCommunityInit.useCommunityInit (cyclomatic 35): useCommunityInit.useCommunityInit has cyclomatic complexity 35 (threshold 15). Most of this is not in the body itself: 1 of the 35 points is its own statement and the rest belongs to one function literal inside it that branches (line 180). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/communities/useCommunityInit.ts"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"2575b3cfa39dccb9ceee592cb11ae8f7af13131c676f0688dccac90bacf3f872"}},{"ruleId":"D1","level":"warning","message":{"text":"CustomEmojiSettingsCard.CustomEmojiSettingsCard (cyclomatic 35): CustomEmojiSettingsCard.CustomEmojiSettingsCard has cyclomatic complexity 35 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 14 belong to 4 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/custom-emoji/ui/CustomEmojiSettingsCard.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9c6120cc89052378fb54aa391c7f2e8bf8979c0e80c01d5f1a50644f59cb56a"}},{"ruleId":"D1","level":"warning","message":{"text":"useNewMessageRecipients.useNewMessageRecipients (cyclomatic 35): useNewMessageRecipients.useNewMessageRecipients has cyclomatic complexity 35 (threshold 15). Most of this is not in the body itself: 10 of the 35 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 122, 101, 235, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useNewMessageRecipients.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"08c16432410f1abdee1c3b9223348374247d43eb95f37bb42a65f21ab58ef256"}},{"ruleId":"D1","level":"warning","message":{"text":"PulseView.PulseView (cyclomatic 35): PulseView.PulseView has cyclomatic complexity 35 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 14 belong to 7 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/pulse/ui/PulseView.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"2095c79d2c930aa7d8c54640e673f77742db83d2144015937e508ff0672ec22f"}},{"ruleId":"D1","level":"warning","message":{"text":"terminalBanner.buildTerminalBanner (cyclomatic 35): terminalBanner.buildTerminalBanner has cyclomatic complexity 35 (threshold 15). Of this number, 27 points are the body\u0027s own statements and 8 belong to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/terminal/terminalBanner.ts"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"72d13df189a7bee889c7544f8a279796127b8ee24e2dbc37dffa63c1f2a84d60"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_agent::databricks_label_grammar::generate_databricks_label (cyclomatic 34): buzz_agent::databricks_label_grammar::generate_databricks_label has cyclomatic complexity 34 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/databricks_label_grammar.rs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"7342f0a32e4f222303220257101d6ba9c83dbec201c4fa2af923ecdbaf28ac3e"}},{"ruleId":"D1","level":"warning","message":{"text":"HuddleControlAcceptor::serve_control_loop (cyclomatic 34): HuddleControlAcceptor::serve_control_loop has cyclomatic complexity 34 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/audio/join.rs"},"region":{"startLine":1156}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ed99e02aa6fdff5d8ec42259fb214a7c68b3ffc192023582c02a3da13c1b685"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::managed_agents::backend::invoke_provider (cyclomatic 34): buzz_desktop::managed_agents::backend::invoke_provider has cyclomatic complexity 34 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/backend.rs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e1979e27567392d267c5107d31292c1a3ddbaeff998a22e33bc3f83197087ae"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::native_relay_client::run_connection (cyclomatic 34): buzz_desktop::native_relay_client::run_connection has cyclomatic complexity 34 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/native_relay_client.rs"},"region":{"startLine":522}}}],"partialFingerprints":{"codehealthFindingId/v1":"7919a5a1d67cbde611c7afab85470edbb1fcd724bbf55bde636244335c8034fa"}},{"ruleId":"D1","level":"warning","message":{"text":"BuzzPushPresentationCacheStore.updateChannels (cyclomatic 34): BuzzPushPresentationCacheStore.updateChannels has cyclomatic complexity 34 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushPresentationCache.swift"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6b5b2b2bc32763ed2e7fecf203e39939ee5aff5e1737ce65ae89873a721f215"}},{"ruleId":"D1","level":"warning","message":{"text":"_NewDirectMessageSheet.build (cyclomatic 34): _NewDirectMessageSheet.build has cyclomatic complexity 34 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channels_page/sheets.dart"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"744900f6f9e55a532f0a4cbb06c4ee0263b311e4f95b7909bc51f461e5a8475d"}},{"ruleId":"D1","level":"warning","message":{"text":"MessageContent._buildLink (cyclomatic 34): MessageContent._buildLink has cyclomatic complexity 34 (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":"mobile/lib/features/channels/message_content.dart"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"45ed09a1d0c32539879df5029ecc4b7709209904b96b4b9f213dd471f90f1a87"}},{"ruleId":"D1","level":"warning","message":{"text":"observedUnreadNativeRig.installNativeRig (cyclomatic 34): observedUnreadNativeRig.installNativeRig has cyclomatic complexity 34 (threshold 15). Most of this is not in the body itself: 2 of the 34 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 217, 186, 323, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/observedUnreadNativeRig.mjs"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"e38a816c460ec5d3f2eb02b3b6057830358983976045f02aa4b880d76f8ca272"}},{"ruleId":"D1","level":"warning","message":{"text":"VoiceSettingsCard.VoiceSettingsCard (cyclomatic 34): VoiceSettingsCard.VoiceSettingsCard has cyclomatic complexity 34 (threshold 15). Most of this is not in the body itself: 14 of the 34 points are its own statements and the rest belongs to 13 function literals inside it that branch (lines 84, 135, 70, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/VoiceSettingsCard.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"791fe11863a28d8751a3bfa6534088157786405d06c18f4a1a2825ca96a2a65f"}},{"ruleId":"D1","level":"warning","message":{"text":"BestiePopover.BestiePopover (cyclomatic 34): BestiePopover.BestiePopover has cyclomatic complexity 34 (threshold 15). Most of this is not in the body itself: 9 of the 34 points are its own statements and the rest belongs to 13 function literals inside it that branch (lines 467, 354, 357, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/protectedFeatures/bestie/BestiePopover.tsx"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd6bd771c7f229ca1d4a2bae5ea23ce32ddfa7a364e3e7e2986659cbf412a987"}},{"ruleId":"D1","level":"warning","message":{"text":"mentionBoundaries.maskMarkdownCode (cyclomatic 34): mentionBoundaries.maskMarkdownCode has cyclomatic complexity 34 (threshold 15). Of this number, 31 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. 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":"desktop/src/shared/lib/mentionBoundaries.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8484c66ae5c60999735cfbfab9714d18de539815caad058402f367a40d440bb"}},{"ruleId":"D1","level":"warning","message":{"text":"entityLink.parseEntityLink (cyclomatic 34): entityLink.parseEntityLink has cyclomatic complexity 34 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/lib/entityLink.ts"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e81e0ddd1c74ea6693f2612ab67273aa2c9128a506969c93a2994aecf6202d7"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_db::store::event::count_events_on (cyclomatic 33): buzz_db::store::event::count_events_on has cyclomatic complexity 33 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/event.rs"},"region":{"startLine":782}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ed541440591181fec579435152c432932d94ee95c7cb1b9be6efc1425bb9bb5"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::managed_agents::restore::restore_managed_agents_on_launch (cyclomatic 33): buzz_desktop::managed_agents::restore::restore_managed_agents_on_launch has cyclomatic complexity 33 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/restore.rs"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"8da524991f2453687abc6ea10fd4c8aee6074236589593d463be09f554c6c97c"}},{"ruleId":"D1","level":"warning","message":{"text":"ChannelActionsSheet.build (cyclomatic 33): ChannelActionsSheet.build has cyclomatic complexity 33 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_actions_sheet.dart"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"d66b1db4b8dbfcd21c3382ffad67de54de61bf1f56eaa271f2c4256acd0c89f4"}},{"ruleId":"D1","level":"warning","message":{"text":"AdminConsoleStaffingTab.StaffingTab (cyclomatic 33): AdminConsoleStaffingTab.StaffingTab has cyclomatic complexity 33 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 14 belong to 5 function literals inside it that branch. 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":"desktop/src/features/admin-console/AdminConsoleStaffingTab.tsx"},"region":{"startLine":471}}}],"partialFingerprints":{"codehealthFindingId/v1":"35bb285dfc6858caf2014ff315ce2b8aa30944333e559a8574a48dcaf68fe752"}},{"ruleId":"D1","level":"warning","message":{"text":"ComposerAttachments.ComposerAttachments (cyclomatic 33): ComposerAttachments.ComposerAttachments has cyclomatic complexity 33 (threshold 15). Most of this is not in the body itself: 10 of the 33 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 750, 635, 875). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/ComposerAttachments.tsx"},"region":{"startLine":591}}}],"partialFingerprints":{"codehealthFindingId/v1":"b93615d655286ddaeb634072a2eff9a745a55e5672ad6b552f2c001303539159"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectRepositoryManagement.ProjectRepositoryManagement (cyclomatic 33): ProjectRepositoryManagement.ProjectRepositoryManagement has cyclomatic complexity 33 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 11 belong to 7 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectRepositoryManagement.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"7158439dd713826059ca9a9ee5cb500f94e08ba15cf1b99fcb4b3a8f40580d3f"}},{"ruleId":"D1","level":"warning","message":{"text":"localStorageSweep.sweepChunked (cyclomatic 33): localStorageSweep.sweepChunked has cyclomatic complexity 33 (threshold 15). Most of this is not in the body itself: 10 of the 33 points are its own statements and the rest belongs to one function literal inside it that branches (line 215). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/lib/localStorageSweep.ts"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d170265ae767c68c73cd84f4303ca0c9846e7eb90222095dd1431a85ac83cd5"}},{"ruleId":"D1","level":"warning","message":{"text":"_SystemMessageRow.build (cyclomatic 32): _SystemMessageRow.build has cyclomatic complexity 32 (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":"mobile/lib/features/channels/channel_detail_page/system_rows.dart"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"c717fac55288eac20e520d6b9927a5d3234118976300e27558c8f0a5efd46163"}},{"ruleId":"D1","level":"warning","message":{"text":"_SliverChannelsList.build (cyclomatic 32): _SliverChannelsList.build has cyclomatic complexity 32 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channels_page/body.dart"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e6573e65be6284d2f9aa877cc46bb3ece50c6c79543865b63622963b7baa79a"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaVideoViewerPage.build (cyclomatic 32): MediaVideoViewerPage.build has cyclomatic complexity 32 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/media_viewer_page/video_viewer.dart"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"b37f857fe64df4ac14cd1c891103d9634f5744da028007af7d9cfae901cf7b68"}},{"ruleId":"D1","level":"warning","message":{"text":"AddTeamToChannelDialog.AddTeamToChannelDialog (cyclomatic 32): AddTeamToChannelDialog.AddTeamToChannelDialog has cyclomatic complexity 32 (threshold 15). Of this number, 27 points are the body\u0027s own statements and 5 belong to 3 function literals inside it that branch. 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":"desktop/src/features/agents/ui/AddTeamToChannelDialog.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"93f7742dd5cc8bd1188be3925dd3ddfbad21a0751fc34c7050606dbe7a2ad318"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelPicker.ModelPicker (cyclomatic 32): ModelPicker.ModelPicker has cyclomatic complexity 32 (threshold 15). Most of this is not in the body itself: 15 of the 32 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 175, 80, 66, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/ModelPicker.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"32d0b01dd244f95a8699c24bb604372c0bfba029ade8582a410c289eed1d6fa3"}},{"ruleId":"D1","level":"warning","message":{"text":"HuddleAttachment.HuddleAttachment (cyclomatic 32): HuddleAttachment.HuddleAttachment has cyclomatic complexity 32 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 9 belong to 5 function literals inside it that branch. 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":"desktop/src/features/huddle/components/HuddleAttachment.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c62aea4bcaeef5df627b26c40cc4ce1095e89dd4d6203f7b3e23251c2b6a026"}},{"ruleId":"D1","level":"warning","message":{"text":"useResolvedLinkPreviews.createMetadataLoader (cyclomatic 32): useResolvedLinkPreviews.createMetadataLoader has cyclomatic complexity 32 (threshold 15). Most of this is not in the body itself: 6 of the 32 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 253, 198, 216, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/lib/useResolvedLinkPreviews.ts"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"59f0dfc08b44cd7fd9af4587f8c7f64c0b4f23b2c8a825f79b76df8c9e81e961"}},{"ruleId":"D1","level":"warning","message":{"text":"nostr-client.queryEvents (cyclomatic 32): nostr-client.queryEvents has cyclomatic complexity 32 (threshold 15). Most of this is not in the body itself: 1 of the 32 points is its own statement and the rest belongs to 6 function literals inside it that branch (lines 80, 55, 47, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/shared/lib/nostr-client.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"496a77de8a8a0dbd294e6043e1c2c55fa8a5298bff67546cdbe7c3e74dbd8559"}},{"ruleId":"D1","level":"warning","message":{"text":"BuzzDevPushEnrollmentDriver.enroll (cyclomatic 31): BuzzDevPushEnrollmentDriver.enroll has cyclomatic complexity 31 (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":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzDevPushEnrollmentDriver.swift"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"4805b60471b96f0c7557112c937eca2bd051f6bf047b9d299fc303459b51c10a"}},{"ruleId":"D1","level":"warning","message":{"text":"_IOSInlinePhotoPicker.build (cyclomatic 31): _IOSInlinePhotoPicker.build has cyclomatic complexity 31 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/compose_bar/ios_photo_picker.dart"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d358813dad41c9bacc08265a3d64940827400e7317d93d517dce896e818303b"}},{"ruleId":"D1","level":"warning","message":{"text":"useChannelUnreadState.useChannelUnreadState (cyclomatic 31): useChannelUnreadState.useChannelUnreadState has cyclomatic complexity 31 (threshold 15). Most of this is not in the body itself: 7 of the 31 points are its own statements and the rest belongs to 14 function literals inside it that branch (lines 454, 238, 275, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/useChannelUnreadState.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e1cf9938f83f66741665aa0d8ca52f7fdcc9df3f5b2ab604018b3be1f23d674"}},{"ruleId":"D1","level":"warning","message":{"text":"DownloadKeyStep.DownloadKeyStep (cyclomatic 31): DownloadKeyStep.DownloadKeyStep has cyclomatic complexity 31 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/DownloadKeyStep.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"9650850146d4e6db5d1f9297665b4f37eea6478399f5f0db92ba4cbe1d0f5a77"}},{"ruleId":"D1","level":"warning","message":{"text":"useAddProjectRepository.addProjectRepository (cyclomatic 31): useAddProjectRepository.addProjectRepository has cyclomatic complexity 31 (threshold 15). Of this number, 30 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/useAddProjectRepository.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f828edd3cd4b386640918ac2ac74ffd32282d618cb902110929cbea28bb55b1"}},{"ruleId":"D1","level":"warning","message":{"text":"relayReconnectReplay.replayLiveSubscriptions (cyclomatic 31): relayReconnectReplay.replayLiveSubscriptions has cyclomatic complexity 31 (threshold 15). Most of this is not in the body itself: 7 of the 31 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 231, 352, 308, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/api/relayReconnectReplay.ts"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"de0e841666caf6075a8799515790090ad5385d74fc2743cecc3748800252e32a"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::api::bridge::count_events_authed (cyclomatic 30): buzz_relay::api::bridge::count_events_authed has cyclomatic complexity 30 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/bridge.rs"},"region":{"startLine":1931}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca690948b1c09973a45cd42e440d92eaaad56b050c2cb7163612440ba7c3310c"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::handlers::auth::handle_auth (cyclomatic 30): buzz_relay::handlers::auth::handle_auth has cyclomatic complexity 30 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/auth.rs"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f752beb508d5355d6b42ca2d157cbaf3a39661a4f4380e87275024f22056016"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::commands::team_snapshot::confirm_team_snapshot_import (cyclomatic 30): buzz_desktop::commands::team_snapshot::confirm_team_snapshot_import has cyclomatic complexity 30 (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":"desktop/src-tauri/src/commands/team_snapshot.rs"},"region":{"startLine":511}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d335af0f9722900c84d9c103a9b887a621f335a2ee5303c01861cb1114f7b78"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::commands::agents::create_managed_agent (cyclomatic 30): buzz_desktop::commands::agents::create_managed_agent has cyclomatic complexity 30 (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":"desktop/src-tauri/src/commands/agents.rs"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"708ffad0f92351ece56b1e2b2a67f66986a74c72ce96941ea199816ff728de41"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::managed_agents::runtime::spawn_agent_child (cyclomatic 30): buzz_desktop::managed_agents::runtime::spawn_agent_child has cyclomatic complexity 30 (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":"desktop/src-tauri/src/managed_agents/runtime.rs"},"region":{"startLine":484}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd1b7717a7d287bb042d307d6389f8da717abe45491f6f3f799d7df52e827107"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::commands::agent_models_update::update_managed_agent (cyclomatic 30): buzz_desktop::commands::agent_models_update::update_managed_agent has cyclomatic complexity 30 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/agent_models_update.rs"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba2fe98c4fc37a009a972e5b1a469ada1328b32a1328d3ed86989bcc66da51d0"}},{"ruleId":"D1","level":"warning","message":{"text":"_InboxRow.build (cyclomatic 30): _InboxRow.build has cyclomatic complexity 30 (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":"mobile/lib/features/activity/activity_page/inbox_row.dart"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ec51a682aa042a73b7df2214f09f515c4480b6153307dde5a4d289eaa38efa7"}},{"ruleId":"D1","level":"warning","message":{"text":"VoiceNoteComposerRecorder.build (cyclomatic 30): VoiceNoteComposerRecorder.build has cyclomatic complexity 30 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/voice_note_composer_recorder.dart"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc241238a18b1159ca6fe5949c4ab56e2bfb5b007368a03bcbf3d89ab593c8be"}},{"ruleId":"D1","level":"warning","message":{"text":"ProfileAvatarCropPage.build (cyclomatic 30): ProfileAvatarCropPage.build has cyclomatic complexity 30 (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":"mobile/lib/features/profile/profile_avatar_crop_page.dart"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e51aaf3666da7da5a0194de2329f4bf016f2881d092b5a3635956cfb73d5c53"}},{"ruleId":"D1","level":"warning","message":{"text":"agentSessionTranscriptHelpers.parseSystemPromptSections (cyclomatic 30): agentSessionTranscriptHelpers.parseSystemPromptSections has cyclomatic complexity 30 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/agentSessionTranscriptHelpers.ts"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c4ffe04dd315e6a6ba52772a7536b0ae1e8dd9f0c297892d99ca869ebb0df9e"}},{"ruleId":"D1","level":"warning","message":{"text":"UserMessageBubble.UserMessageBubble (cyclomatic 30): UserMessageBubble.UserMessageBubble has cyclomatic complexity 30 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 7 belong to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/activityRenderClasses/UserMessageBubble.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"f03f5b34c38965f29e6c9615de29fd7ecc14edcbf2283239fcb10a128cad4c49"}},{"ruleId":"D1","level":"warning","message":{"text":"InviteLinkSection.InviteLinkSection (cyclomatic 30): InviteLinkSection.InviteLinkSection has cyclomatic complexity 30 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 9 belong to 4 function literals inside it that branch. 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":"desktop/src/features/community-members/ui/InviteLinkSection.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"4496796618d9bed99b409216641e4b968f85343784f99158630ca8e4beb76cee"}},{"ruleId":"D1","level":"warning","message":{"text":"useDrafts.draftStatesEqual (cyclomatic 30): useDrafts.draftStatesEqual has cyclomatic complexity 30 (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":"desktop/src/features/messages/lib/useDrafts.ts"},"region":{"startLine":386}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cbaad78bae2983139f254e7cb7ab5a04a70b844c0103c8d55bdf31543bc41ba"}},{"ruleId":"D1","level":"warning","message":{"text":"MessageActionBar.MessageActionBar (cyclomatic 30): MessageActionBar.MessageActionBar has cyclomatic complexity 30 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 6 belong to 4 function literals inside it that branch. 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":"desktop/src/features/messages/ui/MessageActionBar.tsx"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3c60c881ac87254929c10449e8c309c43ed4ff03102a425e2dbc08e58e5de7c"}},{"ruleId":"D1","level":"warning","message":{"text":"hooks.useAppOnboardingState (cyclomatic 30): hooks.useAppOnboardingState has cyclomatic complexity 30 (threshold 15). Most of this is not in the body itself: 13 of the 30 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 521, 574, 623, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/hooks.ts"},"region":{"startLine":466}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1bf3ec5fff691287eb8a283343547fe94ce1053e87a41bf8f6d8d988e346062"}},{"ruleId":"D1","level":"warning","message":{"text":"CreatePullRequestDialog.CreatePullRequestDialog (cyclomatic 30): CreatePullRequestDialog.CreatePullRequestDialog has cyclomatic complexity 30 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 11 belong to 6 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/CreatePullRequestDialog.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0e995cfdccbfbd782964b9589f35baf558eec5e222cd0903df0691f776d5329"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectEntityListRow.ProjectEntityListRow (cyclomatic 30): ProjectEntityListRow.ProjectEntityListRow has cyclomatic complexity 30 (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":"desktop/src/features/projects/ui/ProjectEntityListRow.tsx"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c2751b088b3b63e12710a28390d2b25636f96897e29003a2359e85ee12a6677"}},{"ruleId":"D1","level":"warning","message":{"text":"MergePullRequestButton.MergePullRequestButton (cyclomatic 30): MergePullRequestButton.MergePullRequestButton has cyclomatic complexity 30 (threshold 15). Most of this is not in the body itself: 14 of the 30 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 79, 125, 161, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/MergePullRequestButton.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"29449c6fd6cf059bf4364c8274ff5ea21b43d892d1339f1706a5276db960f954"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectRepositoryPanel.RepositoryFilesPanel (cyclomatic 30): ProjectRepositoryPanel.RepositoryFilesPanel has cyclomatic complexity 30 (threshold 15). Of this number, 29 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectRepositoryPanel.tsx"},"region":{"startLine":614}}}],"partialFingerprints":{"codehealthFindingId/v1":"2feee40cb446c2ffee3fd5dae319e7e76f1379960f23cb092d8411de4fa007e6"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectHomeWorkspaceSheet.ProjectHomeWorkspaceSheet (cyclomatic 30): ProjectHomeWorkspaceSheet.ProjectHomeWorkspaceSheet has cyclomatic complexity 30 (threshold 15). Most of this is not in the body itself: 14 of the 30 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 215, 272, 189, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectHomeWorkspaceSheet.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"32ea1baa13c99f85b170368d8c8d19951644bb3e283d5915ae85aa1117d51878"}},{"ruleId":"D1","level":"warning","message":{"text":"BestieGlobalOverlay.BestieGlobalOverlay (cyclomatic 30): BestieGlobalOverlay.BestieGlobalOverlay has cyclomatic complexity 30 (threshold 15). Most of this is not in the body itself: 8 of the 30 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 94, 140, 85, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/protectedFeatures/bestie/BestieGlobalOverlay.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c981d3c9391b1c599662f3de89cfdee9bf9ac2635c60cf2a5da094216909cbf"}},{"ruleId":"D1","level":"warning","message":{"text":"VideoPlayer.VideoScrubber (cyclomatic 30): VideoPlayer.VideoScrubber has cyclomatic complexity 30 (threshold 15). Most of this is not in the body itself: 9 of the 30 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 442, 398, 418, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/VideoPlayer.tsx"},"region":{"startLine":353}}}],"partialFingerprints":{"codehealthFindingId/v1":"080b15af569f3a84d093a9efd25a9911b55b4ebfd8c918ddca1b03d19ba2b559"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_db::store::replaceable::replace_parameterized_event_in_transaction_impl (cyclomatic 29): buzz_db::store::replaceable::replace_parameterized_event_in_transaction_impl 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/buzz-db/src/store/replaceable.rs"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"4956b0801223c3309a9cda39efde090f0828868cb6d387cb326dada325c13c66"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::reset::run_boot_reset_with_keychain (cyclomatic 29): buzz_desktop::reset::run_boot_reset_with_keychain 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":"desktop/src-tauri/src/reset.rs"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"f807172ab15158465ca500dd565f2e03e7a8308e05e85911b66ab6a838f75198"}},{"ruleId":"D1","level":"warning","message":{"text":"VoiceNoteAttachment.build (cyclomatic 29): VoiceNoteAttachment.build has cyclomatic complexity 29 (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":"mobile/lib/features/channels/voice_note_attachment.dart"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"c789f243860b53f01dfb4d6ea20fc3b50a4f206a30fed4d8f2bf8a9236f8ac79"}},{"ruleId":"D1","level":"warning","message":{"text":"IosGlassNavigationButton.build (cyclomatic 29): IosGlassNavigationButton.build 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":"mobile/lib/shared/widgets/ios_glass_navigation_button.dart"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d75612bbbfd6ea68340123cc360615717cfc7dd78a1d21a28ec8dd04dc8e8dc"}},{"ruleId":"D1","level":"warning","message":{"text":"PersonaShareRecipients.PersonaShareRecipients (cyclomatic 29): PersonaShareRecipients.PersonaShareRecipients has cyclomatic complexity 29 (threshold 15). Most of this is not in the body itself: 13 of the 29 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 187, 72, 236, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/PersonaShareRecipients.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"95b466d4f99c30c03b2edf83956ad1e3aeede42bfc8c87a48264352fb4dd26b0"}},{"ruleId":"D1","level":"warning","message":{"text":"useForumMentionPreparation.useForumMentionPreparation (cyclomatic 29): useForumMentionPreparation.useForumMentionPreparation has cyclomatic complexity 29 (threshold 15). Most of this is not in the body itself: 1 of the 29 points is its own statement and the rest belongs to 6 function literals inside it that branch (lines 121, 60, 63, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/forum/ui/useForumMentionPreparation.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbc7b006f96880867d783c352f30c65e21db844ac0fa2fe5c6b3f8fc1c05ade7"}},{"ruleId":"D1","level":"warning","message":{"text":"hooks.useChannelSubscription (cyclomatic 29): hooks.useChannelSubscription has cyclomatic complexity 29 (threshold 15). Most of this is not in the body itself: 1 of the 29 points is its own statement and the rest belongs to 10 function literals inside it that branch (lines 327, 399, 407, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/hooks.ts"},"region":{"startLine":318}}}],"partialFingerprints":{"codehealthFindingId/v1":"b67e00017006861e63ecd69e71e080371e6574367ffb2407ea12c33190a8a58f"}},{"ruleId":"D1","level":"warning","message":{"text":"useLinkEditor.useLinkEditor (cyclomatic 29): useLinkEditor.useLinkEditor has cyclomatic complexity 29 (threshold 15). Most of this is not in the body itself: 5 of the 29 points are its own statements and the rest belongs to 16 function literals inside it that branch (lines 80, 179, 243, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useLinkEditor.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"461cb2b6e7902de55fb29b463531e5d89f61f278722079116acb82479940dd2b"}},{"ruleId":"D1","level":"warning","message":{"text":"FormattingToolbar.FormattingToolbar (cyclomatic 29): FormattingToolbar.FormattingToolbar has cyclomatic complexity 29 (threshold 15). Most of this is not in the body itself: 3 of the 29 points are its own statements and the rest belongs to 12 function literals inside it that branch (lines 231, 165, 155, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/FormattingToolbar.tsx"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"3789fa0b57903b5aa59819e28ab4a5d1aca4788be26efb46c4567a6458768b61"}},{"ruleId":"D1","level":"warning","message":{"text":"SetupStep.SetupStepContent (cyclomatic 29): SetupStep.SetupStepContent has cyclomatic complexity 29 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 10 belong to 4 function literals inside it that branch. 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":"desktop/src/features/onboarding/ui/SetupStep.tsx"},"region":{"startLine":963}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e09bec5827f36800b6c5b3a195cec90a55075704ee199bedd5dfc0b95c6ec9e"}},{"ruleId":"D1","level":"warning","message":{"text":"ProfileAvatar.ProfileAvatar (cyclomatic 29): ProfileAvatar.ProfileAvatar has cyclomatic complexity 29 (threshold 15). Of this number, 26 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/ProfileAvatar.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"fffc9e306117b821dbcc9b41d586e47dd684619838e77084d07410b227436667"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectsAgentPromptPage.ProjectsAgentPromptPage (cyclomatic 29): ProjectsAgentPromptPage.ProjectsAgentPromptPage has cyclomatic complexity 29 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 13 belong to 5 function literals inside it that branch. 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":"desktop/src/features/projects/ui/ProjectsAgentPromptPage.tsx"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"51b0bdd6cea486d4c88566c6cf8aeab577a95cd787af4f663150e3a160aed95b"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectAgentChatPanel.ProjectAgentChatPanel (cyclomatic 29): ProjectAgentChatPanel.ProjectAgentChatPanel has cyclomatic complexity 29 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 12 belong to 2 function literals inside it that branch. 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":"desktop/src/features/projects/ui/ProjectAgentChatPanel.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"b97ca158c5aa5c15bc0d6ddfcf674b3521e24bfd6a62fbcdc4bb28b886e11aa0"}},{"ruleId":"D1","level":"warning","message":{"text":"LaneReconciler.runAttempt (cyclomatic 29): LaneReconciler.runAttempt has cyclomatic complexity 29 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 6 belong to 2 function literals inside it that branch. 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":"desktop/src/features/sidebar/lib/sidebarLaneReconciler.ts"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"25855541767afae66773e3f1b15354014c9a1e861d41d0f8957cfa202c5ea5cb"}},{"ruleId":"D1","level":"warning","message":{"text":"SidebarSection.ChannelMenuButton (cyclomatic 29): SidebarSection.ChannelMenuButton has cyclomatic complexity 29 (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":"desktop/src/features/sidebar/ui/SidebarSection.tsx"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"da1a6c7b6515effe831b146f6b62eb07ebf5e6ced5ec72e39352e921f1baf872"}},{"ruleId":"D1","level":"warning","message":{"text":"CodeBlock.SyntaxHighlightedCode (cyclomatic 29): CodeBlock.SyntaxHighlightedCode has cyclomatic complexity 29 (threshold 15). Most of this is not in the body itself: 2 of the 29 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 150, 190, 235, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/markdown/CodeBlock.tsx"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"c717360a87498bd924453ef3da88c22705d60083ed98ead24050b626fe34ad6c"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_agent::model_capabilities::resolve (cyclomatic 28): buzz_agent::model_capabilities::resolve 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/buzz-agent/src/model_capabilities.rs"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"54cea2bd891d57787835f7f37e53069150fd02ec36981e88787a068dfdb130bc"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_agent::llm::post (cyclomatic 28): buzz_agent::llm::post 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/buzz-agent/src/llm.rs"},"region":{"startLine":1862}}}],"partialFingerprints":{"codehealthFindingId/v1":"fadbe90af795b93688dfe182d0f03b23a2d2c86177cc10ff93099b5b80b34e10"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::handlers::ingest::validate_project_envelope (cyclomatic 28): buzz_relay::handlers::ingest::validate_project_envelope 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/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":1681}}}],"partialFingerprints":{"codehealthFindingId/v1":"d095ed53a944e36bea7903472448028bf15464d6b513d36a6461b175dd64a6de"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::handlers::req::handle_search_req (cyclomatic 28): buzz_relay::handlers::req::handle_search_req 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/buzz-relay/src/handlers/req.rs"},"region":{"startLine":598}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a2a26ed7da7df633eb065aba01179d26900a90562f570588998ab06729cd5ec"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::emit_db_usage_metrics (cyclomatic 28): buzz_relay::emit_db_usage_metrics 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/buzz-relay/src/main.rs"},"region":{"startLine":1949}}}],"partialFingerprints":{"codehealthFindingId/v1":"cae38c0d10e51799cd5db24944595d386fec5705c52ca4baefa29bd7082e8d75"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::push_runtime::deliver_one (cyclomatic 28): buzz_relay::push_runtime::deliver_one has cyclomatic complexity 28 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/push_runtime.rs"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"76e6667da3cbd34414418e4d8253ec1d49fa19918e926018936f391be9efb895"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::huddle::pipeline::check_pipeline_hotstart (cyclomatic 28): buzz_desktop::huddle::pipeline::check_pipeline_hotstart 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":"desktop/src-tauri/src/huddle/pipeline.rs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a7f44c41b1e171d564b6fe52cea0c24afdda24822b90126fe3d8f84f026239c"}},{"ruleId":"D1","level":"warning","message":{"text":"AddChannelMembersSheet.build (cyclomatic 28): AddChannelMembersSheet.build 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":"mobile/lib/features/channels/add_members_sheet.dart"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"0531bd2ec4dc4e39daa4d5cf026740d3afe1b320055ec3ddb77765c7dde949d3"}},{"ruleId":"D1","level":"warning","message":{"text":"_HuddleJoinSurface.build (cyclomatic 28): _HuddleJoinSurface.build has cyclomatic complexity 28 (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":"mobile/lib/features/channels/channel_detail_page/huddle_sheet.dart"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"e121c9514fd95aed63c559a01bd82cea9b3397aad17c680b2cfb6bb7af6f7e37"}},{"ruleId":"D1","level":"warning","message":{"text":"ManageChannelSheet.build (cyclomatic 28): ManageChannelSheet.build 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":"mobile/lib/features/channels/manage_channel_sheet.dart"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cf9df3b6429771e4ad5328dd4efb22419905a9cb95452ea1f3e7e9bfb00a1d3"}},{"ruleId":"D1","level":"warning","message":{"text":"PairingNotifier._continueAfterSas (cyclomatic 28): PairingNotifier._continueAfterSas 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":"mobile/lib/features/pairing/pairing_provider.dart"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"424a8761620268e3cf86e723a5173c48afa76274368c864de5300e794062a5d6"}},{"ruleId":"D1","level":"warning","message":{"text":"ChannelRouteScreen.ChannelRouteScreen (cyclomatic 28): ChannelRouteScreen.ChannelRouteScreen has cyclomatic complexity 28 (threshold 15). Most of this is not in the body itself: 11 of the 28 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 177, 230, 164, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/app/routes/ChannelRouteScreen.tsx"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"1711af4d278670036fdab8ee431bc525997bd12509811db3bec5c94adf60b11f"}},{"ruleId":"D1","level":"warning","message":{"text":"AddAgentToChannelDialog.AddAgentToChannelDialog (cyclomatic 28): AddAgentToChannelDialog.AddAgentToChannelDialog has cyclomatic complexity 28 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 6 belong to 3 function literals inside it that branch. 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":"desktop/src/features/agents/ui/AddAgentToChannelDialog.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf186d9cd9aa420d6a172727d9c5e53aa9d912bbdb9997fe6bb70b9b0a818c83"}},{"ruleId":"D1","level":"warning","message":{"text":"useTeamActions.useTeamActions (cyclomatic 28): useTeamActions.useTeamActions has cyclomatic complexity 28 (threshold 15). Of this number, 25 points are the body\u0027s own statements and 3 belong to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/useTeamActions.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9415ccea64a21bac425b253178e0b0f069cd73e75d70db6542d14197f5bc375"}},{"ruleId":"D1","level":"warning","message":{"text":"ChannelMemberInviteCard.ChannelMemberInviteCard (cyclomatic 28): ChannelMemberInviteCard.ChannelMemberInviteCard has cyclomatic complexity 28 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 12 belong to 7 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/ChannelMemberInviteCard.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"1678ea69cc74028c355ecdee312bd832764881b27aa72853251ce35306c2897a"}},{"ruleId":"D1","level":"warning","message":{"text":"MembersSidebarMemberCard.MembersSidebarMemberCard (cyclomatic 28): MembersSidebarMemberCard.MembersSidebarMemberCard 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":"desktop/src/features/channels/ui/MembersSidebarMemberCard.tsx"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf8915b20cee5fddf69aa88a42919ddf041fafb13cd3a052f186c14ec423ca8a"}},{"ruleId":"D1","level":"warning","message":{"text":"InboxMessageRow.InboxMessageRow (cyclomatic 28): InboxMessageRow.InboxMessageRow has cyclomatic complexity 28 (threshold 15). Of this number, 25 points are the body\u0027s own statements and 3 belong to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/ui/InboxMessageRow.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"f54a93ec8fdf4d453e9cbd16406efd173733f57b5b72c6c08589ef8a4de0210c"}},{"ruleId":"D1","level":"warning","message":{"text":"MessageActionBar.MoreActionsMenu (cyclomatic 28): MessageActionBar.MoreActionsMenu has cyclomatic complexity 28 (threshold 15). Of this number, 25 points are the body\u0027s own statements and 3 belong to 3 function literals inside it that branch. 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":"desktop/src/features/messages/ui/MessageActionBar.tsx"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8f0a77cc870c551ef934f0ffb7dfb74eb771ffaaced7387d32983c622cdb8f8"}},{"ruleId":"D1","level":"warning","message":{"text":"SetupStep.RuntimeCard (cyclomatic 28): SetupStep.RuntimeCard has cyclomatic complexity 28 (threshold 15). Of this number, 26 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/SetupStep.tsx"},"region":{"startLine":420}}}],"partialFingerprints":{"codehealthFindingId/v1":"9565b8a54ac2f96ac3b0568a669267794b85f531a840b1ff399ae9386ce0a51b"}},{"ruleId":"D1","level":"warning","message":{"text":"useProfileInteractionActions.useProfileInteractionActions (cyclomatic 28): useProfileInteractionActions.useProfileInteractionActions has cyclomatic complexity 28 (threshold 15). Most of this is not in the body itself: 8 of the 28 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 117, 195, 164, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/useProfileInteractionActions.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5b753abf971481bf63c8fc38c30e5d712ef220e4ef1450c1d98450ff4a87b49"}},{"ruleId":"D1","level":"warning","message":{"text":"useProjectSidebarMembership.useProjectSidebarMembership (cyclomatic 28): useProjectSidebarMembership.useProjectSidebarMembership has cyclomatic complexity 28 (threshold 15). Most of this is not in the body itself: 1 of the 28 points is its own statement and the rest belongs to 13 function literals inside it that branch (lines 90, 157, 33, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/lib/useProjectSidebarMembership.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"5805b7964501a535b734fa2d2fe34ad5cbdc5224d6b89edc28235ebe5258d451"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectChannelHome.ProjectChannelHome (cyclomatic 28): ProjectChannelHome.ProjectChannelHome has cyclomatic complexity 28 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 7 belong to 6 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectChannelHome.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"fadfc6561a68b8ab0deb23bdc9dca791bd81ba39c303c715350d806485b3cd5f"}},{"ruleId":"D1","level":"warning","message":{"text":"HarnessRow.HarnessRow (cyclomatic 28): HarnessRow.HarnessRow has cyclomatic complexity 28 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 6 belong to 5 function literals inside it that branch. 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":"desktop/src/features/settings/ui/HarnessRow.tsx"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab43f21ccc4bf5132a6d272adb79ac487e7823a3df4db5fd0dd60a8b1bf49bcc"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_acp::queue::format_context_hints (cyclomatic 27): buzz_acp::queue::format_context_hints 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/buzz-acp/src/queue.rs"},"region":{"startLine":1606}}}],"partialFingerprints":{"codehealthFindingId/v1":"2892a4277343f43cb9fae799f976d440aba19bec63f008b07ead5f291cd5cf70"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_core::network::is_not_global_unicast (cyclomatic 27): buzz_core::network::is_not_global_unicast has cyclomatic complexity 27 (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/buzz-core/src/network.rs"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"45de2183cf4f030e972e605856fa5ec5f682a0fa0c57eb4524665bb437063157"}},{"ruleId":"D1","level":"warning","message":{"text":"GitStore::run_conformance_probe (cyclomatic 27): GitStore::run_conformance_probe has cyclomatic complexity 27 (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/buzz-relay/src/api/git/store.rs"},"region":{"startLine":576}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f9758788d287080619b214a8c988d8fe370d23fb9fdc4c95f11013d98ecc78f"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_voice::imported::decode_wav (cyclomatic 27): buzz_voice::imported::decode_wav 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/buzz-voice/src/imported.rs"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"77b77237af21b95cb3d3de62de500e995abd422c5e48fe04ccf53224ae2e39d7"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::commands::pairing::pairing_ws_task_inner (cyclomatic 27): buzz_desktop::commands::pairing::pairing_ws_task_inner 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":"desktop/src-tauri/src/commands/pairing.rs"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"e93d26596951d4e95b5f4902d003e36b8d9b6e12ecada6c8a529ad77dca57785"}},{"ruleId":"D1","level":"warning","message":{"text":"BuzzPushNotificationResolver.refreshPresentation (cyclomatic 27): BuzzPushNotificationResolver.refreshPresentation has cyclomatic complexity 27 (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":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushNotificationResolver.swift"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"05b1a44908cdaf58f27b8f33754b76b4868da5ca5f534accb8ede9688d427ee2"}},{"ruleId":"D1","level":"warning","message":{"text":"_MessageBubble.build (cyclomatic 27): _MessageBubble.build has cyclomatic complexity 27 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_detail_page/message_bubble.dart"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"635ac81f1e46dd217afd783a28d1557ca64a389790d710b28c1f31f9fb6d6104"}},{"ruleId":"D1","level":"warning","message":{"text":"_RecentPhotoGalleryPicker.build (cyclomatic 27): _RecentPhotoGalleryPicker.build 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":"mobile/lib/features/channels/compose_bar/photo_gallery_picker.dart"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"f294c27af84f5ebf2fb3b23c1150a2969c09baaedaf15613b5c62fc0233473d1"}},{"ruleId":"D1","level":"warning","message":{"text":"useAppShellKeyboardShortcuts.useAppShellKeyboardShortcuts (cyclomatic 27): useAppShellKeyboardShortcuts.useAppShellKeyboardShortcuts has cyclomatic complexity 27 (threshold 15). Most of this is not in the body itself: 1 of the 27 points is its own statement and the rest belongs to one function literal inside it that branches (line 32). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/app/useAppShellKeyboardShortcuts.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"df0d334cb0c3d5e1c4390b78cac87ce6a501e4b319903d4c8444a4020d7da1f1"}},{"ruleId":"D1","level":"warning","message":{"text":"modelCapabilities.resolveModelCapabilities (cyclomatic 27): modelCapabilities.resolveModelCapabilities 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":"desktop/src/features/agents/ui/modelCapabilities.ts"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"278644f8ce81906835c2c0cebaea89f5acc24019123abc7090380bb1e5ce2d20"}},{"ruleId":"D1","level":"warning","message":{"text":"usePersonaModelDiscovery.usePersonaModelDiscovery (cyclomatic 27): usePersonaModelDiscovery.usePersonaModelDiscovery has cyclomatic complexity 27 (threshold 15). Most of this is not in the body itself: 13 of the 27 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 248, 229, 304, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/usePersonaModelDiscovery.ts"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"52be48d45a3ff3471c43b65c29192078e8ccd4a7530dbf32e90cfad4bce8bee5"}},{"ruleId":"D1","level":"warning","message":{"text":"CompactMessageSummary.CompactMessageSummary (cyclomatic 27): CompactMessageSummary.CompactMessageSummary has cyclomatic complexity 27 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 6 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentSessionToolItem/CompactMessageSummary.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"2681c5240692296d0d1a86e8a1e59ba0e46a9b6006430dc266fec4b2cc388efb"}},{"ruleId":"D1","level":"warning","message":{"text":"useMembersSidebarActions.useMembersSidebarActions (cyclomatic 27): useMembersSidebarActions.useMembersSidebarActions has cyclomatic complexity 27 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 3 belong to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/useMembersSidebarActions.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"db4ce7011e89619c38083522d0598788ba93f23611f92bfecadba397df4800bc"}},{"ruleId":"D1","level":"warning","message":{"text":"AnimatedAvatarControls.AvatarFramingSlider (cyclomatic 27): AnimatedAvatarControls.AvatarFramingSlider has cyclomatic complexity 27 (threshold 15). Most of this is not in the body itself: 11 of the 27 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 186, 125, 145, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/AnimatedAvatarControls.tsx"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"7db413b06e3eb16c7819bcf82d16ecb4fb611ca3954eb2730c6788b2e99015a5"}},{"ruleId":"D1","level":"warning","message":{"text":"UserProfilePanelTabs.ProfileRuntimeTabContent (cyclomatic 27): UserProfilePanelTabs.ProfileRuntimeTabContent has cyclomatic complexity 27 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/UserProfilePanelTabs.tsx"},"region":{"startLine":713}}}],"partialFingerprints":{"codehealthFindingId/v1":"1156787edc71c5e1ea68be0c27c04ca23f9e1644a139308e1f99c8c809a35ce3"}},{"ruleId":"D1","level":"warning","message":{"text":"useSidebarRelayConnectionCard.useSidebarRelayConnectionCard (cyclomatic 27): useSidebarRelayConnectionCard.useSidebarRelayConnectionCard has cyclomatic complexity 27 (threshold 15). Most of this is not in the body itself: 13 of the 27 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 115, 157, 185, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/useSidebarRelayConnectionCard.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"be91bc2e43e776ba0440f16e07e426fd3610c44ca40a51952fc8c5043dc44c17"}},{"ruleId":"D1","level":"warning","message":{"text":"CommunityThemeController.CommunityThemeController (cyclomatic 27): CommunityThemeController.CommunityThemeController has cyclomatic complexity 27 (threshold 15). Most of this is not in the body itself: 1 of the 27 points is its own statement and the rest belongs to 8 function literals inside it that branch (lines 189, 96, 115, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/theme/CommunityThemeController.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"b69e57be4bc0ddc16671c70a4234d292750ef2d7ca25be5615a69920f0a50e9e"}},{"ruleId":"D1","level":"warning","message":{"text":"SubscriptionRegistry::remove_from_index (cyclomatic 26): SubscriptionRegistry::remove_from_index has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/subscription.rs"},"region":{"startLine":564}}}],"partialFingerprints":{"codehealthFindingId/v1":"428aab95a0e7591c27d041ff6a444591fda9e460e801f234bc8831bdf4aea2bf"}},{"ruleId":"D1","level":"warning","message":{"text":"_InlineCameraPreview.build (cyclomatic 26): _InlineCameraPreview.build has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/compose_bar/camera_preview.dart"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"45018fa03a4b5eb7ed3ff32c2489528c917632c0feeddab2842593b2ee39504e"}},{"ruleId":"D1","level":"warning","message":{"text":"_ThreadMessage.build (cyclomatic 26): _ThreadMessage.build has cyclomatic complexity 26 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/thread_detail_page/thread_message.dart"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"2afdf37d4812a81f1f3817363843aee7a65ba3fb7490a18bc2e776f90c50f9e0"}},{"ruleId":"D1","level":"warning","message":{"text":"PersonaModelCombobox.PersonaModelCombobox (cyclomatic 26): PersonaModelCombobox.PersonaModelCombobox has cyclomatic complexity 26 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 11 belong to 5 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/PersonaModelCombobox.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a0d69ef1de100204e3ab40bed992a4656c8791579082e2a50363781c72092a2"}},{"ruleId":"D1","level":"warning","message":{"text":"MembersSidebarMemberCard.MemberActionsMenu (cyclomatic 26): MembersSidebarMemberCard.MemberActionsMenu has cyclomatic complexity 26 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/MembersSidebarMemberCard.tsx"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"048aa2fcf73a345ddfc6a8daa15969117e70e88b1ad0c54516031ce725f042e8"}},{"ruleId":"D1","level":"warning","message":{"text":"WelcomeSetup.WelcomeSetup (cyclomatic 26): WelcomeSetup.WelcomeSetup has cyclomatic complexity 26 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 4 belong to 4 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/communities/ui/WelcomeSetup.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"13c70820f1d1b784d7fc4274d49b0ffe812e9b112c3d31671b50c6675b33f10d"}},{"ruleId":"D1","level":"warning","message":{"text":"homePaneLayout.getHomePaneLayout (cyclomatic 26): homePaneLayout.getHomePaneLayout has cyclomatic complexity 26 (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":"desktop/src/features/home/lib/homePaneLayout.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f55f5d121cd7816a62971250ff90d4dd79e068b42d99a362dca3b9d4545cd51"}},{"ruleId":"D1","level":"warning","message":{"text":"ParticipantList.HuddleParticipantsControl (cyclomatic 26): ParticipantList.HuddleParticipantsControl has cyclomatic complexity 26 (threshold 15). Most of this is not in the body itself: 8 of the 26 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 310, 257, 154, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/components/ParticipantList.tsx"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7836123ac7241d656d409fcd504f605d2fd2ed5cf2bae51049dee08069849ce"}},{"ruleId":"D1","level":"warning","message":{"text":"hooks.useSendMessageMutation (cyclomatic 26): hooks.useSendMessageMutation has cyclomatic complexity 26 (threshold 15). Most of this is not in the body itself: 1 of the 26 points is its own statement and the rest belongs to 5 function literals inside it that branch (lines 499, 657, 584, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/hooks.ts"},"region":{"startLine":476}}}],"partialFingerprints":{"codehealthFindingId/v1":"8912fc4fe28447bebd34b5575d42da11d51c4d11c687862715393b927dfe47d8"}},{"ruleId":"D1","level":"warning","message":{"text":"agentSnapshotClipboard.parseSnapshotClipboardHtml (cyclomatic 26): agentSnapshotClipboard.parseSnapshotClipboardHtml has cyclomatic complexity 26 (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":"desktop/src/features/messages/lib/agentSnapshotClipboard.ts"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2b48fb7c350dc36dfacd1911aecc9e028739939e1e0414e833380200529109b"}},{"ruleId":"D1","level":"warning","message":{"text":"HarnessCatalogDialog.HarnessCatalogDialog (cyclomatic 26): HarnessCatalogDialog.HarnessCatalogDialog has cyclomatic complexity 26 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 5 belong to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/HarnessCatalogDialog.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd135f5f89cecdd15a073881973d84c4d9df22d26fcf0af4f4b07660e7b9fb92"}},{"ruleId":"D1","level":"warning","message":{"text":"ChannelTemplatesSettingsCard.TemplateFormDialog (cyclomatic 26): ChannelTemplatesSettingsCard.TemplateFormDialog has cyclomatic complexity 26 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 12 belong to 7 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/ChannelTemplatesSettingsCard.tsx"},"region":{"startLine":291}}}],"partialFingerprints":{"codehealthFindingId/v1":"de39b59c03dd9c4753fc18f0b2e37e2c0f6fec13e0efedfff7ad6e9c4b6df3b4"}},{"ruleId":"D1","level":"warning","message":{"text":"useChannelMutes.useChannelMutes (cyclomatic 26): useChannelMutes.useChannelMutes has cyclomatic complexity 26 (threshold 15). Most of this is not in the body itself: 2 of the 26 points are its own statements and the rest belongs to 15 function literals inside it that branch (lines 77, 142, 41, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/lib/useChannelMutes.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"d392cab5bdea7ba53221cfb04ebe9a15ad4f656fe54a6204a437a100c2d8d257"}},{"ruleId":"D1","level":"warning","message":{"text":"useChannelStars.useChannelStars (cyclomatic 26): useChannelStars.useChannelStars has cyclomatic complexity 26 (threshold 15). Most of this is not in the body itself: 2 of the 26 points are its own statements and the rest belongs to 15 function literals inside it that branch (lines 77, 142, 41, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/lib/useChannelStars.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec1587856faae288cba86dd432512bf317a94e79352bd8412c9fea369d5b60ff"}},{"ruleId":"D1","level":"warning","message":{"text":"workflowFormTypes.actionFieldsForStep (cyclomatic 26): workflowFormTypes.actionFieldsForStep has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/workflowFormTypes.ts"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"b848d5284f5aa0e0c367d252e0ec6d114a5c1f5ea6cae1090da2c2e5b6d8c66a"}},{"ruleId":"D1","level":"warning","message":{"text":"RelayClient.handleWsMessage (cyclomatic 26): RelayClient.handleWsMessage has cyclomatic complexity 26 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/api/relayClientSession.ts"},"region":{"startLine":867}}}],"partialFingerprints":{"codehealthFindingId/v1":"2302a1fb22554991f1844c6ce85796bb375eb8d4fff3fc055ae06614e647a370"}},{"ruleId":"D1","level":"warning","message":{"text":"useResolvedLinkPreviews.useResolvedLinkPreviews (cyclomatic 26): useResolvedLinkPreviews.useResolvedLinkPreviews has cyclomatic complexity 26 (threshold 15). Most of this is not in the body itself: 1 of the 26 points is its own statement and the rest belongs to 9 function literals inside it that branch (lines 695, 756, 771, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/lib/useResolvedLinkPreviews.ts"},"region":{"startLine":646}}}],"partialFingerprints":{"codehealthFindingId/v1":"65dca2854d8bd8af7128a9db44f67943cbfc219cc8b2c84b3ed0e9d232f697b8"}},{"ruleId":"D1","level":"warning","message":{"text":"RepoBlobViewer.RepoBlobPage (cyclomatic 26): RepoBlobViewer.RepoBlobPage has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/features/repos/ui/RepoBlobViewer.tsx"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"034d30bb2d29914887b9852185863b380cd6cba9bb99e14bdf232d84e51235b3"}},{"ruleId":"D1","level":"warning","message":{"text":"eventToProjectPullRequest (cyclomatic 26): eventToProjectPullRequest has cyclomatic complexity 26 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 9 belong to 2 function literals inside it that branch. 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":"desktop/src/features/projects/projectPullRequests.mjs"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"aec2333d778e7df625b1f1690015b0016a6445e1a860a525f8f149ad5227dd9d"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::handlers::imeta::verify_imeta_blobs (cyclomatic 25): buzz_relay::handlers::imeta::verify_imeta_blobs 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/buzz-relay/src/handlers/imeta.rs"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"13ee8ca3c0429de79ad9aaa691c0ddaacb3ea6e860790087b35d42acc6197d36"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::huddle::start_huddle (cyclomatic 25): buzz_desktop::huddle::start_huddle 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":"desktop/src-tauri/src/huddle/mod.rs"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"a79457ea777a5bbe8ef5672c65423d4dc8f20f84b425f25653a6047a0008f0e4"}},{"ruleId":"D1","level":"warning","message":{"text":"desktop_release.validate (cyclomatic 25): desktop_release.validate has cyclomatic complexity 25 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/desktop_release.py"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"3340da7129e976805d36a0dd01d700071acdd8833b87bacf6644f8238fc99d80"}},{"ruleId":"D1","level":"warning","message":{"text":"ActivityNotifier._fetch (cyclomatic 25): ActivityNotifier._fetch 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":"mobile/lib/features/activity/activity_provider.dart"},"region":{"startLine":443}}}],"partialFingerprints":{"codehealthFindingId/v1":"910f4a1f275e03581a7fe0c4d4b190a3b4527cf377182b1d919b0603364da024"}},{"ruleId":"D1","level":"warning","message":{"text":"FrostedAppBar.build (cyclomatic 25): FrostedAppBar.build has cyclomatic complexity 25 (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":"mobile/lib/shared/widgets/frosted_app_bar.dart"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbc331758d4a201dbb2dc3676afff9fd91c52327e280e95b53cde6b366347443"}},{"ruleId":"D1","level":"warning","message":{"text":"useAppNavigation.useAppNavigation (cyclomatic 25): useAppNavigation.useAppNavigation has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 1 of the 25 points is its own statement and the rest belongs to 8 function literals inside it that branch (lines 131, 264, 31, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/app/navigation/useAppNavigation.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"57fb912dc8bad2e5e0be8324b577321725c975e5cd8b87d2a7136fa7ac105b98"}},{"ruleId":"D1","level":"warning","message":{"text":"agentManagement.parseAgentManagementRequest (cyclomatic 25): agentManagement.parseAgentManagementRequest has cyclomatic complexity 25 (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":"desktop/src/features/agents/agentManagement.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d46959964c88ecd851b5b4d6d22dbe4361c57e2541dfe76d1d7fac17c07bf01"}},{"ruleId":"D1","level":"warning","message":{"text":"EnvVarsEditor.EnvVarsEditor (cyclomatic 25): EnvVarsEditor.EnvVarsEditor has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 6 of the 25 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 288, 545, 258, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/EnvVarsEditor.tsx"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1b46fc47715253ba95ee10ce92a749423d6963cb23ce0d17b2709f914d7f85d"}},{"ruleId":"D1","level":"warning","message":{"text":"agentConfigControls.AgentDropdownSelect (cyclomatic 25): agentConfigControls.AgentDropdownSelect has cyclomatic complexity 25 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 10 belong to 4 function literals inside it that branch. 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":"desktop/src/features/agents/ui/agentConfigControls.tsx"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea981afe813fee90cde4e37666f8605ead27dc513cfdb72edd3cd761224949bd"}},{"ruleId":"D1","level":"warning","message":{"text":"AddChannelBotDialog.AddChannelBotDialog (cyclomatic 25): AddChannelBotDialog.AddChannelBotDialog has cyclomatic complexity 25 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. 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":"desktop/src/features/channels/ui/AddChannelBotDialog.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ee23290c10426896e32f7dcfc74c0acab6bd990b53361494f22d78c83690cb8"}},{"ruleId":"D1","level":"warning","message":{"text":"CanvasHistoryPanel.CanvasHistoryPanel (cyclomatic 25): CanvasHistoryPanel.CanvasHistoryPanel has cyclomatic complexity 25 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 12 belong to 5 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/CanvasHistoryPanel.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b2840f315548156c4d5fb47ebd3d126ee46a6adbfdc64e71cb7f1cc8426a851"}},{"ruleId":"D1","level":"warning","message":{"text":"ChannelScreenHeader.ChannelScreenHeader (cyclomatic 25): ChannelScreenHeader.ChannelScreenHeader 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":"desktop/src/features/channels/ui/ChannelScreenHeader.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4a202b665203680c48dfc9a868ab702ad3ad8dc0d861ce719d19be4059df3f2"}},{"ruleId":"D1","level":"warning","message":{"text":"useRoutedMessageEdit.useRoutedMessageEdit (cyclomatic 25): useRoutedMessageEdit.useRoutedMessageEdit has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 5 of the 25 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 71, 58, 112, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/useRoutedMessageEdit.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"36c9ec3c3274e3404882e138ccf0aa153f402b9e6a62acd4a6d5cc7f167a5cb2"}},{"ruleId":"D1","level":"warning","message":{"text":"useEmojiAutocomplete.useEmojiAutocomplete (cyclomatic 25): useEmojiAutocomplete.useEmojiAutocomplete has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 2 of the 25 points are its own statements and the rest belongs to 11 function literals inside it that branch (lines 218, 156, 68, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useEmojiAutocomplete.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d44dbe2f193558d500ee6ff3d25a405ffbdb5ee5f9ef0bbff13cf433f1bbfb8"}},{"ruleId":"D1","level":"warning","message":{"text":"hooks.useFirstRunOnboardingGate (cyclomatic 25): hooks.useFirstRunOnboardingGate has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 1 of the 25 points is its own statement and the rest belongs to 5 function literals inside it that branch (lines 324, 391, 310, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/hooks.ts"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"60e586198a1125b40cd9dd18990941da6437cfe50dd03ee8a78f4c7913b90e68"}},{"ruleId":"D1","level":"warning","message":{"text":"projectChannelRequest.parseProjectChannelRequest (cyclomatic 25): projectChannelRequest.parseProjectChannelRequest has cyclomatic complexity 25 (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":"desktop/src/features/projects/projectChannelRequest.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"58e12d5663977820f8b9b05516182bc39ad325c4dd014af4e61bcb081c697d04"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectPullRequestFilesChangedPanel.DiffPreview (cyclomatic 25): ProjectPullRequestFilesChangedPanel.DiffPreview has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 3 of the 25 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 509, 461, 470, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectPullRequestFilesChangedPanel.tsx"},"region":{"startLine":447}}}],"partialFingerprints":{"codehealthFindingId/v1":"a104b44e9aa721bb08602c3bb21b28f8df85f36365f9d47acdfd96472c29059b"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectReadmePanel.ReadmePanel (cyclomatic 25): ProjectReadmePanel.ReadmePanel 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":"desktop/src/features/projects/ui/ProjectReadmePanel.tsx"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"a59a8f17fc29497685e520ac0900ab8cc5aa1126d0eab8b39902c9c65db791d5"}},{"ruleId":"D1","level":"warning","message":{"text":"SendFeedbackDialog.SendFeedbackDialog (cyclomatic 25): SendFeedbackDialog.SendFeedbackDialog has cyclomatic complexity 25 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. 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":"desktop/src/features/settings/ui/SendFeedbackDialog.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d80a6eb5fb5397a56f8c87a6e6d92b8043f62282b9a7e9228b3a007fdfd24ae"}},{"ruleId":"D1","level":"warning","message":{"text":"SidebarProjectsSection.SidebarProjectsSectionContent (cyclomatic 25): SidebarProjectsSection.SidebarProjectsSectionContent has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 11 of the 25 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 226, 299, 211, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/SidebarProjectsSection.tsx"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1e70ade732efec5ae6b047056e9d14b3cf3b0d459fcae8fb25dd3515a8e8cb9"}},{"ruleId":"D1","level":"warning","message":{"text":"inviteHelpers.parseInviteInput (cyclomatic 25): inviteHelpers.parseInviteInput 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":"desktop/src/shared/api/inviteHelpers.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"cce1049fd1bb1a3a47f02f849ed475bef4632fa9c7013d76fba2bbec3b76a8ac"}},{"ruleId":"D1","level":"warning","message":{"text":"linkPreviewSnapshot.parseLinkPreviewSnapshots (cyclomatic 25): linkPreviewSnapshot.parseLinkPreviewSnapshots has cyclomatic complexity 25 (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":"desktop/src/shared/lib/linkPreviewSnapshot.ts"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3b870b1c2b40911361bce1a043a7026c1219da762d3f1461ad84c4c079b054a"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_acp::relay::execute_connected_command (cyclomatic 24): buzz_acp::relay::execute_connected_command 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/buzz-acp/src/relay.rs"},"region":{"startLine":1548}}}],"partialFingerprints":{"codehealthFindingId/v1":"844ad4917d885c9aea15ab36107df53b9bc630e592acb78b6ef6a85e4349477b"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_media::validation::validate_jpeg_metadata_free (cyclomatic 24): buzz_media::validation::validate_jpeg_metadata_free 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. This is NOT this file\u0027s highest cyclomatic complexity: buzz_media::validation::file_mime_to_ext (cyclomatic 35) 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/buzz-media/src/validation.rs"},"region":{"startLine":518}}}],"partialFingerprints":{"codehealthFindingId/v1":"db5a42a2ca1e366c85d9c6b7cf59fdaa994c47a22cd52f0bf9d8301a6f39f9d9"}},{"ruleId":"D1","level":"warning","message":{"text":"ChannelsNotifier._catchUpUnreadEvents (cyclomatic 24): ChannelsNotifier._catchUpUnreadEvents 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":"mobile/lib/features/channels/channels_provider.dart"},"region":{"startLine":535}}}],"partialFingerprints":{"codehealthFindingId/v1":"609dae77940596a6c514f48c425295827fc2c55dffa5cc4e41026e659c2cf046"}},{"ruleId":"D1","level":"warning","message":{"text":"RelaySessionNotifier._handleClosed (cyclomatic 24): RelaySessionNotifier._handleClosed has cyclomatic complexity 24 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/relay/relay_session.dart"},"region":{"startLine":710}}}],"partialFingerprints":{"codehealthFindingId/v1":"4190fd9dbb55fd752881f9f07800778e34af484e004487eed25f4974f8901a2d"}},{"ruleId":"D1","level":"warning","message":{"text":"CommunityThemeNotifier.build (cyclomatic 24): CommunityThemeNotifier.build 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":"mobile/lib/shared/theme/community_theme_provider.dart"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"8685719ac2e6ea1cf02ab6fad6079f0916b52494ec3b537dd8cf9b407cb8371e"}},{"ruleId":"D1","level":"warning","message":{"text":"agentSessionToolCatalog.getBuzzToolInfo (cyclomatic 24): agentSessionToolCatalog.getBuzzToolInfo 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":"desktop/src/features/agents/ui/agentSessionToolCatalog.ts"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"814fa77746f6c9f177200d2684a4af9a6bc7fe715e0e97b9a8ef755a7864101c"}},{"ruleId":"D1","level":"warning","message":{"text":"ManagedAgentLogPanel.ManagedAgentLogPanel (cyclomatic 24): ManagedAgentLogPanel.ManagedAgentLogPanel 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":"desktop/src/features/agents/ui/ManagedAgentLogPanel.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"04c78c8894fba3291ee2cfab1b34973756a24bcb93250e10bcd11fbecc392e22"}},{"ruleId":"D1","level":"warning","message":{"text":"BotActivityBar.BotActivityComposerAction (cyclomatic 24): BotActivityBar.BotActivityComposerAction has cyclomatic complexity 24 (threshold 15). Most of this is not in the body itself: 11 of the 24 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 64, 186, 102, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/BotActivityBar.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"14bb9b1dd71328cef8bc0584ea44b445bcdff395bde3ec25f0bf7237ddb8a618"}},{"ruleId":"D1","level":"warning","message":{"text":"AddAgentDialog.AddAgentDialog (cyclomatic 24): AddAgentDialog.AddAgentDialog has cyclomatic complexity 24 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 6 belong to 6 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/components/AddAgentDialog.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf02476ead64eecd5cd476634ad3a9d02fab60cfd97a4701a84c93bbf8645f0e"}},{"ruleId":"D1","level":"warning","message":{"text":"useAutoPinMentionedAgents.useAutoPinMentionedAgents (cyclomatic 24): useAutoPinMentionedAgents.useAutoPinMentionedAgents has cyclomatic complexity 24 (threshold 15). Most of this is not in the body itself: 3 of the 24 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 138, 92, 65, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useAutoPinMentionedAgents.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"049764955f53a3357b80871ade1bb7bef7810e1b5f8df8067c36af6e15532820"}},{"ruleId":"D1","level":"warning","message":{"text":"use-feed-desktop-notifications.useFeedDesktopNotifications (cyclomatic 24): use-feed-desktop-notifications.useFeedDesktopNotifications has cyclomatic complexity 24 (threshold 15). Most of this is not in the body itself: 1 of the 24 points is its own statement and the rest belongs to 4 function literals inside it that branch (lines 131, 95, 113, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/notifications/use-feed-desktop-notifications.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce93cc3cd998de6907e6cf4e47ec5eaac7c9f4adde156f610dcbfdea520ac510"}},{"ruleId":"D1","level":"warning","message":{"text":"SetupStep.RuntimeProvidersSection (cyclomatic 24): SetupStep.RuntimeProvidersSection has cyclomatic complexity 24 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 6 belong to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/SetupStep.tsx"},"region":{"startLine":662}}}],"partialFingerprints":{"codehealthFindingId/v1":"685a585569845cb83863acbdcbb6060f7b70132384ed2848d38b1a5d8858ca68"}},{"ruleId":"D1","level":"warning","message":{"text":"UserProfilePanelFields.buildOwnerFields (cyclomatic 24): UserProfilePanelFields.buildOwnerFields 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":"desktop/src/features/profile/ui/UserProfilePanelFields.tsx"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ad3cd5f1bb44d8f60df43a55d8ff78912c8854a76b8efde3731e1b6200cba81"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectRepositoryPanel.fileIconVisual (cyclomatic 24): ProjectRepositoryPanel.fileIconVisual has cyclomatic complexity 24 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectRepositoryPanel.tsx"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c406cceaf2d796379a2faccf368ea62a13d55a8a59a152cecf377b881ac1938"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectsChannelsList.ProjectsChannelsList (cyclomatic 24): ProjectsChannelsList.ProjectsChannelsList has cyclomatic complexity 24 (threshold 15). Most of this is not in the body itself: 6 of the 24 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 171, 55, 90, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectsChannelsList.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bbb1d089d19d7bc9a258dae508c16f1d7acf35741532622899ee552b26d63f8"}},{"ruleId":"D1","level":"warning","message":{"text":"useProjectChannelRequests.useProjectChannelRequests (cyclomatic 24): useProjectChannelRequests.useProjectChannelRequests has cyclomatic complexity 24 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 8 belong to 4 function literals inside it that branch. 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":"desktop/src/features/projects/useProjectChannelRequests.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddf4bea63545fbf3eb6cb08a3a64e9ba7960c97265b6224fb44faa4a76760490"}},{"ruleId":"D1","level":"warning","message":{"text":"EncryptedBackupProvider.EncryptedBackupProvider (cyclomatic 24): EncryptedBackupProvider.EncryptedBackupProvider has cyclomatic complexity 24 (threshold 15). Most of this is not in the body itself: 1 of the 24 points is its own statement and the rest belongs to 11 function literals inside it that branch (lines 158, 115, 81, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/EncryptedBackupProvider.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"91dabaa457390534936c7a3781fdb2d668c34e807b1358eae01f0f9dfefa0e4b"}},{"ruleId":"D1","level":"warning","message":{"text":"use-updater.useUpdater (cyclomatic 24): use-updater.useUpdater has cyclomatic complexity 24 (threshold 15). Most of this is not in the body itself: 1 of the 24 points is its own statement and the rest belongs to 4 function literals inside it that branch (lines 125, 68, 79, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/hooks/use-updater.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b647a698d86ec0304e3319819283e37cf87e2c57b3d5d7a2010ae66cd3572c9"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowMessageTextConditionEditor.WorkflowMessageTextCondition (cyclomatic 24): WorkflowMessageTextConditionEditor.WorkflowMessageTextCondition has cyclomatic complexity 24 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 10 belong to 6 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/WorkflowMessageTextConditionEditor.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"248a00cd68d61efd85af56a2291948145cde5298aa6fa2b525ff82c7f1eed32f"}},{"ruleId":"D1","level":"warning","message":{"text":"ThemeProvider.ThemeProvider (cyclomatic 24): ThemeProvider.ThemeProvider has cyclomatic complexity 24 (threshold 15). Most of this is not in the body itself: 3 of the 24 points are its own statements and the rest belongs to 15 function literals inside it that branch (lines 678, 537, 555, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/theme/ThemeProvider.tsx"},"region":{"startLine":480}}}],"partialFingerprints":{"codehealthFindingId/v1":"abf8e40053179540829feaebaaeb3d5c679432671f38f04622ae040fac08eb83"}},{"ruleId":"D1","level":"warning","message":{"text":"MessageLinkPill.MessageLinkPillContents (cyclomatic 24): MessageLinkPill.MessageLinkPillContents has cyclomatic complexity 24 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 5 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/markdown/MessageLinkPill.tsx"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"862d01a345b23a1c66359b691fea69186c9b55088abc0acee8928b96b88d3aa6"}},{"ruleId":"D1","level":"warning","message":{"text":"RepoDetailPage.RepoDetailPage (cyclomatic 24): RepoDetailPage.RepoDetailPage has cyclomatic complexity 24 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 6 belong to 3 function literals inside it that branch. 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":"web/src/features/repos/ui/RepoDetailPage.tsx"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd160db17f01e9ae9503280ce473e5f0e01a5de35c5a5c53d59a80acf4f7d1f3"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_agent::catalog::fetch_catalog_page (cyclomatic 23): buzz_agent::catalog::fetch_catalog_page 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/buzz-agent/src/catalog.rs"},"region":{"startLine":514}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5082b8acd91f7234cd117fc7168931c01b3c1e89a8c1126fabfae621a7b27fd"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_dev_mcp::tree::run (cyclomatic 23): buzz_dev_mcp::tree::run 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/buzz-dev-mcp/src/tree.rs"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ed5e95b2f20dc38031fca798a8c0d1d893c1300779fe73b73176b6a3f7b89a8"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::handlers::report_resolution::drive_enforcement (cyclomatic 23): buzz_relay::handlers::report_resolution::drive_enforcement 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/buzz-relay/src/handlers/report_resolution.rs"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfeb76ecafce1f898f044b3de111f24edfad3419eff24dcdc28cede61b2a6bc1"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_sdk::builders::build_repo_announcement (cyclomatic 23): buzz_sdk::builders::build_repo_announcement 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/buzz-sdk/src/builders.rs"},"region":{"startLine":1040}}}],"partialFingerprints":{"codehealthFindingId/v1":"513722cbc7725a9f4583d59fb4c04e45367ef13def2bd310055acb655f42b48d"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::media_proxy::handle_buzz_media (cyclomatic 23): buzz_desktop::media_proxy::handle_buzz_media 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":"desktop/src-tauri/src/media_proxy.rs"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"d83c1a71fc85a61510868978cddbc7daa1b6baedebef780b0c9acf94ace2ca07"}},{"ruleId":"D1","level":"warning","message":{"text":"desktop_release.previous_release (cyclomatic 23): desktop_release.previous_release has cyclomatic complexity 23 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/desktop_release.py"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"306ca5330d64501f5161ae6440b70fb84c277dd56596d5bbcd026ddbc2f94dc3"}},{"ruleId":"D1","level":"warning","message":{"text":"DeviceVoiceNotePlayerController._toggle (cyclomatic 23): DeviceVoiceNotePlayerController._toggle 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":"mobile/lib/features/channels/voice_note_recording.dart"},"region":{"startLine":807}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d0bd4b4d4161975433e1ac72d359c04570281460f4a2aea93218baf334d5da9"}},{"ruleId":"D1","level":"warning","message":{"text":"AgentCardMintDialog.AgentCardMintDialog (cyclomatic 23): AgentCardMintDialog.AgentCardMintDialog has cyclomatic complexity 23 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentCardMintDialog.tsx"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"31ffd45bc036b5665b5f8b8116ecfb84ee031058658b5a4c1c993f59ed310ee5"}},{"ruleId":"D1","level":"warning","message":{"text":"RespondToField.AllowlistPicker (cyclomatic 23): RespondToField.AllowlistPicker has cyclomatic complexity 23 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/RespondToField.tsx"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"b46113eb2c645414e46f09bf07a0555bdb474ac629d5afc3634dd42af8ac6138"}},{"ruleId":"D1","level":"warning","message":{"text":"ChannelMembersBar.ChannelMembersBar (cyclomatic 23): ChannelMembersBar.ChannelMembersBar has cyclomatic complexity 23 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 8 belong to 5 function literals inside it that branch. 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":"desktop/src/features/channels/ui/ChannelMembersBar.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b49d33291bd55c24c3d3cf50bfc8b663ef957acb61cf4db65a8dcd511444dd9"}},{"ruleId":"D1","level":"warning","message":{"text":"useChannelPaneHandlers.useChannelPaneHandlers (cyclomatic 23): useChannelPaneHandlers.useChannelPaneHandlers has cyclomatic complexity 23 (threshold 15). Most of this is not in the body itself: 1 of the 23 points is its own statement and the rest belongs to 11 function literals inside it that branch (lines 346, 174, 217, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/useChannelPaneHandlers.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c4f1062244739ecfc7370522ca241a45cd253b36f5ffb2a72172f02f5af18f0"}},{"ruleId":"D1","level":"warning","message":{"text":"CommunityMembersSettingsCard.RelayMemberRow (cyclomatic 23): CommunityMembersSettingsCard.RelayMemberRow 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":"desktop/src/features/community-members/ui/CommunityMembersSettingsCard.tsx"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"53d547f0af06a03b02c731f76ea3ae12e743637e4ae0be870caf916bbc76ae37"}},{"ruleId":"D1","level":"warning","message":{"text":"useHomeInboxReadState.useHomeInboxReadState (cyclomatic 23): useHomeInboxReadState.useHomeInboxReadState has cyclomatic complexity 23 (threshold 15). Most of this is not in the body itself: 1 of the 23 points is its own statement and the rest belongs to 3 function literals inside it that branch (lines 211, 171, 276). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/useHomeInboxReadState.ts"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"310728b403fde1de6509b4cc412cbded9f9d9c3401428f3a3ae77551f92ecf93"}},{"ruleId":"D1","level":"warning","message":{"text":"sendToChannelSemantics.getSendToChannelSemantics (cyclomatic 23): sendToChannelSemantics.getSendToChannelSemantics has cyclomatic complexity 23 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 5 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/sendToChannelSemantics.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"bec4f382779a4cd47e64f54f3b42cad6b903b3211af0ea14fa9a19c1d8127ead"}},{"ruleId":"D1","level":"warning","message":{"text":"useDrafts.isValidDraftState (cyclomatic 23): useDrafts.isValidDraftState has cyclomatic complexity 23 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 5 belong to one function literal inside it that branches. 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":"desktop/src/features/messages/lib/useDrafts.ts"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"2998d06a22dc0bc71673fe4924f279105bf1cb2e6b409dcfce88ad3ece6335c6"}},{"ruleId":"D1","level":"warning","message":{"text":"ComposerUploadProgressPill.ComposerUploadProgressPill (cyclomatic 23): ComposerUploadProgressPill.ComposerUploadProgressPill 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":"desktop/src/features/messages/ui/ComposerUploadProgressPill.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"febe4be0e0b56c4b42496a55d4ebe6a0483a896593222e0537029c4bea18493e"}},{"ruleId":"D1","level":"warning","message":{"text":"useNonMemberInvite.useNonMemberInvite (cyclomatic 23): useNonMemberInvite.useNonMemberInvite has cyclomatic complexity 23 (threshold 15). Most of this is not in the body itself: 1 of the 23 points is its own statement and the rest belongs to 8 function literals inside it that branch (lines 94, 60, 79, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useNonMemberInvite.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f741e4d707fdf1075c49d28297357d897167bcaa1511a8777e7b4b9cff2ca33"}},{"ruleId":"D1","level":"warning","message":{"text":"SetupStep.RuntimeStatus (cyclomatic 23): SetupStep.RuntimeStatus has cyclomatic complexity 23 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 5 belong to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/SetupStep.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ebe888130ebc106498b18556c6729416f40eb51dd860837621d255cd0364e08"}},{"ruleId":"D1","level":"warning","message":{"text":"hooks.usePresenceSession (cyclomatic 23): hooks.usePresenceSession has cyclomatic complexity 23 (threshold 15). Most of this is not in the body itself: 8 of the 23 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 362, 265, 298, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/presence/hooks.ts"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"191b9187a52ba1a9d23124c436ee607cb22e0cac827beb3b75211bc99f18444b"}},{"ruleId":"D1","level":"warning","message":{"text":"AvatarCustomColorPanel.AvatarCustomColorPanel (cyclomatic 23): AvatarCustomColorPanel.AvatarCustomColorPanel has cyclomatic complexity 23 (threshold 15). Most of this is not in the body itself: 10 of the 23 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 239, 184, 62, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/AvatarCustomColorPanel.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ec288e7f86b7adbc693e46343219e7768a2f5e76680263e9b8a981e763b1ada"}},{"ruleId":"D1","level":"warning","message":{"text":"UserProfileAgentActions.UserProfileAgentSettingsMenu (cyclomatic 23): UserProfileAgentActions.UserProfileAgentSettingsMenu 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":"desktop/src/features/profile/ui/UserProfileAgentActions.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"7090c82a0e9c67cf3dc896bd610ba0fc386f72256c198b2a10368f144ccba037"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectPullRequestFilesChangedPanel.changedFileIconVisual (cyclomatic 23): ProjectPullRequestFilesChangedPanel.changedFileIconVisual has cyclomatic complexity 23 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectPullRequestFilesChangedPanel.tsx"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"41ac8c85a9b268a6f39d385f21f5f854eb29cdaa693096d99770bf0bf7dd5e5c"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectDetailFeedPanels.ContributorsPanel (cyclomatic 23): ProjectDetailFeedPanels.ContributorsPanel 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 4 function literals inside it that branch (lines 72, 166, 117, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectDetailFeedPanels.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"4eb423b0d9feddfc21fbe17428e9d72b166731f898971d81d7b5671d6af0ed61"}},{"ruleId":"D1","level":"warning","message":{"text":"workflowDefinition.getActionCardClause (cyclomatic 23): workflowDefinition.getActionCardClause 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":"desktop/src/features/workflows/ui/workflowDefinition.ts"},"region":{"startLine":291}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7cbff425de32f984714ad0312b6c80a3c5b77c1970fd9d423d15f4df8cd0112"}},{"ruleId":"D1","level":"warning","message":{"text":"BloomMenu.Container (cyclomatic 23): BloomMenu.Container has cyclomatic complexity 23 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 4 belong to 3 function literals inside it that branch. 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":"desktop/src/protectedFeatures/bestie/BloomMenu.tsx"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"985db834d4d46de8042d73a2d082cc6956213437257494cc34d819a35c874de9"}},{"ruleId":"D1","level":"warning","message":{"text":"markdown.ImageBlock (cyclomatic 23): markdown.ImageBlock has cyclomatic complexity 23 (threshold 15). Most of this is not in the body itself: 11 of the 23 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 1089, 1008, 1057, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/markdown.tsx"},"region":{"startLine":986}}}],"partialFingerprints":{"codehealthFindingId/v1":"479cae3d26f0cc8ab0f804398a3f3167b7a90c5d13a99ee343c9b8f55f8ac810"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_acp::relay::resubscribe_after_reconnect (cyclomatic 22): buzz_acp::relay::resubscribe_after_reconnect 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/buzz-acp/src/relay.rs"},"region":{"startLine":2669}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd74563d438c325be2dac21d0b8dc5455eea35c2d5722447429bcbfeef8a6f46"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_dev_mcp::shell::run (cyclomatic 22): buzz_dev_mcp::shell::run 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/buzz-dev-mcp/src/shell.rs"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f7d5a6d36078dbedde71307911755c01ee1cd0b3a5fed13fb0cd029cf2d8838"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_media::validation::validate_gif_metadata_free (cyclomatic 22): buzz_media::validation::validate_gif_metadata_free has cyclomatic complexity 22 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 2 belong to one function item inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top. This is NOT this file\u0027s highest cyclomatic complexity: buzz_media::validation::file_mime_to_ext (cyclomatic 35) 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/buzz-media/src/validation.rs"},"region":{"startLine":750}}}],"partialFingerprints":{"codehealthFindingId/v1":"66d145fac7cea33805957cbc9285006c63d8e2294ddc72a814cbafda41cbf7e7"}},{"ruleId":"D1","level":"warning","message":{"text":"ClientMessage::parse (cyclomatic 22): ClientMessage::parse 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/buzz-relay/src/protocol.rs"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6730e6f8a4a8d42865af5647ec23a71b1f25480e3bf672c7a210045ae002d03"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::handlers::event::handle_event (cyclomatic 22): buzz_relay::handlers::event::handle_event 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/buzz-relay/src/handlers/event.rs"},"region":{"startLine":608}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c089e5926e82d2bb0c120516ac8de4587d45852a146408c028e79a9a7733998"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::api::git::cas_publish::cas_publish_inner (cyclomatic 22): buzz_relay::api::git::cas_publish::cas_publish_inner 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/buzz-relay/src/api/git/cas_publish.rs"},"region":{"startLine":1021}}}],"partialFingerprints":{"codehealthFindingId/v1":"447b16f1b33635ab3ad491ac6bb34ff6b1ffa7d5b6d5e0753fe2c4300860dc6d"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowEngine::run (cyclomatic 22): WorkflowEngine::run 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/buzz-workflow/src/lib.rs"},"region":{"startLine":489}}}],"partialFingerprints":{"codehealthFindingId/v1":"e584afd7362c1f57370d8bbfca151248b6d8d1963d3fafd943b49bcbbf4683ae"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::unread_catch_up::classify_batch (cyclomatic 22): buzz_desktop::unread_catch_up::classify_batch 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":"desktop/src-tauri/src/unread_catch_up.rs"},"region":{"startLine":250}}}],"partialFingerprints":{"codehealthFindingId/v1":"3456688e27f6be0b17864ae0f40557704ee8be12bad534a86e22b660ca6f28ec"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::commands::personas::inbound::reconcile_inbound_persona_event_blocking (cyclomatic 22): buzz_desktop::commands::personas::inbound::reconcile_inbound_persona_event_blocking 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":"desktop/src-tauri/src/commands/personas/inbound.rs"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"388254ff72872ee1f0ec8ba02b611ab2c3beea7b6f4e9349f765fb29066acdc3"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::deep_link::parse_entity_deep_link (cyclomatic 22): buzz_desktop::deep_link::parse_entity_deep_link 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":"desktop/src-tauri/src/deep_link.rs"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"2771c76c1e4ec29d1e46da7bdd7bd3966faad5a2134ca7579700229d55d02bb7"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::commands::channels::fetch::fetch_channels (cyclomatic 22): buzz_desktop::commands::channels::fetch::fetch_channels 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":"desktop/src-tauri/src/commands/channels/fetch.rs"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"97e0f546989e3f79f1b37068c5629f368717d75a51d0fa448458a5fa565a53ef"}},{"ruleId":"D1","level":"warning","message":{"text":"AppDelegate.handleMediaUploadMethodCall (cyclomatic 22): AppDelegate.handleMediaUploadMethodCall 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":"mobile/ios/Runner/AppDelegate.swift"},"region":{"startLine":649}}}],"partialFingerprints":{"codehealthFindingId/v1":"e528da8c1ccf2c57be40111dbb414c8b5da1fcf8a31ff56d3970a168f60ac44a"}},{"ruleId":"D1","level":"warning","message":{"text":"NativeEmojiCategoryTracker.selectedSectionID (cyclomatic 22): NativeEmojiCategoryTracker.selectedSectionID 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":"mobile/ios/Runner/NativeEmojiPickerModel.swift"},"region":{"startLine":415}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbc3d36d2bbdc057143c7b321a7124c720f62ff3706227ecd014d32eaa478f95"}},{"ruleId":"D1","level":"warning","message":{"text":"UserProfileSheet.build (cyclomatic 22): UserProfileSheet.build 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":"mobile/lib/features/profile/user_profile_sheet.dart"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1cce776e12595df1adccccdf11da1204da893e20b4abd975fd872057401eef3"}},{"ruleId":"D1","level":"warning","message":{"text":"SearchPage.build (cyclomatic 22): SearchPage.build 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":"mobile/lib/features/search/search_page.dart"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"3860bf7c04ce0452e8970f3836c2b83468894e8e0f1048376d99e57e2fc2bdaf"}},{"ruleId":"D1","level":"warning","message":{"text":"BuzzPushBootstrap.build (cyclomatic 22): BuzzPushBootstrap.build 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":"mobile/lib/shared/push/push_bootstrap.dart"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac82fc84f2b5e922b6e5d4ff46e5d040cf1426552cd5f87aa9cf86d7c7afe4df"}},{"ruleId":"D1","level":"warning","message":{"text":"CommunityThemeSyncManager.flush (cyclomatic 22): CommunityThemeSyncManager.flush 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":"mobile/lib/shared/theme/community_theme_sync.dart"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"a200da7055c5c5858f28f0afa5174ec5474a515fa5e3262dbb376ba6528c6137"}},{"ruleId":"D1","level":"warning","message":{"text":"AdminConsoleReportsTab.ResolveReportForm (cyclomatic 22): AdminConsoleReportsTab.ResolveReportForm has cyclomatic complexity 22 (threshold 15). Of this number, 11 points are the body\u0027s own statements and 11 belong to 4 function literals inside it that branch. 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":"desktop/src/features/admin-console/AdminConsoleReportsTab.tsx"},"region":{"startLine":362}}}],"partialFingerprints":{"codehealthFindingId/v1":"30f04de7a290a380e741341c8bb6bc7c1246051bb75a7f619ab9fa58f6054f54"}},{"ruleId":"D1","level":"warning","message":{"text":"ChannelCanvas.ChannelCanvas (cyclomatic 22): ChannelCanvas.ChannelCanvas has cyclomatic complexity 22 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/ChannelCanvas.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"217deb4fd4a709cac164d609f0a2a2a611d37ae02bec3f6dac4869196edcc551"}},{"ruleId":"D1","level":"warning","message":{"text":"useCommunities.resolveCommunityUpdateResult (cyclomatic 22): useCommunities.resolveCommunityUpdateResult has cyclomatic complexity 22 (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":"desktop/src/features/communities/useCommunities.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"53e467da8b37747d9fff250af73759ed5bf96ea070c620ed12966a7c01cafa85"}},{"ruleId":"D1","level":"warning","message":{"text":"DefaultConfigStep.AgentDefaultsSection (cyclomatic 22): DefaultConfigStep.AgentDefaultsSection has cyclomatic complexity 22 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 10 belong to 5 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/DefaultConfigStep.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1a37e85444076369e219b3de066b5332e1364bda0dbe683b733c7ed050997c4"}},{"ruleId":"D1","level":"warning","message":{"text":"avatarProfileSync.createAvatarProfileSync (cyclomatic 22): avatarProfileSync.createAvatarProfileSync has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 1 of the 22 points is its own statement and the rest belongs to 9 function literals inside it that branch (lines 76, 89, 101, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/avatarProfileSync.ts"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"b32eaa89ffe5a62709e925ae16f986fe108048adf8efc3d7050cfc3af7a74772"}},{"ruleId":"D1","level":"warning","message":{"text":"RemindersPanel.ReminderRow (cyclomatic 22): RemindersPanel.ReminderRow has cyclomatic complexity 22 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. 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":"desktop/src/features/reminders/ui/RemindersPanel.tsx"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fcfc9614beb79c53034fd555f15f1abd6dc688475f1dbe85f022bdeda50bf5a"}},{"ruleId":"D1","level":"warning","message":{"text":"NotificationSettingsCard.NotificationSettingsCard (cyclomatic 22): NotificationSettingsCard.NotificationSettingsCard has cyclomatic complexity 22 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 8 belong to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/NotificationSettingsCard.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd9b2b8954359fbcdee8311f5dc11c31678e0640e32bd2ec6611b35ce1730cbf"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowsView.WorkflowsView (cyclomatic 22): WorkflowsView.WorkflowsView has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 8 of the 22 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 128, 221, 252, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/WorkflowsView.tsx"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"db5b67694caef6ef429055da342a9ac65dc6666b9a0b1575e494c47420f0d965"}},{"ruleId":"D1","level":"warning","message":{"text":"ReadOnlyRelayClient.handleWsMessage (cyclomatic 22): ReadOnlyRelayClient.handleWsMessage has cyclomatic complexity 22 (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":"desktop/src/shared/api/readOnlyRelayClient.ts"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"5341809b7bc17dc0013cf567f6287161ee31075281f3f22ef80f72520d4e359c"}},{"ruleId":"D1","level":"warning","message":{"text":"RunCtx::execute_parallel (cyclomatic 21): RunCtx::execute_parallel 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/buzz-agent/src/agent.rs"},"region":{"startLine":909}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cef4019db5b480da1edffdf600920c88bbbc6f430d62456db14fd7fc1df3a00"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_deletion::execute_stage (cyclomatic 21): buzz_deletion::execute_stage 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/buzz-deletion/src/lib.rs"},"region":{"startLine":1193}}}],"partialFingerprints":{"codehealthFindingId/v1":"aff80b7310c67211000f3976b086d864db212b535c0de568fb64a1ce4cb0708f"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::media_proxy::proxy_handler (cyclomatic 21): buzz_desktop::media_proxy::proxy_handler 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":"desktop/src-tauri/src/media_proxy.rs"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad43a26bdda7a7130b0773241bbc804856ec19c9d8aea0ea1396ae2ed105e8d9"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::relay::profile_avatar::localize_avatar (cyclomatic 21): buzz_desktop::relay::profile_avatar::localize_avatar 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":"desktop/src-tauri/src/relay/profile_avatar.rs"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"80defbce5c68783986b24dd89d74318c2bbf6334b1ae9921faa7be7289916c10"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::terminal_runtime::terminal_attach (cyclomatic 21): buzz_desktop::terminal_runtime::terminal_attach 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":"desktop/src-tauri/src/terminal_runtime.rs"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e7b90ac593bcde00c886fc1205e067cbc6eeec38fbcfa51d8db174959ded9f8"}},{"ruleId":"D1","level":"warning","message":{"text":"acceptance.explore (cyclomatic 21): acceptance.explore 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":"docs/formal/nip-pl/acceptance.py"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f300669e4c783a0628c81ddba99e75bc0ca42b5542b243164ef37240e094f37"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaSanitizer.scrubJpeg (cyclomatic 21): MediaSanitizer.scrubJpeg 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":"mobile/ios/Runner/MediaSanitizer.swift"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"2696db8b16c7e1f3d430b7152f3536d4b4979e36ea0b5cdc77f21db77d86e27c"}},{"ruleId":"D1","level":"warning","message":{"text":"_MobileHuddleCallPage.build (cyclomatic 21): _MobileHuddleCallPage.build 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":"mobile/lib/features/channels/channel_detail_page/huddle_sheet.dart"},"region":{"startLine":539}}}],"partialFingerprints":{"codehealthFindingId/v1":"0afdcdd3655ffe886c7540a4d0521e862ff6761e141d7b5100af7ac28006b209"}},{"ruleId":"D1","level":"warning","message":{"text":"ChannelMessagesNotifier._handleLiveEvent (cyclomatic 21): ChannelMessagesNotifier._handleLiveEvent 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":"mobile/lib/features/channels/channel_messages_provider.dart"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"d94f13d246398cd4677ee0002856c4b70c947b1407339a55f215f2cc69c54094"}},{"ruleId":"D1","level":"warning","message":{"text":"ChannelsPage.build (cyclomatic 21): ChannelsPage.build 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":"mobile/lib/features/channels/channels_page.dart"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"39cb83936f4d575fe547c59e06fec4377746ccc29e97d0182a32a4c19721eb15"}},{"ruleId":"D1","level":"warning","message":{"text":"PairingPage.build (cyclomatic 21): PairingPage.build 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":"mobile/lib/features/pairing/pairing_page.dart"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b51ec7223bd73f41d0b8e66b3c49813a674c5bd32a0a34b5fe8adbfe574d8fe"}},{"ruleId":"D1","level":"warning","message":{"text":"ProfileTextEditSheet.build (cyclomatic 21): ProfileTextEditSheet.build 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":"mobile/lib/features/profile/profile_text_edit_sheet.dart"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"469f694cd8ae9c58e43f1ebe5445036c813f43f05d4d4beb160baf2df848595f"}},{"ruleId":"D1","level":"warning","message":{"text":"_SetStatusSheet.build (cyclomatic 21): _SetStatusSheet.build 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":"mobile/lib/features/profile/set_status_sheet.dart"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"27b1da080e2db70d5c6df8d98cf104ae2b1cc9ad627bf2b5e976bceba73b1e69"}},{"ruleId":"D1","level":"warning","message":{"text":"useApplyTemplate.useApplyTemplate (cyclomatic 21): useApplyTemplate.useApplyTemplate 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":"desktop/src/features/channel-templates/useApplyTemplate.ts"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"996932b6c3909797f8664385d51b9de908c459754fe747224bd981017f1036c8"}},{"ruleId":"D1","level":"warning","message":{"text":"ReadStateManager.mergeEvents (cyclomatic 21): ReadStateManager.mergeEvents 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":"desktop/src/features/channels/readState/readStateManager.ts"},"region":{"startLine":456}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0468ebb0ead9f4bd874f92e62ae0baff7eab76fbd420e33e499c20cb2cbba58"}},{"ruleId":"D1","level":"warning","message":{"text":"resolveLinkAt.resolveLinkAt (cyclomatic 21): resolveLinkAt.resolveLinkAt has cyclomatic complexity 21 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 6 belong to one function literal inside it that branches. 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":"desktop/src/features/messages/lib/resolveLinkAt.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"23814d368368532fd81bb844f28ccd8bbbe38c323a01d8c5e10751fc2c346812"}},{"ruleId":"D1","level":"warning","message":{"text":"useChannelLinks.useChannelLinks (cyclomatic 21): useChannelLinks.useChannelLinks has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 2 of the 21 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 157, 80, 87, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useChannelLinks.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b1e842632c7d10b5382bd4700a8d8064e6f43f6b76614919d967ccf208bbbfb"}},{"ruleId":"D1","level":"warning","message":{"text":"useComposerVoiceNote.useComposerVoiceNote (cyclomatic 21): useComposerVoiceNote.useComposerVoiceNote has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 4 of the 21 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 71, 110, 57, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useComposerVoiceNote.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"74ac4eba1799fc00663886964b033b58a98e5a1958f09ff3471805cd6cf95189"}},{"ruleId":"D1","level":"warning","message":{"text":"SelectionFormattingTray.SelectionFormattingTray (cyclomatic 21): SelectionFormattingTray.SelectionFormattingTray has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 4 of the 21 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 129, 224, 189, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/SelectionFormattingTray.tsx"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d5bbf196a35cf4f94c4462cf89324dc21b53334ed21625f21bd3e62ccb1bb81"}},{"ruleId":"D1","level":"warning","message":{"text":"useChannelTyping.useChannelTyping (cyclomatic 21): useChannelTyping.useChannelTyping has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 1 of the 21 points is its own statement and the rest belongs to 8 function literals inside it that branch (lines 81, 140, 179, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/useChannelTyping.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"da9dde489dab123a1625c752766877b9c170a03b5eab111fba9c9ef0bcc26d68"}},{"ruleId":"D1","level":"warning","message":{"text":"hooks.useNotificationSettings (cyclomatic 21): hooks.useNotificationSettings has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 1 of the 21 points is its own statement and the rest belongs to 5 function literals inside it that branch (lines 315, 245, 236, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/notifications/hooks.ts"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"210e6c813434a63cf87f028138df1816d0748834c5cf5ec69c933e5e23256e29"}},{"ruleId":"D1","level":"warning","message":{"text":"selfProfileStorage.trimSelfProfileCaches (cyclomatic 21): selfProfileStorage.trimSelfProfileCaches 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":"desktop/src/features/profile/lib/selfProfileStorage.ts"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"19cd1edd284137f5ecacf2adf314a393dd2bd8f9ce62336d1466194f13321706"}},{"ruleId":"D1","level":"warning","message":{"text":"UserProfilePanelTabs.ProfileLiveActivityEmbed (cyclomatic 21): UserProfilePanelTabs.ProfileLiveActivityEmbed has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 8 of the 21 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 382, 364, 430, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/UserProfilePanelTabs.tsx"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0d061abd8b799e0cb2489b7742a04293ef47e79c99ccb0d037a49b93701b74a"}},{"ruleId":"D1","level":"warning","message":{"text":"UserProfilePrimaryActions.ProfilePrimaryActions (cyclomatic 21): UserProfilePrimaryActions.ProfilePrimaryActions has cyclomatic complexity 21 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. 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":"desktop/src/features/profile/ui/UserProfilePrimaryActions.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"17df288f0820580a9adaf5d9e2aa08b0f75d13238d9dab71cc7e2041fd0221b8"}},{"ruleId":"D1","level":"warning","message":{"text":"projectActivity.summarizeProjectActivityEvents (cyclomatic 21): projectActivity.summarizeProjectActivityEvents 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":"desktop/src/features/projects/projectActivity.mjs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"bde968103b64b3dab77cfb2e4b5c443678461936ffbb57aa11b199bccb1f728e"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectsActivityFeed.buildActivityItems (cyclomatic 21): ProjectsActivityFeed.buildActivityItems has cyclomatic complexity 21 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectsActivityFeed.tsx"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"62c767054dc0a5361a35519ad3e053eb0b837e6d5fd7dd7d6f8629fca331f2bc"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectsActivityFeed.ActivityCard (cyclomatic 21): ProjectsActivityFeed.ActivityCard 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":"desktop/src/features/projects/ui/ProjectsActivityFeed.tsx"},"region":{"startLine":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"809ca89b780b6bc36c556f338a7b83b7b72ed870b2abf03d97803217eb259e88"}},{"ruleId":"D1","level":"warning","message":{"text":"CronExpressionInput.CronExpressionInput (cyclomatic 21): CronExpressionInput.CronExpressionInput has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 4 of the 21 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 104, 132, 33, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/CronExpressionInput.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"a676b7d095cfdbd58d519a0e25492516f89869deb5bdb065e780e9eae65708e3"}},{"ruleId":"D1","level":"warning","message":{"text":"useWebviewScrollBoundaryLock.useWebviewScrollBoundaryLock (cyclomatic 21): useWebviewScrollBoundaryLock.useWebviewScrollBoundaryLock has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 1 of the 21 points is its own statement and the rest belongs to one function literal inside it that branches (line 85). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/hooks/useWebviewScrollBoundaryLock.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"728afdf492f4e7c0746556c932a39fa69d2c9672f808e94aa2eeba76fbc68bfe"}},{"ruleId":"D1","level":"warning","message":{"text":"compact-link-preview-attachment.CompactLinkPreviewAttachment (cyclomatic 21): compact-link-preview-attachment.CompactLinkPreviewAttachment 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":"desktop/src/shared/ui/compact-link-preview-attachment.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"e538d2947fa019f1eca535c1e49e6032cf2e8ea6a1660205b10e652ef1ad36d0"}},{"ruleId":"D1","level":"warning","message":{"text":"useInlineTooltipPosition.useInlineTooltipPosition (cyclomatic 21): useInlineTooltipPosition.useInlineTooltipPosition has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 1 of the 21 points is its own statement and the rest belongs to 9 function literals inside it that branch (lines 19, 41, 95, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/markdown/useInlineTooltipPosition.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"82c89ae6a1ba2bc58554fe1858d9cb04430ef06904a3902a050c1a10ab616037"}},{"ruleId":"D1","level":"warning","message":{"text":"PkceOAuthTokenSource::acquire_locked (cyclomatic 20): PkceOAuthTokenSource::acquire_locked 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/buzz-agent/src/auth.rs"},"region":{"startLine":1090}}}],"partialFingerprints":{"codehealthFindingId/v1":"161280d788b3ecc5ebc800c78310dd085a9ab23abfa1975b5adae406173f459e"}},{"ruleId":"D1","level":"warning","message":{"text":"Config::validate (cyclomatic 20): Config::validate 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/buzz-agent/src/config.rs"},"region":{"startLine":812}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d6c8c9eb00becedda22cef6e6840522e3c37f6c2dcd563eba287dc2f37ca8d5"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_cli::commands::projects::cmd_update (cyclomatic 20): buzz_cli::commands::projects::cmd_update 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/buzz-cli/src/commands/projects.rs"},"region":{"startLine":588}}}],"partialFingerprints":{"codehealthFindingId/v1":"eae74093c62c1911f14584f6e56b03b119fe5d57c86e56e98dce36c14148c2c7"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_persona::validate::advisory_check_skill_names (cyclomatic 20): buzz_persona::validate::advisory_check_skill_names 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/buzz-persona/src/validate.rs"},"region":{"startLine":354}}}],"partialFingerprints":{"codehealthFindingId/v1":"519cdbcf9553562a400d92cf83f379072bb21d2ced70f06e0684f988fd34cbe7"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::api::bridge::thread_window::query (cyclomatic 20): buzz_relay::api::bridge::thread_window::query 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/buzz-relay/src/api/bridge/thread_window.rs"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"92e89783e033372429a69f9bc2eb080bc331a9be320e4c661e6f25ebcbaf981d"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_sdk::mentions::strip_code_regions (cyclomatic 20): buzz_sdk::mentions::strip_code_regions 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/buzz-sdk/src/mentions.rs"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"aee8abf9c1c17ebd32daa0f8f8b9e2db863d6bb2e81ff940b41a63794be013c5"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_voice::pocket_april::split_at_natural_boundaries (cyclomatic 20): buzz_voice::pocket_april::split_at_natural_boundaries 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/buzz-voice/src/pocket_april.rs"},"region":{"startLine":983}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff0eca9db502089e38a55bf3d4950790bee05bc6a68f403912a92df0e9fb8235"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowDef::validate (cyclomatic 20): WorkflowDef::validate 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/buzz-workflow/src/schema.rs"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"6398f1fb931835438f7d636c08bbc7399fa4d1f59563ed894f1f39d6e0b4befa"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::commands::media_gif::strip_gif_metadata (cyclomatic 20): buzz_desktop::commands::media_gif::strip_gif_metadata 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":"desktop/src-tauri/src/commands/media_gif.rs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"a905f78dacb4a8381676f221f48901aa654b35a7295fa7c709a7a780222e2a8c"}},{"ruleId":"D1","level":"warning","message":{"text":"HuddleAudioEngine.runCapture (cyclomatic 20): HuddleAudioEngine.runCapture 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":"mobile/android/app/src/main/kotlin/xyz/block/buzz/mobile/HuddleAudioEngine.kt"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d104734ecf27cd2e05f2b3face6ff8ba1009c81367e2525d0b9a8bb00c94244"}},{"ruleId":"D1","level":"warning","message":{"text":"NativeEmojiPickerDataLoader.parse (cyclomatic 20): NativeEmojiPickerDataLoader.parse has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/NativeEmojiPickerModel.swift"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"416ebe5beac6ce9c12d15622c38711e0d307f6d6c663c61a54d8a95d7080ccea"}},{"ruleId":"D1","level":"warning","message":{"text":"ChannelQuickActionsLauncher.build (cyclomatic 20): ChannelQuickActionsLauncher.build 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":"mobile/lib/features/channels/channels_page/quick_actions_launcher.dart"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"5016db98d4ec0edc7ce538c06cfc3e75aac5250717b8d2be754f8076bdb795aa"}},{"ruleId":"D1","level":"warning","message":{"text":"_ThreadStickyDateIndex.resolve (cyclomatic 20): _ThreadStickyDateIndex.resolve 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":"mobile/lib/features/channels/thread_detail_page/sticky_date.dart"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"913f47cc0eb2d71421ba83fef0db91812986f845e5d32da9a9167a8d42a75739"}},{"ruleId":"D1","level":"warning","message":{"text":"PairingNotifier._handlePairingEvent (cyclomatic 20): PairingNotifier._handlePairingEvent 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":"mobile/lib/features/pairing/pairing_provider.dart"},"region":{"startLine":513}}}],"partialFingerprints":{"codehealthFindingId/v1":"696311f65d4c203cd6eb0956d46149b1a7b6c658ed3ab02b6acc50ae082fc174"}},{"ruleId":"D1","level":"warning","message":{"text":"_ThemePreviewExperience.build (cyclomatic 20): _ThemePreviewExperience.build 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":"mobile/lib/features/settings/theme_picker_page/theme_preview_sheet.dart"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e418c7dad048b92535d2e9ee94fae40b1e42321bbd5d7943dbaa6b158288ada"}},{"ruleId":"D1","level":"warning","message":{"text":"HuddleSessionNotifier._wireMediaAndTransport (cyclomatic 20): HuddleSessionNotifier._wireMediaAndTransport 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":"mobile/lib/shared/huddle/huddle_session.dart"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"d06e1dcd574ef22f11b24eb2ae7ae221250f826114d04b0a2a5786a963e8b8f9"}},{"ruleId":"D1","level":"warning","message":{"text":"BuzzPushLeaseDescriptor.fromRelayInformation (cyclomatic 20): BuzzPushLeaseDescriptor.fromRelayInformation 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":"mobile/lib/shared/push/dev_push_lease.dart"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c017684ad1e975bbd52622f45ae1b583191d1226798f7f82ac5e278d5c0e9ca"}},{"ruleId":"D1","level":"warning","message":{"text":"useAppShellDesktopNotifications.useAppShellDesktopNotifications (cyclomatic 20): useAppShellDesktopNotifications.useAppShellDesktopNotifications has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 2 of the 20 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 71, 106, 62, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/app/useAppShellDesktopNotifications.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"6acf4001c799f5cf33e9d907fef26b4d93640dc87dca22d436d5c925ab07ad10"}},{"ruleId":"D1","level":"warning","message":{"text":"ToolDetailBlocks.ToolDetailBlocks (cyclomatic 20): ToolDetailBlocks.ToolDetailBlocks 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":"desktop/src/features/agents/ui/AgentSessionToolItem/ToolDetailBlocks.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"30558ad998900767801399b0cffc0216f6e6f34b6b8c61633778a846b781df5b"}},{"ruleId":"D1","level":"warning","message":{"text":"AgentSessionTranscriptList.AgentSessionTranscriptList (cyclomatic 20): AgentSessionTranscriptList.AgentSessionTranscriptList has cyclomatic complexity 20 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. 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":"desktop/src/features/agents/ui/AgentSessionTranscriptList.tsx"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e6cc0cc642a1185fcbda42f1755cf9d74291fb1e04c3e3015b6db6bc873f7dc"}},{"ruleId":"D1","level":"warning","message":{"text":"EditCommunityDialog.EditCommunityDialog (cyclomatic 20): EditCommunityDialog.EditCommunityDialog has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 8 of the 20 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 70, 55). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/communities/ui/EditCommunityDialog.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f14781a77819f4e2eeaf59bb17e8599e7a7207ee467374ddb99c9da947daf04"}},{"ruleId":"D1","level":"warning","message":{"text":"useHuddleParticipantRoster.reconstructHuddleParticipantRoster (cyclomatic 20): useHuddleParticipantRoster.reconstructHuddleParticipantRoster 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":"desktop/src/features/huddle/hooks/useHuddleParticipantRoster.ts"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4b3675155e38305db3c2fa4b28c6d8f7225c272ad5e4c0783b080a466f44a0d"}},{"ruleId":"D1","level":"warning","message":{"text":"LocalArchiveSettingsCard.LocalArchiveSettingsCard (cyclomatic 20): LocalArchiveSettingsCard.LocalArchiveSettingsCard has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 4 of the 20 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 460, 490, 432, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/local-archive/ui/LocalArchiveSettingsCard.tsx"},"region":{"startLine":391}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3fa08d4ea68f0d98196bb4cbc04207fcc648103cbb9dcfabe9ba3c22d89c23b"}},{"ruleId":"D1","level":"warning","message":{"text":"MeshComputeSettingsCard.StatusLine (cyclomatic 20): MeshComputeSettingsCard.StatusLine 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":"desktop/src/features/mesh-compute/ui/MeshComputeSettingsCard.tsx"},"region":{"startLine":617}}}],"partialFingerprints":{"codehealthFindingId/v1":"e260d30b850c6e23b15dea4bbeaf5e61deffd6dc36b051220f82b8ea8b102a3e"}},{"ruleId":"D1","level":"warning","message":{"text":"mentionHighlightExtension.selectionAfterMentionTrailingSpace (cyclomatic 20): mentionHighlightExtension.selectionAfterMentionTrailingSpace has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 7 of the 20 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 620, 647). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/mentionHighlightExtension.ts"},"region":{"startLine":602}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4c11348d8a521015db672a2951497da33bf452da3110f7a9012e3d9d655ac01"}},{"ruleId":"D1","level":"warning","message":{"text":"useVirtualizedBottomSettle.useVirtualizedBottomSettle (cyclomatic 20): useVirtualizedBottomSettle.useVirtualizedBottomSettle has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 1 of the 20 points is its own statement and the rest belongs to 8 function literals inside it that branch (lines 74, 42, 101, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useVirtualizedBottomSettle.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"df1c5483d6abf273193c0427382e6d140515aefd96b7e1b9ebc36d9f03ea13d5"}},{"ruleId":"D1","level":"warning","message":{"text":"NsecMaskedDisplay.NsecMaskedDisplay (cyclomatic 20): NsecMaskedDisplay.NsecMaskedDisplay has cyclomatic complexity 20 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. 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":"desktop/src/features/onboarding/ui/NsecMaskedDisplay.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef47c444ccc89fa73b7f009558e14fb7f16eae760a3491a39686b30ec204ae0d"}},{"ruleId":"D1","level":"warning","message":{"text":"ProfileStep.ProfileStep (cyclomatic 20): ProfileStep.ProfileStep has cyclomatic complexity 20 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/ProfileStep.tsx"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"b82f85c2712192650ff2da569b06c3b3cab7cb49db433f5d05f1ba6ae071cf90"}},{"ruleId":"D1","level":"warning","message":{"text":"UserProfilePanelTabs.ProfileInfoTabContent (cyclomatic 20): UserProfilePanelTabs.ProfileInfoTabContent has cyclomatic complexity 20 (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":"desktop/src/features/profile/ui/UserProfilePanelTabs.tsx"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfdd5378d4e914dd420908bc0e4a2637b0fb5032c7bb4e6231713bb0c7f66f97"}},{"ruleId":"D1","level":"warning","message":{"text":"HarnessCatalogDialog.CatalogDetail (cyclomatic 20): HarnessCatalogDialog.CatalogDetail has cyclomatic complexity 20 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/HarnessCatalogDialog.tsx"},"region":{"startLine":451}}}],"partialFingerprints":{"codehealthFindingId/v1":"d565afd4872c3cd9c19b487baefc9453229291ec5e0a003081ffb90a52bd958e"}},{"ruleId":"D1","level":"warning","message":{"text":"workflowStepDescription.configuredStepDetail (cyclomatic 20): workflowStepDescription.configuredStepDetail 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":"desktop/src/features/workflows/ui/workflowStepDescription.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"41fe9c87ade832083ecb9bd9bb53d7bf75c6267e6ed71197fab18c59e93305df"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowTemplateTextarea.WorkflowTemplateTextarea (cyclomatic 20): WorkflowTemplateTextarea.WorkflowTemplateTextarea has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 6 of the 20 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 104, 140, 41, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/WorkflowTemplateTextarea.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"6032484f4077201238c2f1352bbf572d2a3e5d7b8d2078de2f68c9ef7b513ada"}},{"ruleId":"D1","level":"warning","message":{"text":"RelayClient.sendRawWithReconnectRetry (cyclomatic 20): RelayClient.sendRawWithReconnectRetry has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 8 of the 20 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 786, 762, 753, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/api/relayClientSession.ts"},"region":{"startLine":745}}}],"partialFingerprints":{"codehealthFindingId/v1":"34023042010886772eee75b38f218948abf9d7358d5716520ac975eb27f0171d"}},{"ruleId":"D1","level":"warning","message":{"text":"entityLinks.EntityMetadataTooltip (cyclomatic 20): entityLinks.EntityMetadataTooltip has cyclomatic complexity 20 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/markdown/entityLinks.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc170f30d8a5b00e2606c90e8fc819ce31ac56061cb824debb4283511b9b26ba"}},{"ruleId":"D1","level":"warning","message":{"text":"segmented-control.SegmentedControl (cyclomatic 20): segmented-control.SegmentedControl has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 3 of the 20 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 121, 83, 105, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/segmented-control.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"84ab5e4a8fa7d303269e26fe859bbd56372b068ef8254180971cac8cf2e59182"}},{"ruleId":"D1","level":"warning","message":{"text":"installNativeRig::ingest (cyclomatic 20): installNativeRig::ingest 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":"desktop/src/features/channels/observedUnreadNativeRig.mjs"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8e9e9199b02e4c49ddd001223e6dd043c066c0def4fed49f9d666c1ab866980"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_agent::model_capabilities::validate_manifest (cyclomatic 19): buzz_agent::model_capabilities::validate_manifest 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/buzz-agent/src/model_capabilities.rs"},"region":{"startLine":537}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8ab32cc1ed72eb348b4acd5bb3701c52f5a08d028913be2a5c7860a92ac75c0"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_cli::commands::pack::cmd_inspect (cyclomatic 19): buzz_cli::commands::pack::cmd_inspect 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/buzz-cli/src/commands/pack.rs"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"c81a9555cf4d707df310de526f63a31a8337695db491a842fcdae0ab27926cc8"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_core::private_managed_agent::validate_envelope (cyclomatic 19): buzz_core::private_managed_agent::validate_envelope 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/buzz-core/src/private_managed_agent.rs"},"region":{"startLine":262}}}],"partialFingerprints":{"codehealthFindingId/v1":"96a20a0fbafb4a82ab302b2d224ba827980f9327f096b01be725c01670b4f9ae"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_media::validation::validate_webp_metadata_free (cyclomatic 19): buzz_media::validation::validate_webp_metadata_free has cyclomatic complexity 19 (threshold 15). Of this number, 10 points are the body\u0027s own statements and 9 belong to one function item inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top. This is NOT this file\u0027s highest cyclomatic complexity: buzz_media::validation::file_mime_to_ext (cyclomatic 35) 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/buzz-media/src/validation.rs"},"region":{"startLine":675}}}],"partialFingerprints":{"codehealthFindingId/v1":"c33dd0ef1d19483222be3038726d3d7ccd4b2178c5a2419b03542fbc75f7d0a6"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::connection::send_loop_inner (cyclomatic 19): buzz_relay::connection::send_loop_inner 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/buzz-relay/src/connection.rs"},"region":{"startLine":595}}}],"partialFingerprints":{"codehealthFindingId/v1":"51b4f981f72ddafeb1953fd0c05363600f6d446f516177b2cfe71a3d8e1f1a73"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::api::bridge::handle_channel_window_filter (cyclomatic 19): buzz_relay::api::bridge::handle_channel_window_filter 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/buzz-relay/src/api/bridge.rs"},"region":{"startLine":672}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b4f488ef7c57c83d913d7697f0328647b360993c6ebb410c793560bb4afba95"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::deep_link::handle_deep_link_url (cyclomatic 19): buzz_desktop::deep_link::handle_deep_link_url 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":"desktop/src-tauri/src/deep_link.rs"},"region":{"startLine":606}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ef56a4eca2822638aebe2c41ed30f69ffd8bdc78ce139845c6b5d4d28756416"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::commands::project_git::compare_local_remote_status (cyclomatic 19): buzz_desktop::commands::project_git::compare_local_remote_status has cyclomatic complexity 19 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/project_git.rs"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3248dc759ecf70bfe8e94f967c05aaca9a2eac383b66ef493118a4db455a170"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::migration::refresh_builtin_agent_avatars_in_file (cyclomatic 19): buzz_desktop::migration::refresh_builtin_agent_avatars_in_file 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":"desktop/src-tauri/src/migration.rs"},"region":{"startLine":594}}}],"partialFingerprints":{"codehealthFindingId/v1":"19933de2d4912fae06244ec481c2a8fa7d03635791726b0a8a37dd7ce7de6ece"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::commands::personas::card::mint_agent_card (cyclomatic 19): buzz_desktop::commands::personas::card::mint_agent_card 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":"desktop/src-tauri/src/commands/personas/card.rs"},"region":{"startLine":534}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfece00e8e504064e75a98bbdfbead24e8ed477d1de1df882016a16d4025055f"}},{"ruleId":"D1","level":"warning","message":{"text":"NavigationGlassButtonPlatformView.applyContent (cyclomatic 19): NavigationGlassButtonPlatformView.applyContent 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":"mobile/ios/Runner/JumpToLatestGlassButton.swift"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"296aebcb04eac4478ffe6fdf0e87561d090dea3dd7c99734d796930fd22dfa9c"}},{"ruleId":"D1","level":"warning","message":{"text":"BuzzPushPresentationCacheStore.updateProfiles (cyclomatic 19): BuzzPushPresentationCacheStore.updateProfiles 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":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushPresentationCache.swift"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"4809653ffa91371edd17c990ad78895b23546125fbc7b7f5ced84df3fc2794b5"}},{"ruleId":"D1","level":"warning","message":{"text":"_HuddleButton.build (cyclomatic 19): _HuddleButton.build 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":"mobile/lib/features/channels/channel_detail_page/huddle_sheet.dart"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"5683f662f956d85a38a9b6d8c291b2f7e7980d8bca4a23ef1a9a97f42bc60f99"}},{"ruleId":"D1","level":"warning","message":{"text":"_AttachmentSurfacePanel.build (cyclomatic 19): _AttachmentSurfacePanel.build has cyclomatic complexity 19 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/compose_bar/attachments.dart"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e3c5a33e0651146f034c2a760175d1e7ea73eb03f6e15d8e0f302af0265a8f2"}},{"ruleId":"D1","level":"warning","message":{"text":"AgentCardViewerDialog.AgentCardViewerContent (cyclomatic 19): AgentCardViewerDialog.AgentCardViewerContent has cyclomatic complexity 19 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. 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":"desktop/src/features/agents/ui/AgentCardViewerDialog.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8601663ffe0243e41ebf6c319aa9293059e7de46be4ab248f324b528e1f722c"}},{"ruleId":"D1","level":"warning","message":{"text":"agentDefinitionSubmitPayload.buildRuntimeModelProviderPayload (cyclomatic 19): agentDefinitionSubmitPayload.buildRuntimeModelProviderPayload has cyclomatic complexity 19 (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":"desktop/src/features/agents/ui/agentDefinitionSubmitPayload.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b1f448f68695a27e690e45d857f7eab65b028e4ee51e6c5ccece0041a54a9ea"}},{"ruleId":"D1","level":"warning","message":{"text":"agentSessionTranscriptGrouping.splitIntoSessionRuns (cyclomatic 19): agentSessionTranscriptGrouping.splitIntoSessionRuns 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":"desktop/src/features/agents/ui/agentSessionTranscriptGrouping.ts"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"02a4fcfa2d1210e85298c8ea3da59e44a1f7e8083e8becc53d9d15952f29d71e"}},{"ruleId":"D1","level":"warning","message":{"text":"ForumView.ForumView (cyclomatic 19): ForumView.ForumView has cyclomatic complexity 19 (threshold 15). Of this number, 10 points are the body\u0027s own statements and 9 belong to 4 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/forum/ui/ForumView.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"e476f17889f3dea8f9d7d5ac369cf1447fce42e75330c573877ab8191bffa92b"}},{"ruleId":"D1","level":"warning","message":{"text":"useHuddleParticipantRoster.compareLifecycleEvents (cyclomatic 19): useHuddleParticipantRoster.compareLifecycleEvents 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":"desktop/src/features/huddle/hooks/useHuddleParticipantRoster.ts"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"30596953c66597dd70785bfa736110ae0e082d0c854e7c74482bb7c36a0553b1"}},{"ruleId":"D1","level":"warning","message":{"text":"MessageReactions.MessageReactions (cyclomatic 19): MessageReactions.MessageReactions has cyclomatic complexity 19 (threshold 15). Most of this is not in the body itself: 3 of the 19 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 211, 182, 172, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/MessageReactions.tsx"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"986c80c29ab797fc78cc8800ff9ce0f07312d3a0312ca8e8ee330cb3fa3c51f9"}},{"ruleId":"D1","level":"warning","message":{"text":"SystemMessageRow.describeSystemEvent (cyclomatic 19): SystemMessageRow.describeSystemEvent 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":"desktop/src/features/messages/ui/SystemMessageRow.tsx"},"region":{"startLine":503}}}],"partialFingerprints":{"codehealthFindingId/v1":"f295a965621858f84cb55e7098518120793745a748625fefbdc2f5be712091d8"}},{"ruleId":"D1","level":"warning","message":{"text":"AddProjectRepositoryDialog.AddProjectRepositoryDialog (cyclomatic 19): AddProjectRepositoryDialog.AddProjectRepositoryDialog has cyclomatic complexity 19 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 5 belong to 4 function literals inside it that branch. 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":"desktop/src/features/projects/ui/AddProjectRepositoryDialog.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"71c05a099a9cb04ba93d2109a76b88056c74b2668783d8c236db5ada5786da1c"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectConversationPanelContext.ProjectConversationPanelController (cyclomatic 19): ProjectConversationPanelContext.ProjectConversationPanelController has cyclomatic complexity 19 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. 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":"desktop/src/features/projects/ui/ProjectConversationPanelContext.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbdd414053158c95919ddd8c75a9ff7c739d704ca4e607b3465731d280d9b72d"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectPullRequestFilesChangedPanel.ProjectDiffFilesPanel (cyclomatic 19): ProjectPullRequestFilesChangedPanel.ProjectDiffFilesPanel has cyclomatic complexity 19 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 5 belong to 3 function literals inside it that branch. 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":"desktop/src/features/projects/ui/ProjectPullRequestFilesChangedPanel.tsx"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a4a95ee96b8cfb7e80c7b6d3b53dabebcbd034846fa3e3bc6133c2bc12e5569"}},{"ruleId":"D1","level":"warning","message":{"text":"CustomHarnessForm.CustomHarnessForm (cyclomatic 19): CustomHarnessForm.CustomHarnessForm has cyclomatic complexity 19 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. 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":"desktop/src/features/settings/ui/CustomHarnessForm.tsx"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a270e5236c4272d1c8b4fa9ba369cb93b41e00a410ea79341e35e0339853e4f"}},{"ruleId":"D1","level":"warning","message":{"text":"SidebarSection.SidebarSection (cyclomatic 19): SidebarSection.SidebarSection has cyclomatic complexity 19 (threshold 15). Of this number, 10 points are the body\u0027s own statements and 9 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/SidebarSection.tsx"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4a28967eeca4641e365bd94fda4ae8cb5dd7eb5b28d440d6d3fef4ffba7332b"}},{"ruleId":"D1","level":"warning","message":{"text":"CommunityThemeSyncManager.doPublish (cyclomatic 19): CommunityThemeSyncManager.doPublish 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":"desktop/src/shared/theme/communityThemeSync.ts"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"3294c39f60b3dfd6f8a690b1228e7fe0f4f68970950eedf9ffd11412928c33d1"}},{"ruleId":"D1","level":"warning","message":{"text":"SpoilerParticles.mountSpoilerParticleCanvas (cyclomatic 19): SpoilerParticles.mountSpoilerParticleCanvas has cyclomatic complexity 19 (threshold 15). Most of this is not in the body itself: 2 of the 19 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 91, 138, 116, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/SpoilerParticles.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"c151a6908df7964847bf2614d80811e998363c675efc6f47e18984df40d62348"}},{"ruleId":"D1","level":"warning","message":{"text":"AgentSnapshotCard.AgentSnapshotCard (cyclomatic 19): AgentSnapshotCard.AgentSnapshotCard 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":"desktop/src/shared/ui/markdown/AgentSnapshotCard.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"6166b783d4ea34544b32d288570716c9fcea260916d92fe7458efda84e5af75b"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_acp::run_task::run (cyclomatic 18): buzz_acp::run_task::run 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/buzz-acp/src/run_task.rs"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"04f20e2b5b24c2f9f5f4a6a6ef553e35337fd524f098c2b4eec8dbed69556578"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_agent::llm::parse_responses (cyclomatic 18): buzz_agent::llm::parse_responses 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/buzz-agent/src/llm.rs"},"region":{"startLine":1011}}}],"partialFingerprints":{"codehealthFindingId/v1":"c01c231f5253aba6a374f5551517afd9805d60323164db68dfe5e46978b4c141"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_core::filter::filter_match_one (cyclomatic 18): buzz_core::filter::filter_match_one 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/buzz-core/src/filter.rs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc072f50f7500d761e27287c61a1c60b82f64ca2248ecf8855d6aa922be96c82"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_core::pairing::qr::decode_qr (cyclomatic 18): buzz_core::pairing::qr::decode_qr 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/buzz-core/src/pairing/qr.rs"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2a5b3e29146544dff36c45b3f8d53541c1c77f560b77c2c512791de833d7caa"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_db::store::push::accept_lease_event (cyclomatic 18): buzz_db::store::push::accept_lease_event 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/buzz-db/src/store/push.rs"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca61eab097fb6b9db490f52e0c8f638191600bef64adde3492d5a85b6403074d"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_push_gateway::http::deliver (cyclomatic 18): buzz_push_gateway::http::deliver 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/buzz-push-gateway/src/http.rs"},"region":{"startLine":654}}}],"partialFingerprints":{"codehealthFindingId/v1":"adf655fe1292f085e994b2cb5335887fc88a8e77a35ae7f75ac22eb0525cad53"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::api::git::transport::finalize_push_inner (cyclomatic 18): buzz_relay::api::git::transport::finalize_push_inner has cyclomatic complexity 18 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/git/transport.rs"},"region":{"startLine":1903}}}],"partialFingerprints":{"codehealthFindingId/v1":"410ae6bf5ae8808e8efb936c3e1dd7ba0f983710e7e00c3221a7ba817fabec42"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::workflow_sink::resolve_mention_pubkeys (cyclomatic 18): buzz_relay::workflow_sink::resolve_mention_pubkeys 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/buzz-relay/src/workflow_sink.rs"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbad3ec22c49084e11fa195bf4bde66917b062cb7fc989fc02d95d0c84e36b6f"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::handlers::side_effects::handle_edit_metadata (cyclomatic 18): buzz_relay::handlers::side_effects::handle_edit_metadata has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/side_effects.rs"},"region":{"startLine":1568}}}],"partialFingerprints":{"codehealthFindingId/v1":"40d648c0dde31ad594af8b65de6480eab89560914fd41f3b3978aaa5fee12d16"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::handlers::ingest::validate_diff_event (cyclomatic 18): buzz_relay::handlers::ingest::validate_diff_event 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: buzz_relay::handlers::ingest::required_scope_for_kind (cyclomatic 24) 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/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":1344}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a6d0a38dd6c7fc4a03c9801bcacea0f42e5d148ab8747036d9428bc0f74cfc1"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::managed_agents::discovery::discover_acp_runtime_phase1 (cyclomatic 18): buzz_desktop::managed_agents::discovery::discover_acp_runtime_phase1 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":"desktop/src-tauri/src/managed_agents/discovery.rs"},"region":{"startLine":937}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d51ccb6d8d501e4e6ab3127bb8f3949198e9a86154891d2bc80ddbd4b4856ec"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::huddle::pipeline::post_connect_setup (cyclomatic 18): buzz_desktop::huddle::pipeline::post_connect_setup 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":"desktop/src-tauri/src/huddle/pipeline.rs"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f637e65861a48c3e2bcb3ca98cc8bec08221b69ef3561a818d61c33828f4ff2"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::commands::agent_discovery::install_acp_runtime_blocking (cyclomatic 18): buzz_desktop::commands::agent_discovery::install_acp_runtime_blocking 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":"desktop/src-tauri/src/commands/agent_discovery.rs"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"438220f665528fb5139ce62f429876256bc15f76bdb9d9b71f4c52d1dc8213d9"}},{"ruleId":"D1","level":"warning","message":{"text":"ThemePaginationControl.updateDots (cyclomatic 18): ThemePaginationControl.updateDots 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":"mobile/ios/Runner/ThemePaginationGlassControl.swift"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"a68fd6ab8be94ec1af0abb5bec1595147f488ca172de6ccde8853f6241699744"}},{"ruleId":"D1","level":"warning","message":{"text":"BuzzDevPushEnrollmentDriver.completeEnrollment (cyclomatic 18): BuzzDevPushEnrollmentDriver.completeEnrollment has cyclomatic complexity 18 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzDevPushEnrollmentDriver.swift"},"region":{"startLine":609}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f541c54c577b458c62f405620e0d483841a28235a188e8a37af3a0fa6fc0914"}},{"ruleId":"D1","level":"warning","message":{"text":"_DmAppBarTitle.build (cyclomatic 18): _DmAppBarTitle.build 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":"mobile/lib/features/channels/channel_detail_page/app_bar.dart"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"0044307b08e01a9eed000a9f2187d39ff4b1a72919d70f83cb31619ecce32a26"}},{"ruleId":"D1","level":"warning","message":{"text":"MessageContent.build (cyclomatic 18): MessageContent.build 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":"mobile/lib/features/channels/message_content.dart"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"04d57e47e15f8115062a086e1ab4bf671755841fa14ca64db0cc049aaf2ca066"}},{"ruleId":"D1","level":"warning","message":{"text":"MobileHuddleController.end (cyclomatic 18): MobileHuddleController.end 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":"mobile/lib/features/channels/mobile_huddle_controller.dart"},"region":{"startLine":431}}}],"partialFingerprints":{"codehealthFindingId/v1":"19735f3f87aee7370b7afab77a1e29bef09da399ed0eb859a4637ce27dff6c73"}},{"ruleId":"D1","level":"warning","message":{"text":"InviteJoinSheet.build (cyclomatic 18): InviteJoinSheet.build 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":"mobile/lib/features/invites/invite_join_sheet.dart"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d309fbf139889b6e728f5b70aef7296a738344a014123e9139740a5be4e0deb"}},{"ruleId":"D1","level":"warning","message":{"text":"SettingsProfileHeader.build (cyclomatic 18): SettingsProfileHeader.build 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":"mobile/lib/features/profile/settings_profile_header.dart"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"1399c183ff5e30336c8714b8ead297a3f044b8163a7e4459a4c238bd90dc0993"}},{"ruleId":"D1","level":"warning","message":{"text":"MethodChannelHuddleMedia._handleNativeCall (cyclomatic 18): MethodChannelHuddleMedia._handleNativeCall 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":"mobile/lib/shared/huddle/huddle_media.dart"},"region":{"startLine":627}}}],"partialFingerprints":{"codehealthFindingId/v1":"f76d120499d54640d6f7221e0e8909487eb3ade01c6cffc710a0131c70e1f304"}},{"ruleId":"D1","level":"warning","message":{"text":"AdminConsoleFeedbackTab.AttachmentViewer (cyclomatic 18): AdminConsoleFeedbackTab.AttachmentViewer has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 6 of the 18 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 216, 277, 206, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/AdminConsoleFeedbackTab.tsx"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb85b082f3c4878f9713ead0928fc8cbe2571d1428c15c01aac413ba63925e12"}},{"ruleId":"D1","level":"warning","message":{"text":"MemorySection.MemoryGraphView (cyclomatic 18): MemorySection.MemoryGraphView 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":"desktop/src/features/agent-memory/ui/MemorySection.tsx"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"82e32fcc144cf672498c574ca656b6f1ad1d5b03e55f78f683f58e63b50843e8"}},{"ruleId":"D1","level":"warning","message":{"text":"usePersonaSync.startPersonaSync (cyclomatic 18): usePersonaSync.startPersonaSync has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 1 of the 18 points is its own statement and the rest belongs to 8 function literals inside it that branch (lines 377, 337, 343, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/lib/usePersonaSync.ts"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"a77117d9cda71713fa9da6da7c879f98e0389f24803517595a5d058e82dfd909"}},{"ruleId":"D1","level":"warning","message":{"text":"AgentConfigPanel.AgentConfigSurfaceRows (cyclomatic 18): AgentConfigPanel.AgentConfigSurfaceRows has cyclomatic complexity 18 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 4 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentConfigPanel.tsx"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"b54ccbcd1100303fdf05b94c2a95682ade5b69b68396ad3700f679dd0ac1e2e9"}},{"ruleId":"D1","level":"warning","message":{"text":"useManagedAgentRuntimeReconciliation.useManagedAgentRuntimeReconciliation (cyclomatic 18): useManagedAgentRuntimeReconciliation.useManagedAgentRuntimeReconciliation has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 1 of the 18 points is its own statement and the rest belongs to 5 function literals inside it that branch (lines 75, 54, 118, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/useManagedAgentRuntimeReconciliation.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"610a6c35db95c0531a7a78b9e4ee57b91bb9af1266c8984802f1ee99ad3ff321"}},{"ruleId":"D1","level":"warning","message":{"text":"useHuddleParticipantRoster.useHuddleParticipantRoster (cyclomatic 18): useHuddleParticipantRoster.useHuddleParticipantRoster has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 6 of the 18 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 295, 310, 307, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/hooks/useHuddleParticipantRoster.ts"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0555127d4c3737ffd1d09eaf111f4cf8636e68cbe0b87c642e5134482e43f09"}},{"ruleId":"D1","level":"warning","message":{"text":"ComposerAddressControls.ComposerMentionButton (cyclomatic 18): ComposerAddressControls.ComposerMentionButton has cyclomatic complexity 18 (threshold 15). Of this number, 11 points are the body\u0027s own statements and 7 belong to 4 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/ComposerAddressControls.tsx"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"da5fd2af3dac206a62edd73b4f650fb0e746dcb302375a050ea518fc489aec96"}},{"ruleId":"D1","level":"warning","message":{"text":"MessageReactions.ReactionPill (cyclomatic 18): MessageReactions.ReactionPill has cyclomatic complexity 18 (threshold 15). Of this number, 11 points are the body\u0027s own statements and 7 belong to 4 function literals inside it that branch. 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":"desktop/src/features/messages/ui/MessageReactions.tsx"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"45a27a95c59aa8e4e7899ae18939c17fd2b411485fdf7b39142a524ce35d842f"}},{"ruleId":"D1","level":"warning","message":{"text":"MessageModerationMenuItems.MessageModerationMenuItems (cyclomatic 18): MessageModerationMenuItems.MessageModerationMenuItems has cyclomatic complexity 18 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. 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":"desktop/src/features/moderation/ui/MessageModerationMenuItems.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d7573a8fa273f4a907b8a2fe73b3052e7fc951b29c8b0bff47fff8731a5f456"}},{"ruleId":"D1","level":"warning","message":{"text":"AvatarStep.AvatarStep (cyclomatic 18): AvatarStep.AvatarStep has cyclomatic complexity 18 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 5 belong to one function literal inside it that branches. 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":"desktop/src/features/onboarding/ui/AvatarStep.tsx"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"17f919a404dd6e559544641faf1d1d986bf76bebb3d2c787b6053b67605d0ebb"}},{"ruleId":"D1","level":"warning","message":{"text":"agentReadiness.resolveAgentReadiness (cyclomatic 18): agentReadiness.resolveAgentReadiness 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":"desktop/src/features/onboarding/ui/agentReadiness.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"39ebaa58fcfe39ac3fa16bcc2b7b3764fc7414ea143ab5143cc53eae17a07a56"}},{"ruleId":"D1","level":"warning","message":{"text":"AnimatedAvatarCameraControls.AnimatedAvatarCameraControls (cyclomatic 18): AnimatedAvatarCameraControls.AnimatedAvatarCameraControls 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":"desktop/src/features/profile/ui/AnimatedAvatarCameraControls.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ecd4d3396fb823b6cb6aca90e9eade832928cdcac0cd2176c579cce3c14a7a4"}},{"ruleId":"D1","level":"warning","message":{"text":"projectDetailAgentContext.projectDetailAgentContextBlock (cyclomatic 18): projectDetailAgentContext.projectDetailAgentContextBlock 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":"desktop/src/features/projects/lib/projectDetailAgentContext.ts"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"0438d5db9b859745a4c07fc2312789d06c794464767726cd9213c0d0037a85b9"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectRepositorySource.RepoSourceDropdown (cyclomatic 18): ProjectRepositorySource.RepoSourceDropdown has cyclomatic complexity 18 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. 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":"desktop/src/features/projects/ui/ProjectRepositorySource.tsx"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc5754895642e5c778d627baa25b250594fe794a95ff620541eb2879fa41dfc8"}},{"ruleId":"D1","level":"warning","message":{"text":"SignOutSection.SignOutSection (cyclomatic 18): SignOutSection.SignOutSection has cyclomatic complexity 18 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/SignOutSection.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"c86e3a10317da7c15ab1c9c4663405853e6b05cdf198d8678fa1f4b4f29b1d4d"}},{"ruleId":"D1","level":"warning","message":{"text":"markdownFileCard.resolveSnapshotCard (cyclomatic 18): markdownFileCard.resolveSnapshotCard has cyclomatic complexity 18 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/markdownFileCard.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"53c1d3ab51e8681bc3149fea335829619b70480d427fc8ade892b99d441113e3"}},{"ruleId":"D1","level":"warning","message":{"text":"sidebar-action-card.SidebarCompactActionCard (cyclomatic 18): sidebar-action-card.SidebarCompactActionCard 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":"desktop/src/shared/ui/sidebar-action-card.tsx"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d6d2ae30b7544c27072689895e442e503fa94fabe6782e6b6e5155191dc6a94"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz-download.normalizeOperatingSystem (cyclomatic 18): buzz-download.normalizeOperatingSystem has cyclomatic complexity 18 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/shared/lib/buzz-download.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"e384c8fa16a3a8f43fa4d9b8de6b3eeee0870093345692e9b80d082c7cc9a466"}},{"ruleId":"D1","level":"warning","message":{"text":"assignmentStateForIssue (cyclomatic 18): assignmentStateForIssue has cyclomatic complexity 18 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 2 belong to 4 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/projectIssues.mjs"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c0993a405ca9d0a334574a3c8b717fa9936efda3cd37172a151b6190a3b0055"}},{"ruleId":"D1","level":"warning","message":{"text":"AcpClient::spawn_with_env (cyclomatic 17): AcpClient::spawn_with_env 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/buzz-acp/src/acp.rs"},"region":{"startLine":468}}}],"partialFingerprints":{"codehealthFindingId/v1":"61485db9179af8e8ee44c94e3cd0d693244f2a90522875598232a3798dccd447"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_acp::isolated_execution::execute (cyclomatic 17): buzz_acp::isolated_execution::execute 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/buzz-acp/src/isolated_execution.rs"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"04323f9542b10f7b68b68e4624ebe3967ee1dedf8d2f0d153782fe3e8d20b3ee"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_admin::reconcile_channels (cyclomatic 17): buzz_admin::reconcile_channels 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/buzz-admin/src/main.rs"},"region":{"startLine":623}}}],"partialFingerprints":{"codehealthFindingId/v1":"513fa7b5937fa7dfea1a29f49c09a162422b43783efd447c635faf7a2bc26508"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_agent::llm::anthropic_body (cyclomatic 17): buzz_agent::llm::anthropic_body 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/buzz-agent/src/llm.rs"},"region":{"startLine":566}}}],"partialFingerprints":{"codehealthFindingId/v1":"61e110d17c8f2d98ad4e0f4b10dccde7cc4791c4bd736ce5c9b122ed07324264"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_db::store::channel::update_channel (cyclomatic 17): buzz_db::store::channel::update_channel has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/channel.rs"},"region":{"startLine":506}}}],"partialFingerprints":{"codehealthFindingId/v1":"595a37a147afb897a64547e89d3f2f23030e82448e06c7d5a1fe69b87e60c0fa"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::audio::join::read_owner_control (cyclomatic 17): buzz_relay::audio::join::read_owner_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/buzz-relay/src/audio/join.rs"},"region":{"startLine":1584}}}],"partialFingerprints":{"codehealthFindingId/v1":"52861c7b0c581a26f51d9f0ecfb3ff68d7f87c5bb6657726d05b47a722d582ce"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::handlers::side_effects::handle_standard_deletion_event (cyclomatic 17): buzz_relay::handlers::side_effects::handle_standard_deletion_event 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/buzz-relay/src/handlers/side_effects.rs"},"region":{"startLine":2365}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbdf2a6232462ebd01745a5316dcb4067c2ec87252ba8c3c12dfb3864a163012"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_sdk::builders::build_diff_message (cyclomatic 17): buzz_sdk::builders::build_diff_message has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-sdk/src/builders.rs"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"47a1e0f69f795501b524596f5040c1ad04832c829c5068dcb7d1a76f9dde53a3"}},{"ruleId":"D1","level":"warning","message":{"text":"git_sign_nostr::parse_args (cyclomatic 17): git_sign_nostr::parse_args 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/git-sign-nostr/src/lib.rs"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c23f6b637570e3f137def6069df41e9b1742c6e0cd50ef54a9628fcd3d08cba"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::huddle::agents::sync_agents_for_active_huddle (cyclomatic 17): buzz_desktop::huddle::agents::sync_agents_for_active_huddle has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/huddle/agents.rs"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"8231f0e6aff9bf583f2aa5a19c627ca397c10aafce4ccd3349b7a2946d503215"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::migration::detach::detach_directory_backed_teams_in_dir (cyclomatic 17): buzz_desktop::migration::detach::detach_directory_backed_teams_in_dir 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":"desktop/src-tauri/src/migration/detach.rs"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"0291f7f553987c77937e225d8c849257d9addf0b0037b7b5a49980c1305c426f"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::managed_agents::discovery::resolve_command_uncached (cyclomatic 17): buzz_desktop::managed_agents::discovery::resolve_command_uncached 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":"desktop/src-tauri/src/managed_agents/discovery.rs"},"region":{"startLine":587}}}],"partialFingerprints":{"codehealthFindingId/v1":"2216ecd8c968aae5f6ffa69756455116679c841f984c228b4ed1572a92389fbe"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::app_state::resolve_identity_with_store (cyclomatic 17): buzz_desktop::app_state::resolve_identity_with_store 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":"desktop/src-tauri/src/app_state.rs"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"35b2b64cff5362026f5e0550239493ccce83b19906d03a3f5a16cbce0fb33ae8"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::archive::pipeline::commit_archive (cyclomatic 17): buzz_desktop::archive::pipeline::commit_archive 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":"desktop/src-tauri/src/archive/pipeline.rs"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d71aefc3e7c5466eada1635375ed00fdfcb43eb7fe503c87067a17159c9fafa"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::commands::mesh_llm::mesh_start_node (cyclomatic 17): buzz_desktop::commands::mesh_llm::mesh_start_node has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/mesh_llm.rs"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb39d6c210f791aa61963e5e6414fada8fe016d24d9a8c25aee257bf64f89882"}},{"ruleId":"D1","level":"warning","message":{"text":"_MobileHuddleDrawer.build (cyclomatic 17): _MobileHuddleDrawer.build has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_detail_page/huddle_drawer.dart"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"a25424e13cadb93a07277f69185773c35f14232d3546e958f155a66ab1c07bf5"}},{"ruleId":"D1","level":"warning","message":{"text":"_HuddleParticipantCluster.build (cyclomatic 17): _HuddleParticipantCluster.build 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":"mobile/lib/features/channels/channel_detail_page/huddle_participant_cluster.dart"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2eb111278d66022623a18f066edb1fa14f824c9c0fc267efec88415e0f3a14a"}},{"ruleId":"D1","level":"warning","message":{"text":"_ComposeBarLayout._buildBar (cyclomatic 17): _ComposeBarLayout._buildBar has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/compose_bar/layout.dart"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"28e66421b6ec36b66143c12c604eeb8570bf1924fa105b4d5a527077b54ecc36"}},{"ruleId":"D1","level":"warning","message":{"text":"_DeepLinkDispatcherState._maybeDispatchInvite (cyclomatic 17): _DeepLinkDispatcherState._maybeDispatchInvite 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":"mobile/lib/features/channels/deep_link_dispatcher.dart"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a6111aed7e6eb694d2f2e22ebe7ef6a21e76fe12eb9ede0c8ce841804db257d"}},{"ruleId":"D1","level":"warning","message":{"text":"_PersonInviteSection.build (cyclomatic 17): _PersonInviteSection.build has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/invites/invite_create_page/person_invite_section.dart"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f22d13dec7bccfc16ba8bb8e7f6e0737a2db915dca6fdf641f5640792b99ed6"}},{"ruleId":"D1","level":"warning","message":{"text":"InviteJoinNotifier.confirmJoin (cyclomatic 17): InviteJoinNotifier.confirmJoin 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":"mobile/lib/features/invites/invite_join_provider.dart"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"55ee885b015ae6701dab8c4edb52ead1112a7023046ace4eab901fa3d826cbf1"}},{"ruleId":"D1","level":"warning","message":{"text":"_SearchBody.build (cyclomatic 17): _SearchBody.build has cyclomatic complexity 17 (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":"mobile/lib/features/search/search_page.dart"},"region":{"startLine":439}}}],"partialFingerprints":{"codehealthFindingId/v1":"bce28e5ec088c51c127275964243767bece32a33f0a2e767c9d7cab712bf246c"}},{"ruleId":"D1","level":"warning","message":{"text":"HuddleSessionNotifier.join (cyclomatic 17): HuddleSessionNotifier.join 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":"mobile/lib/shared/huddle/huddle_session.dart"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"62c16af52648e43c9a5c5f414272449a787e921a4f6c721ac4dc8fd77be0846c"}},{"ruleId":"D1","level":"warning","message":{"text":"HuddleTransport._handleRoster (cyclomatic 17): HuddleTransport._handleRoster 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":"mobile/lib/shared/huddle/huddle_transport.dart"},"region":{"startLine":628}}}],"partialFingerprints":{"codehealthFindingId/v1":"08a8b460588450c90f4e0508a46dc6f63545f8cbb5a18a12063af936378b0906"}},{"ruleId":"D1","level":"warning","message":{"text":"BuzzPushLeaseSubscriptionState.fromJson (cyclomatic 17): BuzzPushLeaseSubscriptionState.fromJson has cyclomatic complexity 17 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/push/push_subscription.dart"},"region":{"startLine":377}}}],"partialFingerprints":{"codehealthFindingId/v1":"800f624a72a04662213f97f452e4c31463a7c61c6dfb8ed7bda47cea6a1e663d"}},{"ruleId":"D1","level":"warning","message":{"text":"channelAgents.provisionChannelManagedAgent (cyclomatic 17): channelAgents.provisionChannelManagedAgent has cyclomatic complexity 17 (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":"desktop/src/features/agents/channelAgents.ts"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"e06a5db001d5fa7bdcd8429171bf651bcc80434b47b62fedf5830b1403224477"}},{"ruleId":"D1","level":"warning","message":{"text":"agentConfigOptions.computeLocalModeGate (cyclomatic 17): agentConfigOptions.computeLocalModeGate 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":"desktop/src/features/agents/ui/agentConfigOptions.tsx"},"region":{"startLine":653}}}],"partialFingerprints":{"codehealthFindingId/v1":"e65a34fea41d91d5b0b2c78b0185d27d23383838207aa3404e1747d440e429b1"}},{"ruleId":"D1","level":"warning","message":{"text":"EditAgentAdvancedFields.EditAgentAdvancedFields (cyclomatic 17): EditAgentAdvancedFields.EditAgentAdvancedFields has cyclomatic complexity 17 (threshold 15). Of this number, 10 points are the body\u0027s own statements and 7 belong to 5 function literals inside it that branch. 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":"desktop/src/features/agents/ui/EditAgentAdvancedFields.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cd41bfb1b587b77f4eda6b403415466e2f29d7fb0c24888477d81922f608346"}},{"ruleId":"D1","level":"warning","message":{"text":"LifecycleActivity.LifecycleActivity (cyclomatic 17): LifecycleActivity.LifecycleActivity 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":"desktop/src/features/agents/ui/activityRenderClasses/LifecycleActivity.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae29d88667437f924171c9e3f92be6c324de46b0d06bcd89a2aaf7c060dda3c0"}},{"ruleId":"D1","level":"warning","message":{"text":"agentSessionTranscriptGrouping.buildBlocksForRun (cyclomatic 17): agentSessionTranscriptGrouping.buildBlocksForRun 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":"desktop/src/features/agents/ui/agentSessionTranscriptGrouping.ts"},"region":{"startLine":599}}}],"partialFingerprints":{"codehealthFindingId/v1":"20893d78016742bf90e37a727da29e4b638ee012f0118a88abdc591c44d58ee0"}},{"ruleId":"D1","level":"warning","message":{"text":"communityUnreadObserver.fetchCommunityUnread (cyclomatic 17): communityUnreadObserver.fetchCommunityUnread 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":"desktop/src/features/communities/communityUnreadObserver.ts"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"52c0a30d293c27d12472d2c39e9346a701f4652de8b135df83e73125a7e437e4"}},{"ruleId":"D1","level":"warning","message":{"text":"CommunityMembersCard.MemberRow (cyclomatic 17): CommunityMembersCard.MemberRow 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":"desktop/src/features/community-members/ui/CommunityMembersCard.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"7448151eee30e9369da216e3b6942937dc939fc8c8c05b3110d67258b54b200c"}},{"ruleId":"D1","level":"warning","message":{"text":"useForumDraftRecovery.useForumDraftRecovery (cyclomatic 17): useForumDraftRecovery.useForumDraftRecovery has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 1 of the 17 points is its own statement and the rest belongs to 3 function literals inside it that branch (lines 62, 35, 31). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/forum/ui/useForumDraftRecovery.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bf1cb1b86ae53589ab3f7fdd18ddb28eff933a5a5bd94bdcc030c433c0c24cb"}},{"ruleId":"D1","level":"warning","message":{"text":"channelLink.parseChannelLink (cyclomatic 17): channelLink.parseChannelLink has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/channelLink.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"75451827ba12dba8e6c506db91073061902a46fc418dff073c6bfa666e31872a"}},{"ruleId":"D1","level":"warning","message":{"text":"timelineItems.buildTimelineItems (cyclomatic 17): timelineItems.buildTimelineItems 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":"desktop/src/features/messages/lib/timelineItems.ts"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"d49cfab8d9e54b9dd94cb6bc6aaf617e88b00dcb6a31d5de0c26aec5c6c70cfb"}},{"ruleId":"D1","level":"warning","message":{"text":"useLoadMissingAncestors.useLoadMissingAncestors (cyclomatic 17): useLoadMissingAncestors.useLoadMissingAncestors has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 1 of the 17 points is its own statement and the rest belongs to 3 function literals inside it that branch (lines 30, 81, 21). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/useLoadMissingAncestors.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"83d88d4ccd5f0b54815f0f397af52ae3a96b51cb4517436d493841b359755927"}},{"ruleId":"D1","level":"warning","message":{"text":"AnimatedAvatarControls.AvatarFilmstripPicker (cyclomatic 17): AnimatedAvatarControls.AvatarFilmstripPicker has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 6 of the 17 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 408, 366, 387, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/AnimatedAvatarControls.tsx"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c8d712a6ea46d568b8cd9fb7f36203c210e0988d5f1fdc8956948af65480591"}},{"ruleId":"D1","level":"warning","message":{"text":"UserProfilePanelUtils.personaManagedAgentUpdate (cyclomatic 17): UserProfilePanelUtils.personaManagedAgentUpdate has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/UserProfilePanelUtils.ts"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"50b7ba336d458c261f62c3f323bd402461b70a6ef2eff7f448d00f405ad6b70a"}},{"ruleId":"D1","level":"warning","message":{"text":"CreateProjectWorkItemDialog.CreateProjectWorkItemDialog (cyclomatic 17): CreateProjectWorkItemDialog.CreateProjectWorkItemDialog has cyclomatic complexity 17 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. 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":"desktop/src/features/projects/ui/CreateProjectWorkItemDialog.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"461dd87d66c53726713e9c789dec2aabe414efbd656f212fbd0082e046781d47"}},{"ruleId":"D1","level":"warning","message":{"text":"CreateProjectFormSettings.CreateProjectFormSettings (cyclomatic 17): CreateProjectFormSettings.CreateProjectFormSettings has cyclomatic complexity 17 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 4 belong to 4 function literals inside it that branch. 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":"desktop/src/features/projects/ui/CreateProjectFormSettings.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"96b6c42affc2bea877604f268fc464722ba227d2be2911348139e95b1b9dff98"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectsAgentPromptPage.ConversationThread (cyclomatic 17): ProjectsAgentPromptPage.ConversationThread has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 4 of the 17 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 315, 242, 303, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectsAgentPromptPage.tsx"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"52b73eed6583bcf0fbcde28e427e9d6a44f7997365b63c3b6d8a5f0d41d0c13a"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectHomeContextPanel.ProjectHomeContextPanel (cyclomatic 17): ProjectHomeContextPanel.ProjectHomeContextPanel has cyclomatic complexity 17 (threshold 15). Of this number, 11 points are the body\u0027s own statements and 6 belong to 4 function literals inside it that branch. 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":"desktop/src/features/projects/ui/ProjectHomeContextPanel.tsx"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8a58d1f225ade73784e658502b9f51ec4fa60c87bf9254b9a9585c3254f8e40"}},{"ruleId":"D1","level":"warning","message":{"text":"NoteCard.NoteCard (cyclomatic 17): NoteCard.NoteCard has cyclomatic complexity 17 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. 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":"desktop/src/features/pulse/ui/NoteCard.tsx"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f49fe9f0fa31baa7dfc050352a970aba657e4887d4885c082a2a7a323308175"}},{"ruleId":"D1","level":"warning","message":{"text":"PrivateKeyBackupRow.PrivateKeyBackupRow (cyclomatic 17): PrivateKeyBackupRow.PrivateKeyBackupRow 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":"desktop/src/features/settings/ui/PrivateKeyBackupRow.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"2dd489904a3d2fccc68c3373c578362ceccdf1a823e72b757f8be169617c93c8"}},{"ruleId":"D1","level":"warning","message":{"text":"useCreateChannelForm.useCreateChannelForm (cyclomatic 17): useCreateChannelForm.useCreateChannelForm has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 3 of the 17 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 156, 102, 128, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/lib/useCreateChannelForm.ts"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"9edfa07b35729c1223879932a255138aed4772665a154629538d93df936be443"}},{"ruleId":"D1","level":"warning","message":{"text":"SidebarDnd.SidebarDndContext (cyclomatic 17): SidebarDnd.SidebarDndContext has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 3 of the 17 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 233, 208). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/SidebarDnd.tsx"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"21f28069d962d1e3ac53d5157c50272e0ba9d0748e4afb18607412c08b96207a"}},{"ruleId":"D1","level":"warning","message":{"text":"workflowConditionExpression.splitTopLevel (cyclomatic 17): workflowConditionExpression.splitTopLevel 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":"desktop/src/features/workflows/ui/workflowConditionExpression.ts"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"34fcaaf61e5c6e00c72447f953e8f0f3d395d0b5116cdc0cf8ff273d655a00d3"}},{"ruleId":"D1","level":"warning","message":{"text":"RelayClient.resetConnection (cyclomatic 17): RelayClient.resetConnection has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/api/relayClientSession.ts"},"region":{"startLine":1124}}}],"partialFingerprints":{"codehealthFindingId/v1":"46ddbabe9e6d3fbc7134a1a1e9756e073862aa19872721571a6e134c19e45ba1"}},{"ruleId":"D1","level":"warning","message":{"text":"RelayReconnectController.start (cyclomatic 17): RelayReconnectController.start has cyclomatic complexity 17 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 4 belong to 3 function literals inside it that branch. 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":"desktop/src/shared/api/relayReconnectController.ts"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c8c91b0c76c9d4ca79272829855bcc56884f049de4113c4560b74b39f9d33d8"}},{"ruleId":"D1","level":"warning","message":{"text":"emojiOnly.readGrapheme (cyclomatic 17): emojiOnly.readGrapheme 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":"desktop/src/shared/lib/emojiOnly.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4cc4fe66040bfb8dc79b8704c605620073804752709abbe55a24cb56d3e4863"}},{"ruleId":"D1","level":"warning","message":{"text":"EmojiBurstProvider.EmojiBurstProvider (cyclomatic 17): EmojiBurstProvider.EmojiBurstProvider has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 1 of the 17 points is its own statement and the rest belongs to 6 function literals inside it that branch (lines 567, 671, 686, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/EmojiBurstProvider.tsx"},"region":{"startLine":556}}}],"partialFingerprints":{"codehealthFindingId/v1":"33ae30088bdd04792ef50dcbd60b5a53747c69a29b51f1af5aed9e71f6c61e82"}},{"ruleId":"D1","level":"warning","message":{"text":"parseImeta.parseImetaTags (cyclomatic 17): parseImeta.parseImetaTags 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":"desktop/src/shared/ui/markdown/parseImeta.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fd2c6124a9173e384d9e8b4a447c0ca42c5eb5835572a9f349b29d7decae04d"}},{"ruleId":"D1","level":"warning","message":{"text":"sidebar.SidebarRail (cyclomatic 17): sidebar.SidebarRail has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 2 of the 17 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 515, 484, 455). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/sidebar.tsx"},"region":{"startLine":425}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d203229bb4d7c811667470286237cc8b32f11cd722934e0901bcc0348d22ecb"}},{"ruleId":"D1","level":"warning","message":{"text":"AcpClient::read_until_response (cyclomatic 16): AcpClient::read_until_response 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/buzz-acp/src/acp.rs"},"region":{"startLine":1247}}}],"partialFingerprints":{"codehealthFindingId/v1":"e464b7952e019df41572b7eea272a1cea21e69fd9accd11e4146bceb8230d64c"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_acp::pool::parse_nostr_thread_response_with_meta (cyclomatic 16): buzz_acp::pool::parse_nostr_thread_response_with_meta 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/buzz-acp/src/pool.rs"},"region":{"startLine":4629}}}],"partialFingerprints":{"codehealthFindingId/v1":"3dd2bb0c8e272580b869e097586488266208948b561c940749df5643777be034"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_acp::relay::drain_commands (cyclomatic 16): buzz_acp::relay::drain_commands 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/buzz-acp/src/relay.rs"},"region":{"startLine":2973}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa374c8a9cb7daeba388df1e18d4e6b26f3c0c42f9180852b36e620ae54e59be"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_acp::relay::wait_for_reconnect (cyclomatic 16): buzz_acp::relay::wait_for_reconnect has cyclomatic complexity 16 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/relay.rs"},"region":{"startLine":3203}}}],"partialFingerprints":{"codehealthFindingId/v1":"da69dd702cce9c5f24fb4d708db98089a991e8847b54fbe0b8c57f7d310961ff"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_acp::setup_mode::run_setup_listener (cyclomatic 16): buzz_acp::setup_mode::run_setup_listener 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/buzz-acp/src/setup_mode.rs"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff09456f3222b323456e4444fc2c4d272e3150c3522bef1b42f994026aef39af"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_agent::session_new (cyclomatic 16): buzz_agent::session_new 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/buzz-agent/src/lib.rs"},"region":{"startLine":432}}}],"partialFingerprints":{"codehealthFindingId/v1":"6503452c14da524603143e9f2b0926464be39538f6ac4b4980cecc3d4599683e"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_backend_kubernetes::env::build_env (cyclomatic 16): buzz_backend_kubernetes::env::build_env 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/buzz-backend-kubernetes/src/env.rs"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cf351aaef3951a2ec3f92299d7067106f98aee849df8c751e7ed0278b23efbe"}},{"ruleId":"D1","level":"warning","message":{"text":"BuzzClient::submit_moderation_event (cyclomatic 16): BuzzClient::submit_moderation_event 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/buzz-cli/src/client.rs"},"region":{"startLine":980}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c1b7757c85619ace303857de01b752d318d71c2631bf0d9d7027a7f7a6e7f17"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_cli::commands::mem::cmd_patch (cyclomatic 16): buzz_cli::commands::mem::cmd_patch 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/buzz-cli/src/commands/mem.rs"},"region":{"startLine":538}}}],"partialFingerprints":{"codehealthFindingId/v1":"3007bcf49a483e310cd85a2f9f6d0259a49531c68c4f5700918c1f93b35a7985"}},{"ruleId":"D1","level":"warning","message":{"text":"Db::route_read (cyclomatic 16): Db::route_read 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/buzz-db/src/runtime/mod.rs"},"region":{"startLine":1273}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b4a2aa35d1e98e795299015633704843f7da4f14b870342d0822f906d903c8a"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_db::store::thread::get_thread_replies_on (cyclomatic 16): buzz_db::store::thread::get_thread_replies_on 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/buzz-db/src/store/thread.rs"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2d9e024f3e89c9be299127e731b300f63a1ff14b8b5141aa8c3428de0105103"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_db::store::channel_members::add_member (cyclomatic 16): buzz_db::store::channel_members::add_member 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/buzz-db/src/store/channel_members.rs"},"region":{"startLine":394}}}],"partialFingerprints":{"codehealthFindingId/v1":"35375d873ee4dc99734b410092116d5304f07d17d3aaa920bfd48ad613815a51"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_dev_mcp::rg::scan_file (cyclomatic 16): buzz_dev_mcp::rg::scan_file has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-dev-mcp/src/rg.rs"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"33413defa37cfe7d389ce5fe0748be1843fbe4671321fedfca144c6926c569ca"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_media::validation::validate_video_file (cyclomatic 16): buzz_media::validation::validate_video_file has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top. This is NOT this file\u0027s highest cyclomatic complexity: buzz_media::validation::file_mime_to_ext (cyclomatic 35) 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/buzz-media/src/validation.rs"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa77fe86dd703a00549d0987721aea9702af34682e8d53bec6c728f1e656ed1e"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_media::upload::process_video_upload (cyclomatic 16): buzz_media::upload::process_video_upload 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/buzz-media/src/upload.rs"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"598f7c9b3fa5f2670191ed94f56a17666a01e9e574bbce6e862f6b95b1fd12f9"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_pair_relay::validate_nip44_content (cyclomatic 16): buzz_pair_relay::validate_nip44_content 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/buzz-pair-relay/src/lib.rs"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"37d69f9fc41032712afa54bebf8715ba79bc35209bb979d04b1dd48287c38932"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::audio::handler::recv_loop (cyclomatic 16): buzz_relay::audio::handler::recv_loop 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/buzz-relay/src/audio/handler.rs"},"region":{"startLine":1048}}}],"partialFingerprints":{"codehealthFindingId/v1":"7851624ea973b4f58a000b61893966a4ae03e899716c21e55a5900a537c15fd1"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::handlers::ingest::validate_engram_nip44_content (cyclomatic 16): buzz_relay::handlers::ingest::validate_engram_nip44_content has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top. This is NOT this file\u0027s highest cyclomatic complexity: buzz_relay::handlers::ingest::required_scope_for_kind (cyclomatic 24) 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/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":1889}}}],"partialFingerprints":{"codehealthFindingId/v1":"4907da976c7518ba7358ca968b6cd0be5bc3acc94f034fa353d5baa90977ac9d"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::handlers::ingest::validate_agent_turn_metric_envelope (cyclomatic 16): buzz_relay::handlers::ingest::validate_agent_turn_metric_envelope 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. This is NOT this file\u0027s highest cyclomatic complexity: buzz_relay::handlers::ingest::required_scope_for_kind (cyclomatic 24) 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/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":1956}}}],"partialFingerprints":{"codehealthFindingId/v1":"be17c204fd29de85659e340e078776133d9686b587bbad1aaf49e25f2f15a7fb"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::handlers::ingest::validate_event_reminder (cyclomatic 16): buzz_relay::handlers::ingest::validate_event_reminder has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top. This is NOT this file\u0027s highest cyclomatic complexity: buzz_relay::handlers::ingest::required_scope_for_kind (cyclomatic 24) 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/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":2057}}}],"partialFingerprints":{"codehealthFindingId/v1":"d71ace7b2e59ac8ef09b09b5814cf96b4019c1bf6dfa86ebeb533bcaac390599"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::handlers::push_lease::validate_envelope (cyclomatic 16): buzz_relay::handlers::push_lease::validate_envelope 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/buzz-relay/src/handlers/push_lease.rs"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"dacd50110be80b5541454fde112a479338b7eb33698292bc0eddd8f4442a33e6"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::readiness::final_reason (cyclomatic 16): buzz_relay::readiness::final_reason 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/buzz-relay/src/readiness.rs"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"b30efc8f6cb20a7f891c888c1428c42896f658e8ace86a71d99174b47df73f2b"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_relay::api::bridge::handle_bridge_search (cyclomatic 16): buzz_relay::api::bridge::handle_bridge_search 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/buzz-relay/src/api/bridge.rs"},"region":{"startLine":2214}}}],"partialFingerprints":{"codehealthFindingId/v1":"89fe35e6244c10a613e863a39ad0438f26fd7c83992ca39d265f7e61a82122a7"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_sdk::builders::build_git_status (cyclomatic 16): buzz_sdk::builders::build_git_status has cyclomatic complexity 16 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-sdk/src/builders.rs"},"region":{"startLine":1553}}}],"partialFingerprints":{"codehealthFindingId/v1":"c18883ebce5b03bc2eff9457846e505147604c2ad14eac4b912b5f164b316beb"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_voice::imported::decode_media (cyclomatic 16): buzz_voice::imported::decode_media 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/buzz-voice/src/imported.rs"},"region":{"startLine":425}}}],"partialFingerprints":{"codehealthFindingId/v1":"6622b5bed72078b9e4d2e46c1855d9b84f35b33b9943fac495d957f99e18479c"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::managed_agents::team_catalog::is_safe_catalog_avatar_url (cyclomatic 16): buzz_desktop::managed_agents::team_catalog::is_safe_catalog_avatar_url 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":"desktop/src-tauri/src/managed_agents/team_catalog.rs"},"region":{"startLine":408}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6bf417c5b40a4d7e6f61c86d57bfcd3fbcbf3fb26ffd0c131db0d446c2f2bfa"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::managed_agents::team_catalog::validate_member (cyclomatic 16): buzz_desktop::managed_agents::team_catalog::validate_member 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":"desktop/src-tauri/src/managed_agents/team_catalog.rs"},"region":{"startLine":496}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f8d5a423d751ff3d5a2ab37defed52b1e9aeea7d0d2637088eb3db22443652c"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::commands::media::sanitize_image_for_upload (cyclomatic 16): buzz_desktop::commands::media::sanitize_image_for_upload 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":"desktop/src-tauri/src/commands/media.rs"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f6cbf51e9505b3d02baea3184ef9e8a7d7065be23b6db6b694ee7f9c8a561af"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::managed_agents::config_bridge::effort::resolve_effective_effort (cyclomatic 16): buzz_desktop::managed_agents::config_bridge::effort::resolve_effective_effort 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":"desktop/src-tauri/src/managed_agents/config_bridge/effort.rs"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"6514ef4efbddc5ce765950dbf9022d1e0d78e7481ce8adcbce4ac76b9b48b694"}},{"ruleId":"D1","level":"warning","message":{"text":"buzz_desktop::huddle::stt::process_16k_samples (cyclomatic 16): buzz_desktop::huddle::stt::process_16k_samples 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":"desktop/src-tauri/src/huddle/stt.rs"},"region":{"startLine":660}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfe9ce8fd4e0d81e3facc96eb6a6e36c228b14f85f3927a9d9c70974bdf08b2d"}},{"ruleId":"D1","level":"warning","message":{"text":"AndroidMediaSanitizer.scrubJpeg (cyclomatic 16): AndroidMediaSanitizer.scrubJpeg 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":"mobile/android/app/src/main/kotlin/xyz/block/buzz/mobile/AndroidMediaSanitizer.kt"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d2dc2586efdb60ef4b37d32660e4115eac0bf5ce6a06d39afbfdc4fe3dc60ec"}},{"ruleId":"D1","level":"warning","message":{"text":"exhaustive.test_cross_device_compaction_suppression (cyclomatic 16): exhaustive.test_cross_device_compaction_suppression 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":"docs/formal/nip-rs-unread/exhaustive.py"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"08f521ce93346b8b7bc67f427335d6d88c83771ec46d72a6cb357116c41af950"}},{"ruleId":"D1","level":"warning","message":{"text":"AppDelegate.didInitializeImplicitFlutterEngine (cyclomatic 16): AppDelegate.didInitializeImplicitFlutterEngine 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":"mobile/ios/Runner/AppDelegate.swift"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"37d286add701b4f5d257e1c492d00751d8d70e2380c9fce538077015f612a3f0"}},{"ruleId":"D1","level":"warning","message":{"text":"ActivityNotifier._resurfaceHiddenDm (cyclomatic 16): ActivityNotifier._resurfaceHiddenDm 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":"mobile/lib/features/activity/activity_provider.dart"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"72300575d02cae4ca6d50943d3d113f4d80de0cb250748808791489bc5b2b6d6"}},{"ruleId":"D1","level":"warning","message":{"text":"ChannelMessagesNotifier.cachedThreadReplyIds (cyclomatic 16): ChannelMessagesNotifier.cachedThreadReplyIds 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":"mobile/lib/features/channels/channel_messages_provider.dart"},"region":{"startLine":536}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd26211c93aefd2978ba02e64a4ff7d254f8f4121a2e2a2bfdac73ece3231ffd"}},{"ruleId":"D1","level":"warning","message":{"text":"_MorphingQuickActionsButton.build (cyclomatic 16): _MorphingQuickActionsButton.build 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":"mobile/lib/features/channels/channels_page/quick_actions.dart"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"acb3ac523e4412ca060e1f15ef4823b067220765e4a4a453791690346555e378"}},{"ruleId":"D1","level":"warning","message":{"text":"_MentionSuggestionInfo.build (cyclomatic 16): _MentionSuggestionInfo.build 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":"mobile/lib/features/channels/compose_bar/suggestions.dart"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ae42d0f28496d4c8529396b20b44ae40a7ea665df5603bbf00ac3ca2a6c4590"}},{"ruleId":"D1","level":"warning","message":{"text":"_MessageLongPressRegion.build (cyclomatic 16): _MessageLongPressRegion.build 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":"mobile/lib/features/channels/message_long_press_region.dart"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebab0dd70aa8281d85279030f55dfa1c99e71b539520bf8813f391b875b39c4f"}},{"ruleId":"D1","level":"warning","message":{"text":"_ProfileTextEditSheet.build (cyclomatic 16): _ProfileTextEditSheet.build 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":"mobile/lib/features/profile/profile_edit_page.dart"},"region":{"startLine":649}}}],"partialFingerprints":{"codehealthFindingId/v1":"c193de399d6b771c87794293e50991d5f06c138d468805272ff1c64286f9ed69"}},{"ruleId":"D1","level":"warning","message":{"text":"_ProfileTextEditSheet.build (cyclomatic 16): _ProfileTextEditSheet.build 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":"mobile/lib/features/profile/profile_text_editor.dart"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"4115a9cf7657cfc1c7e3085b0ca60511101b1176de4ee3013ef33e8c36be3174"}},{"ruleId":"D1","level":"warning","message":{"text":"backForwardChords.matchBackForwardChord (cyclomatic 16): backForwardChords.matchBackForwardChord 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":"desktop/src/app/navigation/backForwardChords.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf6f92798dda949e62d60a39852b7ece42b1015747ba58cbc27b778b15b81227"}},{"ruleId":"D1","level":"warning","message":{"text":"MemorySection.MemoryEntryAccordion (cyclomatic 16): MemorySection.MemoryEntryAccordion has cyclomatic complexity 16 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. 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":"desktop/src/features/agent-memory/ui/MemorySection.tsx"},"region":{"startLine":526}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ec6b911c93b093009eaaec0d5fd0109c76d6dd970d0fc2d3daaeb577ee022ce"}},{"ruleId":"D1","level":"warning","message":{"text":"agentAutocompleteEligibility.getMentionableAgentPubkeys (cyclomatic 16): agentAutocompleteEligibility.getMentionableAgentPubkeys 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":"desktop/src/features/agents/lib/agentAutocompleteEligibility.ts"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7356b0c11898f6ae7ff06adb8ba75eba35015519a6c79785eafdd971ab08db5"}},{"ruleId":"D1","level":"warning","message":{"text":"observerRelayStore.appendAgentEvents (cyclomatic 16): observerRelayStore.appendAgentEvents 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":"desktop/src/features/agents/observerRelayStore.ts"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"18f43ad6f5f2ff01eb7d560e6161e5aa8c320e552d6b397e3a92eaed80b5cdcf"}},{"ruleId":"D1","level":"warning","message":{"text":"PersonaAdvancedFields.PersonaAdvancedFields (cyclomatic 16): PersonaAdvancedFields.PersonaAdvancedFields has cyclomatic complexity 16 (threshold 15). Of this number, 9 points are the body\u0027s own statements and 7 belong to 5 function literals inside it that branch. 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":"desktop/src/features/agents/ui/PersonaAdvancedFields.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"27aab8d761c22e8c3c37a139fb6bc9f1699dcba3414a7b6480de20f2e7e65ef7"}},{"ruleId":"D1","level":"warning","message":{"text":"observedUnreadStorage.readObservedUnreadFromStorage (cyclomatic 16): observedUnreadStorage.readObservedUnreadFromStorage 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":"desktop/src/features/channels/observedUnreadStorage.ts"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"59c02885e904884c0163d25ffbd07082ce984e74f40a88031c18f241227b2e1a"}},{"ruleId":"D1","level":"warning","message":{"text":"useCommunityUnread.useCommunityUnread (cyclomatic 16): useCommunityUnread.useCommunityUnread has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 1 of the 16 points is its own statement and the rest belongs to 6 function literals inside it that branch (lines 113, 164, 73, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/communities/useCommunityUnread.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"86b213c793862264c0e1f88d9bfb5f3d86f1ea965e409d42653a93fe9e7416ee"}},{"ruleId":"D1","level":"warning","message":{"text":"CommunityMembersSettingsCard.CommunityMembersSettingsCard (cyclomatic 16): CommunityMembersSettingsCard.CommunityMembersSettingsCard has cyclomatic complexity 16 (threshold 15). Of this number, 11 points are the body\u0027s own statements and 5 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/community-members/ui/CommunityMembersSettingsCard.tsx"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"815a0bf603fdcf3092730ab138b5107bbf2c5a6d87609e3af3eb0fdc72d9bec2"}},{"ruleId":"D1","level":"warning","message":{"text":"useEnsureAgentMentionsReady.useEnsureAgentMentionsReady (cyclomatic 16): useEnsureAgentMentionsReady.useEnsureAgentMentionsReady has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 1 of the 16 points is its own statement and the rest belongs to one function literal inside it that branches (line 74). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useEnsureAgentMentionsReady.ts"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"20d39d984e0f94aaa9e527bd5aa619fcc3ed01534ccd3962cc83502c8f977048"}},{"ruleId":"D1","level":"warning","message":{"text":"useDraftPersistSnapshot.useDraftPersistLifecycle (cyclomatic 16): useDraftPersistSnapshot.useDraftPersistLifecycle has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 1 of the 16 points is its own statement and the rest belongs to 5 function literals inside it that branch (lines 184, 229, 257, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useDraftPersistSnapshot.ts"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"4535065c4ac8844df52c2d2990fd0584bad4e85ddaf56a00815337f2f398a704"}},{"ruleId":"D1","level":"warning","message":{"text":"MessageComposerToolbar.MessageComposerToolbar (cyclomatic 16): MessageComposerToolbar.MessageComposerToolbar 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":"desktop/src/features/messages/ui/MessageComposerToolbar.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5840700e504ac6dfa9104d2d1d37408915d13ade1196b8a5b4c2a0bd139f22a"}},{"ruleId":"D1","level":"warning","message":{"text":"desktop.listenForDesktopNotificationActions (cyclomatic 16): desktop.listenForDesktopNotificationActions has cyclomatic complexity 16 (threshold 15). Of this number, 11 points are the body\u0027s own statements and 5 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/notifications/lib/desktop.ts"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"775943417d2f5f0195e625855ea43d33a3dd570ab583c79e248484471d6b3552"}},{"ruleId":"D1","level":"warning","message":{"text":"encryptedBackup.encryptedBackupReducer (cyclomatic 16): encryptedBackup.encryptedBackupReducer 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":"desktop/src/features/onboarding/lib/encryptedBackup.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f19da4b1c4da1b60c735490927e1e89cc0827d87581de5c90b2aaaf11a25a48"}},{"ruleId":"D1","level":"warning","message":{"text":"AnimatedAvatarBackdropPanel.AnimatedAvatarBackdropPanel (cyclomatic 16): AnimatedAvatarBackdropPanel.AnimatedAvatarBackdropPanel has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 2 of the 16 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 38, 64). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/AnimatedAvatarBackdropPanel.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f26f17b9c42ee167311195a3ec807f3a0757d3f19bc76d177019ec53fa9216c"}},{"ruleId":"D1","level":"warning","message":{"text":"projectModels.validateProjectEventEnvelope (cyclomatic 16): projectModels.validateProjectEventEnvelope 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":"desktop/src/features/projects/projectModels.ts"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f7a33d0579fb391145bb00d1ab9ddb771fd240771931f6504bff32516583783"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectBranchDialogs.CreateProjectBranchDialog (cyclomatic 16): ProjectBranchDialogs.CreateProjectBranchDialog has cyclomatic complexity 16 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. 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":"desktop/src/features/projects/ui/ProjectBranchDialogs.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"b728aaecd69efd82989b0d8c8cad193daedecb5857d86dfdabefa954d504daa8"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectDetailFeedPanels.ActivityPanel (cyclomatic 16): ProjectDetailFeedPanels.ActivityPanel has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 7 of the 16 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 326, 345). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectDetailFeedPanels.tsx"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"604a6cf88dfc2138c3381b8e410ff9e21edb360b4cf46a052a6a642db7b8b2e7"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectWorkItemContextActions.ProjectWorkItemContextActions (cyclomatic 16): ProjectWorkItemContextActions.ProjectWorkItemContextActions has cyclomatic complexity 16 (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":"desktop/src/features/projects/ui/ProjectWorkItemContextActions.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"8314cd4549e3b46e78ffcc63dd3ed0b4af57f4ba13933378aba969901f81d200"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectsSectionSearch.ProjectsSectionSearch (cyclomatic 16): ProjectsSectionSearch.ProjectsSectionSearch has cyclomatic complexity 16 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 3 belong to 3 function literals inside it that branch. 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":"desktop/src/features/projects/ui/ProjectsSectionSearch.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f62dd998ab70cb7d7ab4924599372a3acd5ca91b73163a84538041da72946f4"}},{"ruleId":"D1","level":"warning","message":{"text":"useSearchMenuKeyboardNavigation.useSearchMenuKeyboardNavigation (cyclomatic 16): useSearchMenuKeyboardNavigation.useSearchMenuKeyboardNavigation has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 2 of the 16 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 43, 29). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/search/ui/useSearchMenuKeyboardNavigation.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9363018ffdd9ef8c5a1d77553f6533c2e89ed2387f1897ff2bc7ec71dc8685f"}},{"ruleId":"D1","level":"warning","message":{"text":"encryptedBackup.encryptedBackupReducer (cyclomatic 16): encryptedBackup.encryptedBackupReducer 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":"desktop/src/features/settings/lib/encryptedBackup.ts"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9b20f346bc042ab61ec003e52fccc3b1ee4ca4cd39e64664ff406fcb17266a1"}},{"ruleId":"D1","level":"warning","message":{"text":"HarnessRow.RuntimeOverflowMenu (cyclomatic 16): HarnessRow.RuntimeOverflowMenu has cyclomatic complexity 16 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. 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":"desktop/src/features/settings/ui/HarnessRow.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c52b4e8cd19a043cc9855f85c012e07d7bf833fc92545d83eee85bd340bfe29"}},{"ruleId":"D1","level":"warning","message":{"text":"SettingsView.SettingsView (cyclomatic 16): SettingsView.SettingsView has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 6 of the 16 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 134, 181, 187, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/SettingsView.tsx"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"16aaabdaf0e1fe9c857fdaea2ef3646d00a9ffcca097b6f9469b98590df31e7d"}},{"ruleId":"D1","level":"warning","message":{"text":"channelSectionsStorage.parseChannelSectionPayload (cyclomatic 16): channelSectionsStorage.parseChannelSectionPayload has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 7 of the 16 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 43, 74). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/lib/channelSectionsStorage.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"956a000eaee2a0b7ed0421dc1cc5927f576aabb6c1b2118ac9f5c6dd4ef634b8"}},{"ruleId":"D1","level":"warning","message":{"text":"ChannelActivityPopover.ChannelActivityPopover (cyclomatic 16): ChannelActivityPopover.ChannelActivityPopover has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 6 of the 16 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 356, 298, 320, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/ChannelActivityPopover.tsx"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"89104daa15283a8efc8e3400de2540684f691599ee8a447d6c02e5c2f1edee15"}},{"ruleId":"D1","level":"warning","message":{"text":"SidebarRelayConnectionCard.SidebarRelayConnectionCompactCard (cyclomatic 16): SidebarRelayConnectionCard.SidebarRelayConnectionCompactCard 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":"desktop/src/features/sidebar/ui/SidebarRelayConnectionCard.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"31de5625b13805136d53ec8442ae0ea28dfbf92d5190b54e27689f4be8139973"}},{"ruleId":"D1","level":"warning","message":{"text":"rich-link-preview-attachment.RichLinkPreviewAttachment (cyclomatic 16): rich-link-preview-attachment.RichLinkPreviewAttachment 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":"desktop/src/shared/ui/rich-link-preview-attachment.tsx"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"3676f69b39deb9ce24a3c2b31461dbb965faef3e069b096827b073162513f16f"}},{"ruleId":"D1","level":"warning","message":{"text":"ReposPage.ReposPage (cyclomatic 16): ReposPage.ReposPage has cyclomatic complexity 16 (threshold 15). Of this number, 10 points are the body\u0027s own statements and 6 belong to 3 function literals inside it that branch. 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":"web/src/features/repos/ui/ReposPage.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"92cbd954a7c1475c5abd00e54767b731ec5146dd8f8475cd337c9cdc7489bfd5"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::run_harness (cognitive 395): buzz_acp::run_harness has cognitive complexity 395 (threshold 15). Drivers by points: if/else 104 (275 pts), loops 22 (57 pts), match/switch 22 (51 pts), boolean chains 12 (nesting depth added 235). 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/buzz-acp/src/lib.rs"},"region":{"startLine":2575}}}],"partialFingerprints":{"codehealthFindingId/v1":"1892d59675f159bfcab3f2b20c0442b1f8ca1064e284a410db802f40c12a9131"}},{"ruleId":"D2","level":"warning","message":{"text":"ProfileAvatarEditor.ProfileAvatarEditor (cognitive 250): ProfileAvatarEditor.ProfileAvatarEditor has cognitive complexity 250 (threshold 15). Drivers by points: ternaries 65 (169 pts), if/else 35 (45 pts), boolean chains 36 (nesting depth added 114). Of this number, 148 points are the body\u0027s own statements and 102 belong to 26 function literals inside it that branch. 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":"desktop/src/features/profile/ui/ProfileAvatarEditor.tsx"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"f25ed6f5da6f1a879927e5c6d5a653f3212f6cf67c3d04bfc05e695d3b4969e3"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelPane.ChannelPane (cognitive 232): ChannelPane.ChannelPane has cognitive complexity 232 (threshold 15). Drivers by points: ternaries 60 (180 pts), boolean chains 38, if/else 6 (10 pts), loops 4 (nesting depth added 124). Of this number, 149 points are the body\u0027s own statements and 83 belong to 11 function literals inside it that branch. 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":"desktop/src/features/channels/ui/ChannelPane.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"227bad694161404c26cfc911842fbd8e22af3246f34cc55d952753d96887f5bb"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentCreationPreview.AgentCreationPreview (cognitive 231): AgentCreationPreview.AgentCreationPreview has cognitive complexity 231 (threshold 15). Drivers by points: ternaries 66 (164 pts), if/else 29 (34 pts), boolean chains 33 (nesting depth added 103). Of this number, 173 points are the body\u0027s own statements and 58 belong to 15 function literals inside it that branch. 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":"desktop/src/features/agents/ui/AgentCreationPreview.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee94e7a1a59318e4bdf03aed9da2dcf0cb90af4339ab72e8014511f1599bc090"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::ingest::ingest_event_inner (cognitive 212): buzz_relay::handlers::ingest::ingest_event_inner has cognitive complexity 212 (threshold 15). Drivers by points: if/else 109 (160 pts), match/switch 18 (34 pts), boolean chains 18 (nesting depth added 67). To reduce it, split the body into named stages: move each independent step or branch into 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/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":2252}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac938325bd06570c6dae6e08cb2399fb85c37d6c858d0f6285835b01ce48711e"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentConfigFields.AgentConfigFields (cognitive 195): AgentConfigFields.AgentConfigFields has cognitive complexity 195 (threshold 15). Drivers by points: ternaries 68 (104 pts), boolean chains 53, if/else 30 (36 pts), loops 1 (2 pts) (nesting depth added 43). Of this number, 144 points are the body\u0027s own statements and 51 belong to 14 function literals 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":"desktop/src/features/agents/ui/AgentConfigFields.tsx"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"051af063b8ccb723ead70151248bcb36699cc1db22bb6051e652e1e80959b4eb"}},{"ruleId":"D2","level":"warning","message":{"text":"AnimatedAvatarCapture.AnimatedAvatarCapture (cognitive 183): AnimatedAvatarCapture.AnimatedAvatarCapture has cognitive complexity 183 (threshold 15). Drivers by points: ternaries 58 (86 pts), boolean chains 56, if/else 30 (36 pts), error handling 4, loops 1 (nesting depth added 34). Of this number, 116 points are the body\u0027s own statements and 67 belong to 19 function literals 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":"desktop/src/features/profile/ui/AnimatedAvatarCapture.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"038f6624b9b5a9cfb3b6190f2c4feca55d180058bfc9821a431e6f554e98e73b"}},{"ruleId":"D2","level":"warning","message":{"text":"_MessageList.build (cognitive 178): _MessageList.build has cognitive complexity 178 (threshold 15). Drivers by points: if/else 66 (81 pts), boolean chains 73, ternaries 18 (20 pts), loops 3, match/switch 1 (nesting depth added 17). 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":"mobile/lib/features/channels/channel_detail_page/message_list.dart"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a33b191046ddbd128801a7a50edfc937c361b48ed50a3cbc2edbf9293639f13"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::huddle::playout::run_playout_recv_loop (cognitive 175): buzz_desktop::huddle::playout::run_playout_recv_loop has cognitive complexity 175 (threshold 15). Drivers by points: if/else 27 (127 pts), loops 7 (29 pts), match/switch 5 (18 pts), boolean chains 1 (nesting depth added 135). 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":"desktop/src-tauri/src/huddle/playout.rs"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c93167f68d21df9b716917595ea074f5c13d10fa17f813f8c63b77e8cd852ee"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::relay::run_background_task (cognitive 171): buzz_acp::relay::run_background_task has cognitive complexity 171 (threshold 15). Drivers by points: if/else 37 (128 pts), match/switch 10 (35 pts), boolean chains 7, loops 1 (nesting depth added 116). 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/buzz-acp/src/relay.rs"},"region":{"startLine":1736}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f99503c5f2de6652c738667528b86bbdc487f7d24920a3839b116215b1f8e7b"}},{"ruleId":"D2","level":"warning","message":{"text":"ImageAvatarCapture.build (cognitive 158): ImageAvatarCapture.build has cognitive complexity 158 (threshold 15). Drivers by points: if/else 40 (77 pts), ternaries 39, boolean chains 28, error handling 7 (14 pts) (nesting depth added 44). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/profile/image_avatar_capture.dart"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"517ea579864fc02eec2dfd175454b3aff611fc489143a84fbc2e055d0dfd40bf"}},{"ruleId":"D2","level":"warning","message":{"text":"NostrKeyImportForm.NostrKeyImportForm (cognitive 158): NostrKeyImportForm.NostrKeyImportForm has cognitive complexity 158 (threshold 15). Drivers by points: ternaries 45 (105 pts), boolean chains 26, if/else 21 (25 pts), error handling 2 (nesting depth added 64). Of this number, 116 points are the body\u0027s own statements and 42 belong to 17 function literals 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":"desktop/src/features/onboarding/ui/NostrKeyImportForm.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"11286c9660b709293455278eb007698e55fedbd9886037524b6ad4a4ce23c57a"}},{"ruleId":"D2","level":"warning","message":{"text":"MachineOnboardingFlow.MachineOnboardingFlow (cognitive 158): MachineOnboardingFlow.MachineOnboardingFlow has cognitive complexity 158 (threshold 15). Drivers by points: ternaries 35 (131 pts), if/else 10 (16 pts), boolean chains 8, error handling 3 (nesting depth added 102). Of this number, 133 points are the body\u0027s own statements and 25 belong to 10 function literals inside it that branch. 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":"desktop/src/features/onboarding/ui/MachineOnboardingFlow.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"866d6f83c09ed3fd607c7f609e6a409d2a7f39b0b79b11abde69f3180adc3376"}},{"ruleId":"D2","level":"warning","message":{"text":"HostedCommunityOnboarding.HostedCommunityOnboarding (cognitive 156): HostedCommunityOnboarding.HostedCommunityOnboarding has cognitive complexity 156 (threshold 15). Drivers by points: ternaries 46 (111 pts), if/else 24, boolean chains 20, error handling 1 (nesting depth added 65). Of this number, 107 points are the body\u0027s own statements and 49 belong to 21 function literals 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":"desktop/src/features/communities/ui/HostedCommunityOnboarding.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1b4c4c7471586c01e430aba26c25379d7ce0bff97a7eb6e524c2fc811ba1ae7"}},{"ruleId":"D2","level":"warning","message":{"text":"AcpClient::read_until_response_with_idle_timeout (cognitive 155): AcpClient::read_until_response_with_idle_timeout has cognitive complexity 155 (threshold 15). Drivers by points: if/else 27 (103 pts), match/switch 12 (50 pts), boolean chains 1, loops 1 (nesting depth added 114). 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/buzz-acp/src/acp.rs"},"region":{"startLine":1371}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffa81926d79a7662969e46ad9a0de5792a1786fcb53f9166d1e905aa3dcc275e"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::huddle::tts::tts_worker (cognitive 149): buzz_desktop::huddle::tts::tts_worker has cognitive complexity 149 (threshold 15). Drivers by points: if/else 43 (112 pts), match/switch 12 (22 pts), boolean chains 8, loops 4 (7 pts) (nesting depth added 82). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/huddle/tts.rs"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c8c801ab0cc8e75be9af8ff8b89bcf792af5cfc28d360da352f0f2f66caf40f"}},{"ruleId":"D2","level":"warning","message":{"text":"ComposeBar.build (cognitive 149): ComposeBar.build has cognitive complexity 149 (threshold 15). Drivers by points: if/else 57 (100 pts), boolean chains 25, loops 6 (11 pts), ternaries 7, error handling 4 (5 pts), match/switch 1 (nesting depth added 49). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/compose_bar/compose_bar_widget.dart"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb7faa0a0e4de2436c8f12e6f2d7248259023df5dd82abbe61b5d8ea61a2c45c"}},{"ruleId":"D2","level":"warning","message":{"text":"UserProfilePanel.UserProfilePanel (cognitive 147): UserProfilePanel.UserProfilePanel has cognitive complexity 147 (threshold 15). Drivers by points: ternaries 45 (61 pts), boolean chains 43, if/else 33 (35 pts), error handling 5 (6 pts), loops 2 (nesting depth added 19). Of this number, 84 points are the body\u0027s own statements and 63 belong to 22 function literals 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":"desktop/src/features/profile/ui/UserProfilePanel.tsx"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee729eed4f94a882f00739c6803dfe963683226392208fa063eb53f95aeb8554"}},{"ruleId":"D2","level":"warning","message":{"text":"ThreadDetailPage.build (cognitive 144): ThreadDetailPage.build has cognitive complexity 144 (threshold 15). Drivers by points: boolean chains 63, if/else 57 (61 pts), ternaries 15 (16 pts), loops 4 (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":"mobile/lib/features/channels/thread_detail_page.dart"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"3dc9123471457df01c03899b251455daa10da51964d212b8fab2bb8091c2fcf5"}},{"ruleId":"D2","level":"warning","message":{"text":"useAnchoredScroll.useAnchoredScroll (cognitive 143): useAnchoredScroll.useAnchoredScroll has cognitive complexity 143 (threshold 15). Drivers by points: if/else 89 (116 pts), boolean chains 21, ternaries 5 (6 pts) (nesting depth added 28). Most of this is not in the body itself: 1 of the 143 points is its own statement and the rest belongs to 27 function literals inside it that branch (lines 607, 432, 551, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useAnchoredScroll.ts"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"10bc93e77846b85c4596919204f1cc6d33f3193c61a2c6e41fd285b1c28f8e61"}},{"ruleId":"D2","level":"warning","message":{"text":"useMentionSendFlow.useMentionSendFlow (cognitive 141): useMentionSendFlow.useMentionSendFlow has cognitive complexity 141 (threshold 15). Drivers by points: if/else 63 (80 pts), boolean chains 31, ternaries 10 (15 pts), error handling 6 (10 pts), loops 4 (5 pts) (nesting depth added 27). Most of this is not in the body itself: 2 of the 141 points are its own statements and the rest belongs to 18 function literals inside it that branch (lines 284, 726, 164, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useMentionSendFlow.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"23f78ac3e0646fe07c243acf6481597a3015bef52b66b2794179d1f80c57d75b"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::pool::run_prompt_task (cognitive 140): buzz_acp::pool::run_prompt_task has cognitive complexity 140 (threshold 15). Drivers by points: if/else 45 (94 pts), match/switch 22 (41 pts), boolean chains 5 (nesting depth added 68). 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/buzz-acp/src/pool.rs"},"region":{"startLine":2323}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9851b440513ed7dd3876d28526123d33d52b35367eca01fe1851424d681265c"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::run_relay_main (cognitive 139): buzz_relay::run_relay_main has cognitive complexity 139 (threshold 15). Drivers by points: if/else 49 (76 pts), match/switch 24 (46 pts), loops 11 (15 pts), boolean chains 2 (nesting depth added 53). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/main.rs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4a7d347ebbc9f87ca1d981c485e05a0a98919b848093b24119a82f57520af77"}},{"ruleId":"D2","level":"warning","message":{"text":"agentSessionTranscript.processTranscriptEvent (cognitive 138): agentSessionTranscript.processTranscriptEvent has cognitive complexity 138 (threshold 15). Drivers by points: if/else 43 (91 pts), ternaries 9 (35 pts), boolean chains 12 (nesting depth added 74). Of this number, 134 points are the body\u0027s own statements and 4 belong to one function literal inside it that branches. 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":"desktop/src/features/agents/ui/agentSessionTranscript.ts"},"region":{"startLine":700}}}],"partialFingerprints":{"codehealthFindingId/v1":"30a17f846316db2cfaa2143a514ea51adcc1767bb5a76a83a5215b1b54aa0b66"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::api::bridge::query_events_authed (cognitive 137): buzz_relay::api::bridge::query_events_authed has cognitive complexity 137 (threshold 15). Drivers by points: if/else 42 (93 pts), loops 12 (23 pts), match/switch 9 (18 pts), boolean chains 3 (nesting depth added 71). To reduce it, split the body into named stages: move each independent step or branch into 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/buzz-relay/src/api/bridge.rs"},"region":{"startLine":1306}}}],"partialFingerprints":{"codehealthFindingId/v1":"57f639f464eb333939ec573c8218f096fe9caae93a27fc203972b12026479f8c"}},{"ruleId":"D2","level":"warning","message":{"text":"huddlePresenceRuntime.startHuddlePresenceRuntime (cognitive 137): huddlePresenceRuntime.startHuddlePresenceRuntime has cognitive complexity 137 (threshold 15). Drivers by points: if/else 61 (98 pts), boolean chains 18, loops 12 (14 pts), error handling 5 (6 pts), ternaries 1 (nesting depth added 40). Of this number, 31 points are the body\u0027s own statements and 106 belong to 14 function literals 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":"desktop/src/features/huddle/lib/huddlePresenceRuntime.ts"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b7288c945575bb62a5df8903eb06a48e8c489e3bb2c8a74df4796ac80316bef"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowFormBuilder.WorkflowFormBuilder (cognitive 135): WorkflowFormBuilder.WorkflowFormBuilder has cognitive complexity 135 (threshold 15). Drivers by points: ternaries 37 (84 pts), if/else 23 (31 pts), boolean chains 20 (nesting depth added 55). Of this number, 60 points are the body\u0027s own statements and 75 belong to 18 function literals 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":"desktop/src/features/workflows/ui/WorkflowFormBuilder.tsx"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"2750407ec72d50ed34e446d13105478e514a797594378d061c1b4066ad680ec2"}},{"ruleId":"D2","level":"warning","message":{"text":"useUnreadChannels.useUnreadChannels (cognitive 131): useUnreadChannels.useUnreadChannels has cognitive complexity 131 (threshold 15). Drivers by points: if/else 59 (84 pts), loops 13 (17 pts), boolean chains 15, ternaries 9 (15 pts) (nesting depth added 35). Most of this is not in the body itself: 2 of the 131 points are its own statements and the rest belongs to 18 function literals inside it that branch (lines 670, 791, 426, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/useUnreadChannels.ts"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"cad56f03ab219979be28bf7dde3b83a57d9fbc02784290dc3b5d916b4af3afc3"}},{"ruleId":"D2","level":"warning","message":{"text":"NostrBindConsentDialog.NostrBindConsentDialog (cognitive 129): NostrBindConsentDialog.NostrBindConsentDialog has cognitive complexity 129 (threshold 15). Drivers by points: ternaries 29 (74 pts), if/else 33 (38 pts), boolean chains 15, error handling 1, loops 1 (nesting depth added 50). Of this number, 46 points are the body\u0027s own statements and 83 belong to 12 function literals 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":"desktop/src/features/profile/ui/NostrBindConsentDialog.tsx"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb540578f53ee95951242e42ef378db42d462ac092e3f6898971ce5add2844da"}},{"ruleId":"D2","level":"warning","message":{"text":"TopbarSearch.TopbarSearch (cognitive 129): TopbarSearch.TopbarSearch has cognitive complexity 129 (threshold 15). Drivers by points: ternaries 51 (102 pts), if/else 15 (16 pts), boolean chains 11 (nesting depth added 52). Of this number, 63 points are the body\u0027s own statements and 66 belong to 10 function literals 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":"desktop/src/features/search/ui/TopbarSearch.tsx"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"936c640413aea80a620945b9ef0a5ae8505301529862c361fa6c85c16cb95a25"}},{"ruleId":"D2","level":"warning","message":{"text":"CommunityOnboardingFlow.CommunityOnboardingFlow (cognitive 127): CommunityOnboardingFlow.CommunityOnboardingFlow has cognitive complexity 127 (threshold 15). Drivers by points: ternaries 32 (68 pts), if/else 24 (28 pts), boolean chains 25, error handling 4 (6 pts) (nesting depth added 42). Of this number, 65 points are the body\u0027s own statements and 62 belong to 21 function literals 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":"desktop/src/features/onboarding/ui/CommunityOnboardingFlow.tsx"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f180124f103e6fe2f0c842dcdfcebd08be624ee4951734cfc7a74da92eaf854"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowTriggerConditions.WorkflowTriggerConditions (cognitive 127): WorkflowTriggerConditions.WorkflowTriggerConditions has cognitive complexity 127 (threshold 15). Drivers by points: ternaries 24 (105 pts), boolean chains 14, if/else 6 (8 pts) (nesting depth added 83). Most of this is not in the body itself: 8 of the 127 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 275, 177, 154, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/WorkflowTriggerConditions.tsx"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b4f9252b2956e1ed3d2989f33348920328f0217edd7cdcd0cbe3ccc06fc721a"}},{"ruleId":"D2","level":"warning","message":{"text":"markdown.ImageZoomOverlay (cognitive 127): markdown.ImageZoomOverlay has cognitive complexity 127 (threshold 15). Drivers by points: ternaries 41 (58 pts), if/else 40 (43 pts), boolean chains 24, loops 2 (nesting depth added 20). Of this number, 61 points are the body\u0027s own statements and 66 belong to 24 function literals 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":"desktop/src/shared/ui/markdown.tsx"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"80bf6054ac2a47015c04da80cd9476a9afbdaab14596dbe6e8776091bfcd6150"}},{"ruleId":"D2","level":"warning","message":{"text":"TerminalSubstrate.TerminalSubstrate (cognitive 126): TerminalSubstrate.TerminalSubstrate has cognitive complexity 126 (threshold 15). Drivers by points: if/else 61 (73 pts), boolean chains 27, ternaries 21 (25 pts), loops 1 (nesting depth added 16). Most of this is not in the body itself: 9 of the 126 points are its own statements and the rest belongs to 39 function literals inside it that branch (lines 190, 398, 685, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/terminal/TerminalSubstrate.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"acc14af7616c48bf3f72fd0fa5de17b835a957e07dfce80c69e02ea696b32dc5"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowDetailPanel.WorkflowDetailPanel (cognitive 124): WorkflowDetailPanel.WorkflowDetailPanel has cognitive complexity 124 (threshold 15). Drivers by points: ternaries 36 (120 pts), boolean chains 3, error handling 1 (nesting depth added 84). Of this number, 56 points are the body\u0027s own statements and 68 belong to 2 function literals inside it that branch. 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":"desktop/src/features/workflows/ui/WorkflowDetailPanel.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebc8dfad69ab4bf3ea2776aa3dd313a445a0d1fe6ba196c186125e974d656b17"}},{"ruleId":"D2","level":"warning","message":{"text":"AnimatedAvatarCapture.build (cognitive 121): AnimatedAvatarCapture.build has cognitive complexity 121 (threshold 15). Drivers by points: if/else 39 (66 pts), ternaries 17 (24 pts), boolean chains 20, error handling 4 (5 pts), loops 2 (4 pts), match/switch 1 (2 pts) (nesting depth added 38). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/profile/animated_avatar_capture.dart"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cd837a91ed8d2d9722cadd5c8cdc1b679f14c7cd34e7fd1c42573ff20302c5d"}},{"ruleId":"D2","level":"warning","message":{"text":"HostedCommunitiesSettingsCard.HostedCommunitiesSettingsCard (cognitive 119): HostedCommunitiesSettingsCard.HostedCommunitiesSettingsCard has cognitive complexity 119 (threshold 15). Drivers by points: ternaries 21 (64 pts), if/else 26 (33 pts), boolean chains 20, error handling 2 (nesting depth added 50). Of this number, 69 points are the body\u0027s own statements and 50 belong to 19 function literals inside it that branch. 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":"desktop/src/features/settings/ui/HostedCommunitiesSettingsCard.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"eecca4594ad4e997a41b4a8dbace445c5c3299be1c3f27f9303de34466b856c0"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentInstanceEditDialog.AgentInstanceEditDialog (cognitive 116): AgentInstanceEditDialog.AgentInstanceEditDialog has cognitive complexity 116 (threshold 15). Drivers by points: ternaries 48 (64 pts), boolean chains 29, if/else 21, error handling 2 (nesting depth added 16). Of this number, 89 points are the body\u0027s own statements and 27 belong to 11 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentInstanceEditDialog.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"3543da6d1089f29da2cc682b2ba84124743749c26cb0311ed561860cea3ae1f1"}},{"ruleId":"D2","level":"warning","message":{"text":"HuddleContext.HuddleProvider (cognitive 114): HuddleContext.HuddleProvider has cognitive complexity 114 (threshold 15). Drivers by points: if/else 54 (63 pts), error handling 16 (25 pts), ternaries 12 (14 pts), boolean chains 11, loops 1 (nesting depth added 20). Most of this is not in the body itself: 9 of the 114 points are its own statements and the rest belongs to 35 function literals inside it that branch (lines 492, 832, 626, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/HuddleContext.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc3cad739bdf5d91e28c93ae9b7ebf5ebaad9429b4162c2db6d0f221e1aa548e"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::relay::handle_ws_message (cognitive 113): buzz_acp::relay::handle_ws_message has cognitive complexity 113 (threshold 15). Drivers by points: if/else 32 (80 pts), match/switch 10 (30 pts), boolean chains 3 (nesting depth added 68). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/relay.rs"},"region":{"startLine":2173}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1728b15c09e4e17816be84997de0f9a30fc5797351f621b570658ce4b64bbb4"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::side_effects::validate_admin_event (cognitive 113): buzz_relay::handlers::side_effects::validate_admin_event has cognitive complexity 113 (threshold 15). Drivers by points: if/else 28 (61 pts), match/switch 13 (39 pts), loops 4 (8 pts), boolean chains 5 (nesting depth added 63). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/side_effects.rs"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"26319f23c90ef9daaa25c53071ba61ab405006042c144e23d9dfe300aa5fabef"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentsView.AgentsView (cognitive 113): AgentsView.AgentsView has cognitive complexity 113 (threshold 15). Drivers by points: ternaries 36 (56 pts), if/else 28 (50 pts), boolean chains 7 (nesting depth added 42). Of this number, 56 points are the body\u0027s own statements and 57 belong to 25 function literals 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":"desktop/src/features/agents/ui/AgentsView.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"e72f333fe5b767849fbdbf891ee962e4c32fca06047a52e33b94e8b662cb3762"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectRepositoryActionsPanel.ProjectRepositoryActionsPanel (cognitive 113): ProjectRepositoryActionsPanel.ProjectRepositoryActionsPanel has cognitive complexity 113 (threshold 15). Drivers by points: ternaries 42 (100 pts), boolean chains 13 (nesting depth added 58). 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":"desktop/src/features/projects/ui/ProjectRepositoryActionsPanel.tsx"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a94a569bf3fc42369cb772ec64d207f6b726698c8c2b3d0ae5bda0b609b8410"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelManagementSheet.ChannelManagementPanelContent (cognitive 112): ChannelManagementSheet.ChannelManagementPanelContent has cognitive complexity 112 (threshold 15). Drivers by points: ternaries 39 (109 pts), boolean chains 3 (nesting depth added 70). 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":"desktop/src/features/channels/ui/ChannelManagementSheet.tsx"},"region":{"startLine":673}}}],"partialFingerprints":{"codehealthFindingId/v1":"66cee464c2393497291992294297058cc2a08217706cb13c74888ac1f7029baa"}},{"ruleId":"D2","level":"warning","message":{"text":"HomeView.HomeView (cognitive 110): HomeView.HomeView has cognitive complexity 110 (threshold 15). Drivers by points: ternaries 32 (53 pts), if/else 21 (30 pts), boolean chains 26, loops 1 (nesting depth added 30). Of this number, 58 points are the body\u0027s own statements and 52 belong to 22 function literals 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":"desktop/src/features/home/ui/HomeView.tsx"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"4922bb9464e02f5ba72f00666439cf61ed7fe88afa63b8107c5ba6060663c838"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::imeta::validate_imeta_tags (cognitive 109): buzz_relay::handlers::imeta::validate_imeta_tags has cognitive complexity 109 (threshold 15). Drivers by points: if/else 27 (89 pts), boolean chains 7, match/switch 2 (7 pts), loops 3 (6 pts) (nesting depth added 70). To reduce it, split the body into named stages: move each independent step or branch into 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/buzz-relay/src/handlers/imeta.rs"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"249a4c4b6c119d7959878076a7744bb6f3932e08c7847010a5221d46d932e06f"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::count::handle_count (cognitive 109): buzz_relay::handlers::count::handle_count has cognitive complexity 109 (threshold 15). Drivers by points: if/else 22 (67 pts), match/switch 8 (21 pts), loops 4 (14 pts), boolean chains 7 (nesting depth added 68). To reduce it, split the body into named stages: move each independent step or branch into 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/buzz-relay/src/handlers/count.rs"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"83534c6b342d1d8a87a0b6cc08911c39a80e1b927896e2331a2c041595a27288"}},{"ruleId":"D2","level":"warning","message":{"text":"MessageTimeline.MessageTimelineBase (cognitive 109): MessageTimeline.MessageTimelineBase has cognitive complexity 109 (threshold 15). Drivers by points: ternaries 32 (52 pts), boolean chains 34, if/else 21 (23 pts) (nesting depth added 22). Of this number, 77 points are the body\u0027s own statements and 32 belong to 11 function literals 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":"desktop/src/features/messages/ui/MessageTimeline.tsx"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a2408a1cd4c18dec8a94341ff9c21faaa5d8ccc5178d920146a7bd4a9b770e5"}},{"ruleId":"D2","level":"warning","message":{"text":"ForumComposer.ForumComposerVisit (cognitive 107): ForumComposer.ForumComposerVisit has cognitive complexity 107 (threshold 15). Drivers by points: if/else 38 (44 pts), boolean chains 35, ternaries 13 (26 pts), error handling 2 (nesting depth added 19). Of this number, 40 points are the body\u0027s own statements and 67 belong to 21 function literals 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":"desktop/src/features/forum/ui/ForumComposer.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"80397a8b8d53eee9f88a6c434de1cb61c0b0c9382ea3ecc3cc86255770435035"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_pair_relay::handle_conn (cognitive 106): buzz_pair_relay::handle_conn has cognitive complexity 106 (threshold 15). Drivers by points: if/else 16 (60 pts), match/switch 13 (44 pts), boolean chains 1, loops 1 (nesting depth added 75). To reduce it, split the body into named stages: move each independent step or branch into 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/buzz-pair-relay/src/lib.rs"},"region":{"startLine":620}}}],"partialFingerprints":{"codehealthFindingId/v1":"87240f61bc449e68fae858f09f84cd620fc7344adc929317924a69c6dcf1f9d3"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowDialog.WorkflowDialog (cognitive 106): WorkflowDialog.WorkflowDialog has cognitive complexity 106 (threshold 15). Drivers by points: if/else 36 (41 pts), ternaries 22 (32 pts), boolean chains 30, error handling 2 (3 pts) (nesting depth added 16). Of this number, 65 points are the body\u0027s own statements and 41 belong to 17 function literals 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":"desktop/src/features/workflows/ui/WorkflowDialog.tsx"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"98d9c3abc5e750177acb01401064a77cc35b2048fcae020d70f5eeb5754fd01d"}},{"ruleId":"D2","level":"warning","message":{"text":"VideoPlayer.VideoReviewDialog (cognitive 106): VideoPlayer.VideoReviewDialog has cognitive complexity 106 (threshold 15). Drivers by points: ternaries 29 (50 pts), if/else 26 (27 pts), boolean chains 24, loops 3 (4 pts), error handling 1 (nesting depth added 23). Of this number, 55 points are the body\u0027s own statements and 51 belong to 20 function literals 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":"desktop/src/shared/ui/VideoPlayer.tsx"},"region":{"startLine":1198}}}],"partialFingerprints":{"codehealthFindingId/v1":"b04fbfcddf8910798781d6f82db54de8b53ceee200f17831c1993b5c6d6922a6"}},{"ruleId":"D2","level":"warning","message":{"text":"InviteRedeemForm.InviteRedeemForm (cognitive 105): InviteRedeemForm.InviteRedeemForm has cognitive complexity 105 (threshold 15). Drivers by points: ternaries 34 (57 pts), boolean chains 28, if/else 13 (17 pts), error handling 2 (3 pts) (nesting depth added 28). Of this number, 62 points are the body\u0027s own statements and 43 belong to 5 function literals 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":"desktop/src/features/onboarding/ui/InviteRedeemForm.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"11b8986b584bef2f6d19f289d06a9d5846b22955c45f7c6442fa7bab9bcb099a"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::migration::sync_shared_agent_data (cognitive 104): buzz_desktop::migration::sync_shared_agent_data has cognitive complexity 104 (threshold 15). Drivers by points: if/else 27 (81 pts), loops 7 (19 pts), boolean chains 2, match/switch 2 (nesting depth added 66). 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":"desktop/src-tauri/src/migration.rs"},"region":{"startLine":785}}}],"partialFingerprints":{"codehealthFindingId/v1":"144c0fbd5bebd54e04476a308701783caa738f4025f3504ebd02e2b356e91cde"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelDetailPage.build (cognitive 104): ChannelDetailPage.build has cognitive complexity 104 (threshold 15). Drivers by points: boolean chains 40, if/else 25 (36 pts), ternaries 15 (20 pts), loops 4 (7 pts), error handling 1 (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":"mobile/lib/features/channels/channel_detail_page.dart"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"a771f3a5ec5aae83a2f10edf285850fbb37bd2c1b87553989b3c7099a6d3c055"}},{"ruleId":"D2","level":"warning","message":{"text":"CommunityCatalogDialog.CommunityCatalogDialog (cognitive 102): CommunityCatalogDialog.CommunityCatalogDialog has cognitive complexity 102 (threshold 15). Drivers by points: ternaries 30 (54 pts), if/else 27 (29 pts), boolean chains 19 (nesting depth added 26). Of this number, 65 points are the body\u0027s own statements and 37 belong to 13 function literals 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":"desktop/src/features/agents/ui/CommunityCatalogDialog.tsx"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"d57a7d4f12fbaab8d44a41aaea88836546fd5492f7f235a697a79b2ef99748a1"}},{"ruleId":"D2","level":"warning","message":{"text":"MessageRow.MessageRow (cognitive 102): MessageRow.MessageRow has cognitive complexity 102 (threshold 15). Drivers by points: ternaries 51 (69 pts), boolean chains 20, if/else 6 (9 pts), error handling 1 (2 pts), loops 1, match/switch 1 (nesting depth added 22). Of this number, 74 points are the body\u0027s own statements and 28 belong to 9 function literals 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":"desktop/src/features/messages/ui/MessageRow.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6070e24061cb5fe89943c87d7606c818fab8892eb763b5e721e44746b32510b"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentDefinitionDialog.AgentDefinitionDialog (cognitive 101): AgentDefinitionDialog.AgentDefinitionDialog has cognitive complexity 101 (threshold 15). Drivers by points: boolean chains 51, ternaries 32 (37 pts), if/else 13 (nesting depth added 5). Of this number, 79 points are the body\u0027s own statements and 22 belong to 9 function literals inside it that branch. 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":"desktop/src/features/agents/ui/AgentDefinitionDialog.tsx"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f6b3f152544adcb40f6cdd6d01b1f73283e891a144c2b73d94bfe115a18ca57"}},{"ruleId":"D2","level":"warning","message":{"text":"HuddleBar.HuddleBar (cognitive 100): HuddleBar.HuddleBar has cognitive complexity 100 (threshold 15). Drivers by points: if/else 38 (44 pts), boolean chains 27, ternaries 14 (19 pts), error handling 9 (10 pts) (nesting depth added 12). Of this number, 35 points are the body\u0027s own statements and 65 belong to 22 function literals 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":"desktop/src/features/huddle/components/HuddleBar.tsx"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce0fb2475ec23be2edc81fb996e865184d53a3b9b38a2da6cfa7c5f65ba3ffe1"}},{"ruleId":"D2","level":"warning","message":{"text":"MembersSidebar.MembersSidebar (cognitive 99): MembersSidebar.MembersSidebar has cognitive complexity 99 (threshold 15). Drivers by points: ternaries 31 (47 pts), boolean chains 34, if/else 13, loops 3, error handling 1 (2 pts) (nesting depth added 17). Of this number, 60 points are the body\u0027s own statements and 39 belong to 17 function literals 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":"desktop/src/features/channels/ui/MembersSidebar.tsx"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"3792c4f77a9da3d87354e15be97a1b027f2e15dabc90adb7ffefdf4eea3f4d26"}},{"ruleId":"D2","level":"warning","message":{"text":"MessageThreadPanel.MessageThreadPanel (cognitive 99): MessageThreadPanel.MessageThreadPanel has cognitive complexity 99 (threshold 15). Drivers by points: ternaries 34 (54 pts), boolean chains 32, if/else 11, loops 2 (nesting depth added 20). Of this number, 44 points are the body\u0027s own statements and 55 belong to 12 function literals 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":"desktop/src/features/messages/ui/MessageThreadPanel.tsx"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbb9e35eecc1a65a51f65033fca54a7e333ec5bb058a05376c1a002a226e81b6"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::pairing::pairing_ws_task_inner (cognitive 98): buzz_desktop::commands::pairing::pairing_ws_task_inner has cognitive complexity 98 (threshold 15). Drivers by points: if/else 21 (90 pts), match/switch 2 (7 pts), loops 1 (nesting depth added 74). 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":"desktop/src-tauri/src/commands/pairing.rs"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"265542b4fb6125b00b3cbd393073f8e4d0e2e38f8dbe309ede5bd1d563059e62"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::native_relay_client::run_connection (cognitive 97): buzz_desktop::native_relay_client::run_connection has cognitive complexity 97 (threshold 15). Drivers by points: if/else 21 (82 pts), loops 3 (7 pts), match/switch 2 (5 pts), boolean chains 3 (nesting depth added 68). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/native_relay_client.rs"},"region":{"startLine":522}}}],"partialFingerprints":{"codehealthFindingId/v1":"24b60a87d42f0fab562310b7f5d22b095f59e542bb2e5f1b1b78f7d5f7b32763"}},{"ruleId":"D2","level":"warning","message":{"text":"UserProfilePanelSections.ProfileSummaryView (cognitive 97): UserProfilePanelSections.ProfileSummaryView has cognitive complexity 97 (threshold 15). Drivers by points: ternaries 28 (60 pts), boolean chains 25, if/else 10 (11 pts), loops 1 (nesting depth added 33). Of this number, 83 points are the body\u0027s own statements and 14 belong to 5 function literals 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":"desktop/src/features/profile/ui/UserProfilePanelSections.tsx"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d55809e081a1148971105495b57d37eeafbc6e1b235a52a2102c44d32bb8a7f"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelDetailsPage.build (cognitive 96): ChannelDetailsPage.build has cognitive complexity 96 (threshold 15). Drivers by points: if/else 24 (41 pts), boolean chains 30, ternaries 16 (20 pts), loops 2 (4 pts), error handling 1 (nesting depth added 23). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_details_page.dart"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bb83ef092761d19028000a65ff4eebc3600a3ef79987eafcfd1fbaac1ee860d"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelBrowserDialog.ChannelBrowserDialog (cognitive 95): ChannelBrowserDialog.ChannelBrowserDialog has cognitive complexity 95 (threshold 15). Drivers by points: ternaries 29 (49 pts), if/else 17 (26 pts), boolean chains 17, loops 2, error handling 1 (nesting depth added 29). Of this number, 43 points are the body\u0027s own statements and 52 belong to 17 function literals 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":"desktop/src/features/channels/ui/ChannelBrowserDialog.tsx"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"53d16a966e024d15929ead886149ea94f277cda4cf20528c975c9cbaec5fc923"}},{"ruleId":"D2","level":"warning","message":{"text":"useMentions.useMentions (cognitive 95): useMentions.useMentions has cognitive complexity 95 (threshold 15). Drivers by points: if/else 38 (53 pts), boolean chains 20, ternaries 10 (14 pts), loops 8 (nesting depth added 19). Most of this is not in the body itself: 9 of the 95 points are its own statements and the rest belongs to 23 function literals inside it that branch (lines 828, 492, 211, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useMentions.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcf347e9c6f8cc98101aaaa1d9ccbb588ca34619ce57e31a0bd21bb8ff3fb9b4"}},{"ruleId":"D2","level":"warning","message":{"text":"workflowFormTypes.yamlToFormState (cognitive 95): workflowFormTypes.yamlToFormState has cognitive complexity 95 (threshold 15). Drivers by points: if/else 34 (65 pts), boolean chains 13, ternaries 4 (10 pts), loops 4 (6 pts), error handling 1 (nesting depth added 39). Of this number, 94 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/workflowFormTypes.ts"},"region":{"startLine":408}}}],"partialFingerprints":{"codehealthFindingId/v1":"050b0f9de929d2d55286eddf10e810bc8a2aa784be1c8bfb7b825796c5ea9318"}},{"ruleId":"D2","level":"warning","message":{"text":"ProfileSettingsCard.ProfileSettingsCard (cognitive 94): ProfileSettingsCard.ProfileSettingsCard has cognitive complexity 94 (threshold 15). Drivers by points: ternaries 30 (44 pts), if/else 27 (30 pts), boolean chains 20 (nesting depth added 17). Of this number, 60 points are the body\u0027s own statements and 34 belong to 18 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/ProfileSettingsCard.tsx"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"50f23d18a43393ef1c2034476bfff2f58badef91fcdd0bb4a47b18fb11fcc149"}},{"ruleId":"D2","level":"warning","message":{"text":"ProfileEditPage.build (cognitive 91): ProfileEditPage.build has cognitive complexity 91 (threshold 15). Drivers by points: if/else 24 (33 pts), ternaries 24 (29 pts), boolean chains 21, error handling 5 (8 pts) (nesting depth added 17). 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":"mobile/lib/features/profile/profile_edit_page.dart"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"48295ff40831cb657894a02f9c658d29188c1af840550c41d8d1495a0183deba"}},{"ruleId":"D2","level":"warning","message":{"text":"MessageComposer.MessageComposerImpl (cognitive 91): MessageComposer.MessageComposerImpl has cognitive complexity 91 (threshold 15). Drivers by points: if/else 32 (38 pts), boolean chains 35, ternaries 17 (18 pts) (nesting depth added 7). Of this number, 28 points are the body\u0027s own statements and 63 belong to 17 function literals 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":"desktop/src/features/messages/ui/MessageComposer.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"908255db467fff35ec9265964ad1efe68d0f5f04b2ff53596f146d0af8da7f14"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::req::handle_search_req (cognitive 88): buzz_relay::handlers::req::handle_search_req has cognitive complexity 88 (threshold 15). Drivers by points: if/else 19 (55 pts), match/switch 6 (20 pts), loops 4 (12 pts), boolean chains 1 (nesting depth added 58). To reduce it, split the body into named stages: move each independent step or branch into 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/buzz-relay/src/handlers/req.rs"},"region":{"startLine":598}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5be0d963b31ca70915818b8488fc86a43526a65d8ce934621e12ce4373886d2"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::api::bridge::count_events_authed (cognitive 88): buzz_relay::api::bridge::count_events_authed has cognitive complexity 88 (threshold 15). Drivers by points: if/else 18 (57 pts), match/switch 4 (13 pts), loops 3 (11 pts), boolean chains 7 (nesting depth added 56). To reduce it, split the body into named stages: move each independent step or branch into 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/buzz-relay/src/api/bridge.rs"},"region":{"startLine":1931}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bf8ee1ef435a9fa352031ab22b8963d4c11cf9f99044752a3fe3989a6352400"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::audio::handler::handle_active_audio_connection (cognitive 87): buzz_relay::audio::handler::handle_active_audio_connection has cognitive complexity 87 (threshold 15). Drivers by points: if/else 41 (62 pts), match/switch 15 (22 pts), boolean chains 2, loops 1 (nesting depth added 28). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/audio/handler.rs"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"b163d1745723704725b6c166a76f37365020c8fdcaee48c80f3b1d6e32b6c998"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::req::handle_req (cognitive 87): buzz_relay::handlers::req::handle_req has cognitive complexity 87 (threshold 15). Drivers by points: if/else 33 (61 pts), match/switch 6 (13 pts), loops 5 (10 pts), boolean chains 3 (nesting depth added 40). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/req.rs"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"8118d27d6ca8a4ffcbc37cbb301cd747875de2d9f99b82b5f949c852b9195e9a"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectPullRequestsPanel.ProjectPullRequestDetail (cognitive 87): ProjectPullRequestsPanel.ProjectPullRequestDetail has cognitive complexity 87 (threshold 15). Drivers by points: ternaries 37 (71 pts), boolean chains 8, if/else 5 (7 pts), error handling 1 (nesting depth added 36). Of this number, 29 points are the body\u0027s own statements and 58 belong to 8 function literals 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":"desktop/src/features/projects/ui/ProjectPullRequestsPanel.tsx"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c47c04490807c6c522d70134f1fdbe1ccd1f8aa64658733fe6c0f9c070701f6"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_agent::llm::openrouter_post (cognitive 86): buzz_agent::llm::openrouter_post has cognitive complexity 86 (threshold 15). Drivers by points: if/else 26 (66 pts), match/switch 4 (11 pts), boolean chains 6, loops 2 (3 pts) (nesting depth added 48). 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/buzz-agent/src/llm.rs"},"region":{"startLine":2258}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c9c92d44a728f1f0d6cc4d7e734444e4bf5e173db78153e2ff6091b7b2177ec"}},{"ruleId":"D2","level":"warning","message":{"text":"plainTextProjection.buildPlainTextProjection (cognitive 86): plainTextProjection.buildPlainTextProjection has cognitive complexity 86 (threshold 15). Drivers by points: if/else 37 (72 pts), ternaries 4 (9 pts), boolean chains 3, loops 2 (nesting depth added 40). Of this number, 70 points are the body\u0027s own statements and 16 belong to 2 function literals 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":"desktop/src/features/messages/lib/plainTextProjection.ts"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"0883ae2035f613c3f51f2e0152f1facca857ff9f2a51b0705291fccb5f5bba21"}},{"ruleId":"D2","level":"warning","message":{"text":"AudioMessageAttachment.AudioMessageAttachment (cognitive 84): AudioMessageAttachment.AudioMessageAttachment has cognitive complexity 84 (threshold 15). Drivers by points: ternaries 26 (37 pts), if/else 29 (32 pts), boolean chains 15 (nesting depth added 14). Of this number, 31 points are the body\u0027s own statements and 53 belong to 27 function literals 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":"desktop/src/features/messages/ui/AudioMessageAttachment.tsx"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a7c04edcfe919cc68ba404b3e739f95c50a49088f3bb35f22334fa0fb93254c"}},{"ruleId":"D2","level":"warning","message":{"text":"MentionAutocomplete.MentionAutocomplete (cognitive 84): MentionAutocomplete.MentionAutocomplete has cognitive complexity 84 (threshold 15). Drivers by points: ternaries 28 (58 pts), boolean chains 16, if/else 9, loops 1 (nesting depth added 30). Most of this is not in the body itself: 6 of the 84 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 246, 109, 137, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/MentionAutocomplete.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"494afc21c14ab181ccd8ab19f461a683b719dbb10ff94cb628fb48e3f89abb25"}},{"ruleId":"D2","level":"warning","message":{"text":"useMediaUpload.useMediaUpload (cognitive 83): useMediaUpload.useMediaUpload has cognitive complexity 83 (threshold 15). Drivers by points: if/else 40 (48 pts), ternaries 11 (12 pts), boolean chains 10, loops 7, error handling 5 (6 pts) (nesting depth added 10). Most of this is not in the body itself: 2 of the 83 points are its own statements and the rest belongs to 41 function literals inside it that branch (lines 626, 283, 195, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useMediaUpload.ts"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0ba782604d3947826f2e11c8d73165b9fb083b7fb6ad1b1a2291d0870daea9f"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectDetailScreen.ProjectDetailScreen (cognitive 83): ProjectDetailScreen.ProjectDetailScreen has cognitive complexity 83 (threshold 15). Drivers by points: if/else 27 (29 pts), boolean chains 25, ternaries 20 (25 pts), error handling 4 (nesting depth added 7). Of this number, 41 points are the body\u0027s own statements and 42 belong to 16 function literals 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":"desktop/src/features/projects/ui/ProjectDetailScreen.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"73ade9e49adc5a63025d5f1e053aaa130bfc05ef036f81d4faff964b73861d0b"}},{"ruleId":"D2","level":"warning","message":{"text":"PullRequestReviewersRow.PullRequestReviewersRow (cognitive 81): PullRequestReviewersRow.PullRequestReviewersRow has cognitive complexity 81 (threshold 15). Drivers by points: ternaries 26 (64 pts), boolean chains 13, if/else 3, error handling 1 (nesting depth added 38). Of this number, 47 points are the body\u0027s own statements and 34 belong to 7 function literals inside it that branch. 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":"desktop/src/features/projects/ui/PullRequestReviewersRow.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"83d0a83a25359ad767ccaf1dc20df4b400c27db853c7929866ff0028d581dd37"}},{"ruleId":"D2","level":"warning","message":{"text":"InboxDetailPane.InboxMessageDetailPane (cognitive 80): InboxDetailPane.InboxMessageDetailPane has cognitive complexity 80 (threshold 15). Drivers by points: ternaries 40 (54 pts), boolean chains 15, if/else 10 (11 pts) (nesting depth added 15). Of this number, 59 points are the body\u0027s own statements and 21 belong to 8 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/ui/InboxDetailPane.tsx"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc7df63bb442f06560b3b235fd7719f67ba9a905d7b6cb762629f2ef2b602586"}},{"ruleId":"D2","level":"warning","message":{"text":"InboxListPane.InboxListPane (cognitive 80): InboxListPane.InboxListPane has cognitive complexity 80 (threshold 15). Drivers by points: ternaries 34 (61 pts), boolean chains 9, if/else 5 (9 pts), loops 1 (nesting depth added 31). Of this number, 26 points are the body\u0027s own statements and 54 belong to 9 function literals 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":"desktop/src/features/home/ui/InboxListPane.tsx"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"80378bab0aa78e7a3a5bdd3fa7640561d54122573311c2d458695d56873dc769"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectWorkspaceTabs.WorkspaceTabs (cognitive 80): ProjectWorkspaceTabs.WorkspaceTabs has cognitive complexity 80 (threshold 15). Drivers by points: ternaries 30 (56 pts), boolean chains 14, if/else 10 (nesting depth added 26). Of this number, 69 points are the body\u0027s own statements and 11 belong to 9 function literals 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":"desktop/src/features/projects/ui/ProjectWorkspaceTabs.tsx"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"a35dfd5750aa257e29e7fc9f11166761fe236f94f44e83a57a0f17e3fe2063c6"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_media::auth::verify_blossom_auth_event_for_verb (cognitive 79): buzz_media::auth::verify_blossom_auth_event_for_verb has cognitive complexity 79 (threshold 15). Drivers by points: if/else 29 (65 pts), match/switch 3 (8 pts), boolean chains 5, loops 1 (nesting depth added 41). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-media/src/auth.rs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"ead3997612ff3325e67382596b3830eb189214ca058d5dde9d6c0f03b2f75005"}},{"ruleId":"D2","level":"warning","message":{"text":"NewMessageScreen.NewMessageScreen (cognitive 79): NewMessageScreen.NewMessageScreen has cognitive complexity 79 (threshold 15). Drivers by points: ternaries 20 (29 pts), if/else 23 (28 pts), boolean chains 20, error handling 2 (nesting depth added 14). Of this number, 21 points are the body\u0027s own statements and 58 belong to 14 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/NewMessageScreen.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"64183e38cbe834a71104d30da814ddeb3fd86f31ea996d2e0f9de9248a575101"}},{"ruleId":"D2","level":"warning","message":{"text":"EncryptedBackupCreator.EncryptedBackupCreator (cognitive 79): EncryptedBackupCreator.EncryptedBackupCreator has cognitive complexity 79 (threshold 15). Drivers by points: ternaries 32 (38 pts), boolean chains 20, if/else 19 (20 pts), error handling 1 (nesting depth added 7). Of this number, 34 points are the body\u0027s own statements and 45 belong to 15 function literals 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":"desktop/src/features/onboarding/ui/EncryptedBackupCreator.tsx"},"region":{"startLine":361}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b9b255280b5cab229bba7bddb689c69fe31e6a4d71187b5c286a4abfa775713"}},{"ruleId":"D2","level":"warning","message":{"text":"Config::from_env (cognitive 78): Config::from_env has cognitive complexity 78 (threshold 15). Drivers by points: if/else 26 (42 pts), boolean chains 20, match/switch 11 (13 pts), loops 2 (3 pts) (nesting depth added 19). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/config.rs"},"region":{"startLine":605}}}],"partialFingerprints":{"codehealthFindingId/v1":"42b6a897a1d9d12c07a9c1366f287c03d07c51e3a2ec18dcfa63bdc965e88209"}},{"ruleId":"D2","level":"warning","message":{"text":"SubscriptionRegistry::remove_from_index (cognitive 78): SubscriptionRegistry::remove_from_index has cognitive complexity 78 (threshold 15). Drivers by points: if/else 14 (54 pts), loops 4 (13 pts), match/switch 2 (6 pts), boolean chains 5 (nesting depth added 53). 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/buzz-relay/src/subscription.rs"},"region":{"startLine":564}}}],"partialFingerprints":{"codehealthFindingId/v1":"f61449f7d1ecf812c8070afd107c8ab77dd7b662a37d7bdc8891a5739833be84"}},{"ruleId":"D2","level":"warning","message":{"text":"useObservedUnreadPersistence.useObservedUnreadPersistence (cognitive 78): useObservedUnreadPersistence.useObservedUnreadPersistence has cognitive complexity 78 (threshold 15). Drivers by points: if/else 44 (51 pts), boolean chains 14, loops 7, error handling 2 (3 pts), ternaries 3 (nesting depth added 8). Most of this is not in the body itself: 0 of the 78 points are its own statements and the rest belongs to 27 function literals inside it that branch (lines 147, 379, 285, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/useObservedUnreadPersistence.ts"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"edee65a971ef27c3b0e26b759987dd6ae441c4b0b73b22a62637b5b80595b89a"}},{"ruleId":"D2","level":"warning","message":{"text":"UserProfilePopover.UserProfilePopoverBody (cognitive 78): UserProfilePopover.UserProfilePopoverBody has cognitive complexity 78 (threshold 15). Drivers by points: ternaries 27 (53 pts), boolean chains 24, loops 1 (nesting depth added 26). Of this number, 77 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/UserProfilePopover.tsx"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"93f39775fc9e6282650c93f85648e763a07929338ca2e9d857ad69472f5014ad"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowMessagePicker.WorkflowMessagePicker (cognitive 78): WorkflowMessagePicker.WorkflowMessagePicker has cognitive complexity 78 (threshold 15). Drivers by points: ternaries 22 (33 pts), if/else 20 (25 pts), boolean chains 18, loops 1 (2 pts) (nesting depth added 17). Of this number, 31 points are the body\u0027s own statements and 47 belong to 17 function literals 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":"desktop/src/features/workflows/ui/WorkflowMessagePicker.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"d76a34d3ce6aa86bc568819ae57fb793e4bf78f6b0deac31df3ad3ec469aba27"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectsView.ProjectsView (cognitive 77): ProjectsView.ProjectsView has cognitive complexity 77 (threshold 15). Drivers by points: ternaries 22 (39 pts), if/else 24, boolean chains 14 (nesting depth added 17). Of this number, 47 points are the body\u0027s own statements and 30 belong to 15 function literals 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":"desktop/src/features/projects/ui/ProjectsView.tsx"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"2be62c280702224c02a90982e2ced75f7b7fdf6c353d96d8096f5bcf8ec266b9"}},{"ruleId":"D2","level":"warning","message":{"text":"usePersonaActions.usePersonaActions (cognitive 76): usePersonaActions.usePersonaActions has cognitive complexity 76 (threshold 15). Drivers by points: if/else 27 (39 pts), ternaries 14 (26 pts), error handling 7 (8 pts), boolean chains 3 (nesting depth added 25). Of this number, 73 points are the body\u0027s own statements and 3 belong to 3 function literals 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":"desktop/src/features/agents/ui/usePersonaActions.ts"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"eed5f03e1d20b41674340db047b35108084ca7f3abade22aed19bd348cb8b11c"}},{"ruleId":"D2","level":"warning","message":{"text":"BackupStep.BackupStep (cognitive 76): BackupStep.BackupStep has cognitive complexity 76 (threshold 15). Drivers by points: ternaries 32 (59 pts), if/else 10 (11 pts), boolean chains 5, error handling 1 (nesting depth added 28). Of this number, 61 points are the body\u0027s own statements and 15 belong to 6 function literals 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":"desktop/src/features/onboarding/ui/BackupStep.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f73b462c34173cac9a4d00ec421823d177121bdd3adc6259900e45cc2d26d7d"}},{"ruleId":"D2","level":"warning","message":{"text":"MobilePairingCard.MobilePairingCard (cognitive 76): MobilePairingCard.MobilePairingCard has cognitive complexity 76 (threshold 15). Drivers by points: ternaries 14 (45 pts), if/else 18 (19 pts), boolean chains 10, error handling 1, loops 1 (nesting depth added 32). Of this number, 52 points are the body\u0027s own statements and 24 belong to 12 function literals 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":"desktop/src/features/settings/ui/MobilePairingCard.tsx"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2ac8768676476842e5000ea0805ba4508c3c9d4a2f31ede510764621a02fc21"}},{"ruleId":"D2","level":"warning","message":{"text":"HostedCommunityCreateFlow.HostedCommunityCreateFlow (cognitive 75): HostedCommunityCreateFlow.HostedCommunityCreateFlow has cognitive complexity 75 (threshold 15). Drivers by points: ternaries 18 (36 pts), if/else 24, boolean chains 14, error handling 1 (nesting depth added 18). Of this number, 41 points are the body\u0027s own statements and 34 belong to 16 function literals 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":"desktop/src/features/communities/ui/HostedCommunityCreateFlow.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd2a3560446da63856bf14998dc2f2ace145465a2019f961ff88c8ddb553863a"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelScreen.ChannelScreen (cognitive 74): ChannelScreen.ChannelScreen has cognitive complexity 74 (threshold 15). Drivers by points: ternaries 19 (35 pts), boolean chains 22, if/else 11 (14 pts), loops 3 (nesting depth added 19). Of this number, 45 points are the body\u0027s own statements and 29 belong to 13 function literals 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":"desktop/src/features/channels/ui/ChannelScreen.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2f43a62047fc5ad62759d7caa67655315ef3ecf2072c984c3239f3065ff7fc8"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_db::store::event::query_events_on (cognitive 73): buzz_db::store::event::query_events_on has cognitive complexity 73 (threshold 15). Drivers by points: if/else 37 (51 pts), loops 8 (20 pts), boolean chains 2 (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/buzz-db/src/store/event.rs"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3dbdfe1b5001065d02ae5ceb2286dce42116aa69cda03d7b0cd302e9bc1cb02"}},{"ruleId":"D2","level":"warning","message":{"text":"HuddlePresenceTracker.apply (cognitive 73): HuddlePresenceTracker.apply has cognitive complexity 73 (threshold 15). Drivers by points: if/else 33 (54 pts), boolean chains 16, loops 1 (3 pts) (nesting depth added 23). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/lib/huddlePresence.ts"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"37793b2a095316b7922557b4d25e8de21a1e485ddf3ac21a95529f482204eabe"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelsNotifier._fetchChannels (cognitive 72): ChannelsNotifier._fetchChannels has cognitive complexity 72 (threshold 15). Drivers by points: if/else 22 (44 pts), loops 9 (13 pts), boolean chains 12, ternaries 3 (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":"mobile/lib/features/channels/channels_provider.dart"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"beb3dd93792ae39dbe4b8acf86c29fba2a4e70865976dcc75529bdceb618d5ae"}},{"ruleId":"D2","level":"warning","message":{"text":"BeeRefreshIndicator.build (cognitive 72): BeeRefreshIndicator.build has cognitive complexity 72 (threshold 15). Drivers by points: if/else 32 (47 pts), boolean chains 14, ternaries 8 (10 pts), match/switch 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":"mobile/lib/shared/widgets/bee_refresh_indicator.dart"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b1df76ceb527c2a1ce1e200193a9c82e7c36f19878df733fa2af81836f964ee"}},{"ruleId":"D2","level":"warning","message":{"text":"useRichTextEditor.useRichTextEditor (cognitive 72): useRichTextEditor.useRichTextEditor has cognitive complexity 72 (threshold 15). Drivers by points: if/else 51 (58 pts), boolean chains 8, ternaries 4 (5 pts), loops 1 (nesting depth added 8). Most of this is not in the body itself: 0 of the 72 points are its own statements and the rest belongs to 21 function literals inside it that branch (lines 424, 227, 739, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useRichTextEditor.ts"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fa7dd2d054c33dda739b77b59ffd1687aa9ef14b44c453089f093bf7aa1fcba"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_sdk::mentions::strip_code_regions (cognitive 70): buzz_sdk::mentions::strip_code_regions has cognitive complexity 70 (threshold 15). Drivers by points: if/else 14 (52 pts), loops 4 (15 pts), boolean chains 3 (nesting depth added 49). 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/buzz-sdk/src/mentions.rs"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"533e66416d4535168e9a19e60306f7868c0111c251a9c82a61526da1a2f27899"}},{"ruleId":"D2","level":"warning","message":{"text":"exhaustive.test_cross_device_compaction_suppression (cognitive 70): exhaustive.test_cross_device_compaction_suppression has cognitive complexity 70 (threshold 15). Drivers by points: if/else 7 (47 pts), loops 6 (21 pts), boolean chains 2 (nesting depth added 55). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/formal/nip-rs-unread/exhaustive.py"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"19e69d51731b40994c45756177bb40ce7cc4d3f2cd2fcb3e45a51715db71eee0"}},{"ruleId":"D2","level":"warning","message":{"text":"ActivityPage.build (cognitive 70): ActivityPage.build has cognitive complexity 70 (threshold 15). Drivers by points: if/else 31 (48 pts), boolean chains 9, ternaries 4 (6 pts), loops 5, error handling 1 (2 pts) (nesting depth added 20). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/activity/activity_page.dart"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"209e3f5f8eff10b50bc18f934e488c49a138524551f6f74f588d06ddb0772e19"}},{"ruleId":"D2","level":"warning","message":{"text":"useManagedAgentActions.useManagedAgentActions (cognitive 70): useManagedAgentActions.useManagedAgentActions has cognitive complexity 70 (threshold 15). Drivers by points: if/else 30 (37 pts), ternaries 11 (18 pts), error handling 6, loops 4 (5 pts), boolean chains 4 (nesting depth added 15). Of this number, 46 points are the body\u0027s own statements and 24 belong to 8 function literals 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":"desktop/src/features/agents/ui/useManagedAgentActions.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"0424f2e02695c4b1385304641dd9cf7b425305213e5a132a48ea878e346edbf2"}},{"ruleId":"D2","level":"warning","message":{"text":"AppSidebar.AppSidebar (cognitive 70): AppSidebar.AppSidebar has cognitive complexity 70 (threshold 15). Drivers by points: if/else 26 (31 pts), ternaries 16 (21 pts), boolean chains 11, loops 4 (7 pts) (nesting depth added 13). Of this number, 24 points are the body\u0027s own statements and 46 belong to 21 function literals 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":"desktop/src/features/sidebar/ui/AppSidebar.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"2891c1406786f243df8cd515f008f1361b053dc8b24a8cc9cd9f1dcaede6a847"}},{"ruleId":"D2","level":"warning","message":{"text":"OnboardingFlow.OnboardingFlow (cognitive 69): OnboardingFlow.OnboardingFlow has cognitive complexity 69 (threshold 15). Drivers by points: ternaries 21 (41 pts), if/else 12 (14 pts), error handling 4 (9 pts), boolean chains 5 (nesting depth added 27). Of this number, 38 points are the body\u0027s own statements and 31 belong to 5 function literals 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":"desktop/src/features/onboarding/ui/OnboardingFlow.tsx"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d72efcbe6fd4da72dc2e2a4102fceb78d00b01f2fad9d0c5586751f9062840c"}},{"ruleId":"D2","level":"warning","message":{"text":"RunCtx::run (cognitive 68): RunCtx::run has cognitive complexity 68 (threshold 15). Drivers by points: if/else 23 (53 pts), match/switch 4 (9 pts), boolean chains 3, loops 2 (3 pts) (nesting depth added 36). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/agent.rs"},"region":{"startLine":318}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7c94df7c6c8114fab29e0ccc7686a66ef14989d3e57123cdcef91e427b6b0ad"}},{"ruleId":"D2","level":"warning","message":{"text":"useCommunityInit.useCommunityInit (cognitive 68): useCommunityInit.useCommunityInit has cognitive complexity 68 (threshold 15). Drivers by points: if/else 18 (40 pts), ternaries 3 (12 pts), error handling 5 (9 pts), boolean chains 6, loops 1 (nesting depth added 35). Most of this is not in the body itself: 0 of the 68 points are its own statements and the rest belongs to one function literal inside it that branches (line 180). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/communities/useCommunityInit.ts"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bc81c669888ef3ee65452a3a251c729de20b38dfa666a3abfe9392d13d4a915"}},{"ruleId":"D2","level":"warning","message":{"text":"formatTimelineMessages.formatTimelineMessages (cognitive 67): formatTimelineMessages.formatTimelineMessages has cognitive complexity 67 (threshold 15). Drivers by points: if/else 18 (29 pts), boolean chains 18, ternaries 10 (14 pts), loops 5 (6 pts) (nesting depth added 16). Of this number, 54 points are the body\u0027s own statements and 13 belong to 6 function literals 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":"desktop/src/features/messages/lib/formatTimelineMessages.ts"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"94f9126c786eef09ea6527222ded9df8bb7f50a88647c654d71fab0b0816479f"}},{"ruleId":"D2","level":"warning","message":{"text":"HuddleControlAcceptor::serve_control_loop (cognitive 66): HuddleControlAcceptor::serve_control_loop has cognitive complexity 66 (threshold 15). Drivers by points: if/else 12 (35 pts), match/switch 11 (28 pts), loops 2 (3 pts) (nesting depth added 41). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/audio/join.rs"},"region":{"startLine":1156}}}],"partialFingerprints":{"codehealthFindingId/v1":"51cdcf28699f193a91cf563bc18c7e877dd1dff3418873d841583fea88c63dcc"}},{"ruleId":"D2","level":"warning","message":{"text":"modelCapabilities.generateDatabricksLabel (cognitive 66): modelCapabilities.generateDatabricksLabel has cognitive complexity 66 (threshold 15). Drivers by points: if/else 18 (26 pts), ternaries 10 (22 pts), boolean chains 15, loops 2 (3 pts) (nesting depth added 21). Of this number, 65 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/modelCapabilities.ts"},"region":{"startLine":514}}}],"partialFingerprints":{"codehealthFindingId/v1":"90cc7a3f2b197e951fa4342095312f7d2441b8b7ba07146f70b074cbc47f4650"}},{"ruleId":"D2","level":"warning","message":{"text":"HuddleIndicator.HuddleIndicator (cognitive 65): HuddleIndicator.HuddleIndicator has cognitive complexity 65 (threshold 15). Drivers by points: if/else 25 (45 pts), boolean chains 12, error handling 2 (3 pts), match/switch 1 (2 pts), ternaries 2, loops 1 (nesting depth added 22). Of this number, 16 points are the body\u0027s own statements and 49 belong to 7 function literals 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":"desktop/src/features/huddle/components/HuddleIndicator.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"a86b3de7645edf66c48e376b29b16eca6879c1f42862893f8c7564026a91d17e"}},{"ruleId":"D2","level":"warning","message":{"text":"ProfileAvatarEditor.build (cognitive 63): ProfileAvatarEditor.build has cognitive complexity 63 (threshold 15). Drivers by points: if/else 20 (26 pts), boolean chains 17, ternaries 13 (16 pts), match/switch 3, error handling 1 (nesting depth added 9). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/profile/profile_avatar_editor.dart"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"108f2048cb71b72de7f605b8850aff4dc2240b6de3c6cb8a1f8933d9957ab96e"}},{"ruleId":"D2","level":"warning","message":{"text":"VideoPlayer.VideoPlayer (cognitive 63): VideoPlayer.VideoPlayer has cognitive complexity 63 (threshold 15). Drivers by points: if/else 18 (23 pts), ternaries 18 (23 pts), boolean chains 17 (nesting depth added 10). Of this number, 20 points are the body\u0027s own statements and 43 belong to 18 function literals 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":"desktop/src/shared/ui/VideoPlayer.tsx"},"region":{"startLine":674}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d54d633419f8057e91548d3df9396e92c22b94c4b9e09d02edf4a81d382938b"}},{"ruleId":"D2","level":"warning","message":{"text":"UsageTracker::record (cognitive 62): UsageTracker::record has cognitive complexity 62 (threshold 15). Drivers by points: if/else 15 (28 pts), match/switch 12 (25 pts), boolean chains 9 (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/buzz-acp/src/usage.rs"},"region":{"startLine":560}}}],"partialFingerprints":{"codehealthFindingId/v1":"23909bc5804f169138f8b8c8203f65d8e5641369cd2eb75d2a7ce2edd51b11d6"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::migration::pollen::migrate_pollen_agent_name_in_file (cognitive 62): buzz_desktop::migration::pollen::migrate_pollen_agent_name_in_file has cognitive complexity 62 (threshold 15). Drivers by points: if/else 27 (53 pts), boolean chains 7, loops 2 (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":"desktop/src-tauri/src/migration/pollen.rs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4ba29e3f383d55a9db203d330f39250c983e34d49747bf4d16a71670c3be003"}},{"ruleId":"D2","level":"warning","message":{"text":"useAgentAddressLockPicker.useAgentAddressLockPicker (cognitive 62): useAgentAddressLockPicker.useAgentAddressLockPicker has cognitive complexity 62 (threshold 15). Drivers by points: if/else 31 (41 pts), boolean chains 16, loops 3, ternaries 2 (nesting depth added 10). Most of this is not in the body itself: 2 of the 62 points are its own statements and the rest belongs to 12 function literals inside it that branch (lines 194, 295, 346, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useAgentAddressLockPicker.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"febfda70f68daa9a0c198d3c5776f951d51b6c99f0f76555be190f59f075f8dd"}},{"ruleId":"D2","level":"warning","message":{"text":"agentSessionTranscriptHelpers.parseSystemPromptSections (cognitive 61): agentSessionTranscriptHelpers.parseSystemPromptSections has cognitive complexity 61 (threshold 15). Drivers by points: if/else 31 (57 pts), ternaries 1 (3 pts), boolean chains 1 (nesting depth added 28). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/agentSessionTranscriptHelpers.ts"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"9972f5a442a52e50d50870dafbd40e9655c2b9b193eaa1d107e1262c5d048fe0"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelManagementSheet.ChannelManagementSheet (cognitive 61): ChannelManagementSheet.ChannelManagementSheet has cognitive complexity 61 (threshold 15). Drivers by points: ternaries 20 (33 pts), boolean chains 15, if/else 11, error handling 2 (nesting depth added 13). Of this number, 57 points are the body\u0027s own statements and 4 belong to 2 function literals 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":"desktop/src/features/channels/ui/ChannelManagementSheet.tsx"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4d5ecd7c6ba9f7dec7d9f5135eb2c917b322b5324b3e4db9d28e0945bdc2c12"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowEngine::run (cognitive 60): WorkflowEngine::run has cognitive complexity 60 (threshold 15). Drivers by points: match/switch 10 (34 pts), if/else 7 (23 pts), loops 2 (3 pts) (nesting depth added 41). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep 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/buzz-workflow/src/lib.rs"},"region":{"startLine":489}}}],"partialFingerprints":{"codehealthFindingId/v1":"22ef09a09b4998e5708e7134ceb5b5476a8285722d2a19db8a9df81ee3947af9"}},{"ruleId":"D2","level":"warning","message":{"text":"DeviceVoiceNotePlayerController._loadPendingRemote (cognitive 60): DeviceVoiceNotePlayerController._loadPendingRemote has cognitive complexity 60 (threshold 15). Drivers by points: if/else 21 (47 pts), boolean chains 12, error handling 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":"mobile/lib/features/channels/voice_note_recording.dart"},"region":{"startLine":591}}}],"partialFingerprints":{"codehealthFindingId/v1":"f01993661111f4f198a1cef284750c76a397dedf7fa18fa6d2a62262ae28c1ff"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_db::store::event::count_events_on (cognitive 59): buzz_db::store::event::count_events_on has cognitive complexity 59 (threshold 15). Drivers by points: if/else 30 (42 pts), loops 6 (17 pts) (nesting depth added 23). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/event.rs"},"region":{"startLine":782}}}],"partialFingerprints":{"codehealthFindingId/v1":"867eb3ea95c297655960b90e7e913157b2f1c9b4527dc66ff694c069abcc6332"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::api::bridge::thread_window::query (cognitive 59): buzz_relay::api::bridge::thread_window::query has cognitive complexity 59 (threshold 15). Drivers by points: if/else 8 (33 pts), loops 6 (21 pts), boolean chains 5 (nesting depth added 40). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/bridge/thread_window.rs"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9b2077dea446166857c19b0c36ef6de4c345b5b1dfe6b1572ff5afbb8429834"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::relay_admin::execute_relay_admin_command (cognitive 59): buzz_relay::handlers::relay_admin::execute_relay_admin_command has cognitive complexity 59 (threshold 15). Drivers by points: if/else 27 (50 pts), boolean chains 6, match/switch 2 (3 pts) (nesting depth added 24). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/relay_admin.rs"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e9ab9a758674615e4f4bac5d2c3c2b1bfc9d33add3a2cebceed7f1461c68420"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::auth::handle_auth (cognitive 59): buzz_relay::handlers::auth::handle_auth has cognitive complexity 59 (threshold 15). Drivers by points: if/else 18 (44 pts), match/switch 6 (13 pts), boolean chains 2 (nesting depth added 33). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/auth.rs"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"be3ae2709398ea010d1c5f1c3deeed5e2537e802f925f9643cd046e505a6dbe8"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::run (cognitive 59): buzz_desktop::run has cognitive complexity 59 (threshold 15). Drivers by points: if/else 33 (47 pts), boolean chains 5, loops 3 (4 pts), match/switch 3 (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":"desktop/src-tauri/src/lib.rs"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd82e78ff197b3fc75153341aaa5fbbbdcb193620acb271634805562ad7ab897"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::backend::invoke_provider (cognitive 59): buzz_desktop::managed_agents::backend::invoke_provider has cognitive complexity 59 (threshold 15). Drivers by points: if/else 18 (31 pts), match/switch 7 (17 pts), loops 7 (11 pts) (nesting depth added 27). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/backend.rs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"2da75b2b1364570d1b5fd03db8f9ab9aed73b0fbdbb97fbfe5d84946ae6ef2ed"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::huddle::pipeline::check_pipeline_hotstart (cognitive 59): buzz_desktop::huddle::pipeline::check_pipeline_hotstart has cognitive complexity 59 (threshold 15). Drivers by points: if/else 21 (51 pts), boolean chains 6, match/switch 1 (2 pts) (nesting depth added 31). 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":"desktop/src-tauri/src/huddle/pipeline.rs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"01c0297bc8701312975d3bed9b818e7c8947bc7c1332b9bc33c0644a150e2c0c"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_agent::model_capabilities::resolve (cognitive 58): buzz_agent::model_capabilities::resolve has cognitive complexity 58 (threshold 15). Drivers by points: if/else 21 (36 pts), match/switch 2 (8 pts), boolean chains 7, loops 3 (7 pts) (nesting depth added 25). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/model_capabilities.rs"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"c08f89b464f8eb470cb12fc5e9f9d41c2c2773c5d08e7b67dc2df32f6ed4e060"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_agent::llm::post (cognitive 58): buzz_agent::llm::post has cognitive complexity 58 (threshold 15). Drivers by points: if/else 15 (42 pts), match/switch 3 (7 pts), boolean chains 6, loops 2 (3 pts) (nesting depth added 32). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/llm.rs"},"region":{"startLine":1862}}}],"partialFingerprints":{"codehealthFindingId/v1":"79b36a738792162f76aae9feffb22de9a81e24828b0f40ed93cf5b1ea06bab87"}},{"ruleId":"D2","level":"warning","message":{"text":"observedUnreadNativeRig.installNativeRig (cognitive 58): observedUnreadNativeRig.installNativeRig has cognitive complexity 58 (threshold 15). Drivers by points: if/else 20 (33 pts), loops 10 (19 pts), boolean chains 6 (nesting depth added 22). Most of this is not in the body itself: 1 of the 58 points is its own statement and the rest belongs to 5 function literals inside it that branch (lines 186, 217, 323, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/observedUnreadNativeRig.mjs"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"02847f6a439b73b2da7ad25d4ba9f30cc17bcdd70c27ae0bd6042e0edc654091"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentSessionThreadPanel.AgentSessionThreadPanel (cognitive 58): AgentSessionThreadPanel.AgentSessionThreadPanel has cognitive complexity 58 (threshold 15). Drivers by points: ternaries 24 (46 pts), boolean chains 7, if/else 4, error handling 1 (nesting depth added 22). Of this number, 57 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/AgentSessionThreadPanel.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6d1255fbb95b38ac9d044195a2b3a475ed25d0219c8ec7191aff6c141f2e6c8"}},{"ruleId":"D2","level":"warning","message":{"text":"WelcomeSetup.WelcomeSetup (cognitive 58): WelcomeSetup.WelcomeSetup has cognitive complexity 58 (threshold 15). Drivers by points: ternaries 21 (55 pts), boolean chains 3 (nesting depth added 34). Of this number, 52 points are the body\u0027s own statements and 6 belong to 4 function literals inside it that branch. 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":"desktop/src/features/communities/ui/WelcomeSetup.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"827250e533461d70f693aa9d6771b02c46e230514c3bc98f87b71b29cfed2a22"}},{"ruleId":"D2","level":"warning","message":{"text":"IdentityRecoveryPairing.IdentityRecoveryPairing (cognitive 58): IdentityRecoveryPairing.IdentityRecoveryPairing has cognitive complexity 58 (threshold 15). Drivers by points: ternaries 17 (35 pts), if/else 9 (10 pts), boolean chains 9, error handling 3, loops 1 (nesting depth added 19). Of this number, 40 points are the body\u0027s own statements and 18 belong to 11 function literals 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":"desktop/src/features/onboarding/ui/IdentityRecoveryPairing.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"011b6f8f371bc4567d6e993888d59ec666dc10e50d0ae4b343b7b769704ac127"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::restore::restore_managed_agents_on_launch (cognitive 57): buzz_desktop::managed_agents::restore::restore_managed_agents_on_launch has cognitive complexity 57 (threshold 15). Drivers by points: if/else 23 (45 pts), match/switch 3 (6 pts), loops 5, boolean chains 1 (nesting depth added 25). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/restore.rs"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d2d607f64cb14f363f59dac3f3587b9323ecdae65ee973a56362934c7f4307c"}},{"ruleId":"D2","level":"warning","message":{"text":"exhaustive.test_compaction_register_exhaustive (cognitive 57): exhaustive.test_compaction_register_exhaustive has cognitive complexity 57 (threshold 15). Drivers by points: if/else 4 (26 pts), loops 6 (22 pts), ternaries 1 (6 pts), boolean chains 3 (nesting depth added 43). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/formal/nip-rs-unread/exhaustive.py"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"5eff11beeca80d29719bfd31ead864855e2572799905b0f103fda631058ff68b"}},{"ruleId":"D2","level":"warning","message":{"text":"IssueAssigneesRow.IssueAssigneesRow (cognitive 56): IssueAssigneesRow.IssueAssigneesRow has cognitive complexity 56 (threshold 15). Drivers by points: ternaries 19 (34 pts), boolean chains 16, if/else 4, error handling 2 (nesting depth added 15). Of this number, 29 points are the body\u0027s own statements and 27 belong to 6 function literals 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":"desktop/src/features/projects/ui/IssueAssigneesRow.tsx"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5ef6935a316f2ee86b90fdab563f2bdcaee5f69597504c72901dccee733caa6"}},{"ruleId":"D2","level":"warning","message":{"text":"useAddProjectRepository.addProjectRepository (cognitive 55): useAddProjectRepository.addProjectRepository has cognitive complexity 55 (threshold 15). Drivers by points: if/else 17 (27 pts), ternaries 5 (13 pts), error handling 5 (11 pts), boolean chains 4 (nesting depth added 24). Of this number, 54 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/useAddProjectRepository.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f3f80002f20a80399572086efea725c985b308f44538af79b6f38ead5877485"}},{"ruleId":"D2","level":"warning","message":{"text":"useSearchResults.useSearchResults (cognitive 55): useSearchResults.useSearchResults has cognitive complexity 55 (threshold 15). Drivers by points: boolean chains 24, if/else 14 (16 pts), loops 9, ternaries 6 (nesting depth added 2). Of this number, 18 points are the body\u0027s own statements and 37 belong to 13 function literals 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":"desktop/src/features/search/useSearchResults.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"51f516919252ad1c375eae8c8e9bdbff3e422a276c0e719be17bd7e1b02960ed"}},{"ruleId":"D2","level":"warning","message":{"text":"SettingsPanels.ThemeSettingsCard (cognitive 55): SettingsPanels.ThemeSettingsCard has cognitive complexity 55 (threshold 15). Drivers by points: ternaries 19 (29 pts), if/else 9 (16 pts), boolean chains 10 (nesting depth added 17). Of this number, 30 points are the body\u0027s own statements and 25 belong to 4 function literals 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":"desktop/src/features/settings/ui/SettingsPanels.tsx"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"154fd5b1bd44b07e24c72eb86b9590d35f100ee5601ed0e64784e4e99d96b2f6"}},{"ruleId":"D2","level":"warning","message":{"text":"Config::from_args (cognitive 54): Config::from_args has cognitive complexity 54 (threshold 15). Drivers by points: if/else 38 (45 pts), boolean chains 4, loops 2 (4 pts), match/switch 1 (nesting depth added 9). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/config.rs"},"region":{"startLine":933}}}],"partialFingerprints":{"codehealthFindingId/v1":"912bd7cbf0ba3ef365e931eaf54813fe86b3c0b6b0e1f279825f6e1711516a1a"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::handle_prompt_result (cognitive 54): buzz_acp::handle_prompt_result has cognitive complexity 54 (threshold 15). Drivers by points: if/else 22 (39 pts), match/switch 6 (11 pts), boolean chains 3, loops 1 (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/buzz-acp/src/lib.rs"},"region":{"startLine":4655}}}],"partialFingerprints":{"codehealthFindingId/v1":"d575e0d0d44273a14698f8aab53ba19ccc1a2f446a911d6898f96f497b6f8b12"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::api::git::policy::hook_policy_check (cognitive 54): buzz_relay::api::git::policy::hook_policy_check has cognitive complexity 54 (threshold 15). Drivers by points: match/switch 13 (21 pts), if/else 17 (19 pts), boolean chains 11, loops 2 (3 pts) (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/git/policy.rs"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ed593f5f6579f7ab0ffd583d2b278ded11ddd19761a25f6167990aeda47a605"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::side_effects::handle_standard_deletion_event (cognitive 54): buzz_relay::handlers::side_effects::handle_standard_deletion_event has cognitive complexity 54 (threshold 15). Drivers by points: if/else 16 (50 pts), match/switch 1 (2 pts), boolean chains 1, loops 1 (nesting depth added 35). 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/buzz-relay/src/handlers/side_effects.rs"},"region":{"startLine":2365}}}],"partialFingerprints":{"codehealthFindingId/v1":"27d836569d95359ec32487afdceb6c3b38360032cb9da740cc27a155b9405a57"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaImageViewerPage.build (cognitive 54): MediaImageViewerPage.build has cognitive complexity 54 (threshold 15). Drivers by points: if/else 30 (33 pts), boolean chains 13, ternaries 5, loops 3 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/media_viewer_page.dart"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1d047624602d1b7717270188912e40966abaf2614c27bfa896e3815e17adc4c"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::huddle::start_huddle (cognitive 53): buzz_desktop::huddle::start_huddle has cognitive complexity 53 (threshold 15). Drivers by points: if/else 20 (45 pts), match/switch 3 (5 pts), loops 2, boolean chains 1 (nesting depth added 27). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/huddle/mod.rs"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d1403bca55d0e01f163d766bc42b6fdea2eeff832685e10aa48e49aa4b00a8c"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelActionsSheet.build (cognitive 53): ChannelActionsSheet.build has cognitive complexity 53 (threshold 15). Drivers by points: if/else 16 (33 pts), boolean chains 13, ternaries 6 (7 pts) (nesting depth added 18). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_actions_sheet.dart"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"d10f4eaa3a57f0cf8e49118c6423c6aa4df1aa8ada5f99d341360854ba2c43e4"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentRuntimeAvatarControl.AgentRuntimeAvatarControl (cognitive 53): AgentRuntimeAvatarControl.AgentRuntimeAvatarControl has cognitive complexity 53 (threshold 15). Drivers by points: ternaries 26 (43 pts), boolean chains 8, if/else 1 (2 pts) (nesting depth added 18). Of this number, 51 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentRuntimeAvatarControl.tsx"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"7758e9930e7b43bc738aeafbce0d6cc8a865675fe66c0dfe0a597332d68578f6"}},{"ruleId":"D2","level":"warning","message":{"text":"welcomeKickoff.useWelcomeKickoff (cognitive 53): welcomeKickoff.useWelcomeKickoff has cognitive complexity 53 (threshold 15). Drivers by points: if/else 27 (37 pts), boolean chains 11, ternaries 3, error handling 1, loops 1 (nesting depth added 10). Most of this is not in the body itself: 3 of the 53 points are its own statements and the rest belongs to 12 function literals inside it that branch (lines 576, 725, 612, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/welcomeKickoff.ts"},"region":{"startLine":494}}}],"partialFingerprints":{"codehealthFindingId/v1":"949fa789bf66b3cd873e72cc2cb7182194c16ea22e083543a38846fe21e7d1b9"}},{"ruleId":"D2","level":"warning","message":{"text":"markdown.createMarkdownComponents (cognitive 53): markdown.createMarkdownComponents has cognitive complexity 53 (threshold 15). Drivers by points: if/else 24 (30 pts), ternaries 11 (12 pts), boolean chains 11 (nesting depth added 7). Of this number, 23 points are the body\u0027s own statements and 30 belong to 10 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/markdown.tsx"},"region":{"startLine":1212}}}],"partialFingerprints":{"codehealthFindingId/v1":"543fb8c6be5fcea556fc3729480f59ecb99fa7cce8b7a6b1b4b66c868306de15"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::report_resolution::drive_enforcement (cognitive 52): buzz_relay::handlers::report_resolution::drive_enforcement has cognitive complexity 52 (threshold 15). Drivers by points: if/else 14 (37 pts), match/switch 4 (14 pts), loops 1 (nesting depth added 33). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/report_resolution.rs"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c459518dae2357fdcb3d67b7e51ba21bd733903485f4c6bbedecb5f1f7c010f"}},{"ruleId":"D2","level":"warning","message":{"text":"useLiveChannelUpdates.useLiveChannelUpdates (cognitive 52): useLiveChannelUpdates.useLiveChannelUpdates has cognitive complexity 52 (threshold 15). Drivers by points: if/else 27 (37 pts), boolean chains 12, loops 2, ternaries 1 (nesting depth added 10). Most of this is not in the body itself: 1 of the 52 points is its own statement and the rest belongs to 11 function literals inside it that branch (lines 245, 209, 390, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/useLiveChannelUpdates.ts"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fa7c3d291dcbb0dc194662e69308351cf2187bf521bfe11014b78151aba84d4"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowAuthorPicker.WorkflowAuthorPicker (cognitive 52): WorkflowAuthorPicker.WorkflowAuthorPicker has cognitive complexity 52 (threshold 15). Drivers by points: ternaries 18 (30 pts), if/else 12 (13 pts), boolean chains 9 (nesting depth added 13). Of this number, 17 points are the body\u0027s own statements and 35 belong to 10 function literals 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":"desktop/src/features/workflows/ui/WorkflowAuthorPicker.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf14a47d6635109357ce841832d5644737ee830fe71292bbf3e75b16b0a29c61"}},{"ruleId":"D2","level":"warning","message":{"text":"CommunitySwitcher.CommunitySwitcher (cognitive 51): CommunitySwitcher.CommunitySwitcher has cognitive complexity 51 (threshold 15). Drivers by points: ternaries 22 (39 pts), if/else 9, boolean chains 2, error handling 1 (nesting depth added 17). Of this number, 41 points are the body\u0027s own statements and 10 belong to 4 function literals 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":"desktop/src/features/communities/ui/CommunitySwitcher.tsx"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"e54002430118a95501fe51fff87a631b9bf655afede3e6c98615d4783d5367f4"}},{"ruleId":"D2","level":"warning","message":{"text":"ComposerUploadProgressPill.ComposerUploadProgressPill (cognitive 50): ComposerUploadProgressPill.ComposerUploadProgressPill has cognitive complexity 50 (threshold 15). Drivers by points: ternaries 22 (50 pts) (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":"desktop/src/features/messages/ui/ComposerUploadProgressPill.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"f285e814faa63d17b90c006ab5dde2814c4770cc7192f4409efd8697c5ddba7a"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::queue::format_context_hints (cognitive 49): buzz_acp::queue::format_context_hints has cognitive complexity 49 (threshold 15). Drivers by points: if/else 27 (45 pts), boolean chains 3, match/switch 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/buzz-acp/src/queue.rs"},"region":{"startLine":1606}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ebc1ec1169584e036028117d5a4f3a3a1d94b4eada8d7c516ed2afd0bb6d4b8"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::team_snapshot::confirm_team_snapshot_import (cognitive 49): buzz_desktop::commands::team_snapshot::confirm_team_snapshot_import has cognitive complexity 49 (threshold 15). Drivers by points: match/switch 9 (21 pts), if/else 11 (17 pts), loops 9 (11 pts) (nesting depth added 20). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/team_snapshot.rs"},"region":{"startLine":511}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1bec0b6627752d14ce3600d2d5fe445758af58ebdb03880ff82834b72870e46"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::reset::run_boot_reset_with_keychain (cognitive 49): buzz_desktop::reset::run_boot_reset_with_keychain has cognitive complexity 49 (threshold 15). Drivers by points: if/else 25 (46 pts), boolean chains 2, match/switch 1 (nesting depth added 21). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/reset.rs"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"d11d278a58689bd26ac105e4ed0b1d27dde3c8721d6d9aaca37f522e333314e6"}},{"ruleId":"D2","level":"warning","message":{"text":"exhaustive.test_deep_history_compaction (cognitive 49): exhaustive.test_deep_history_compaction has cognitive complexity 49 (threshold 15). Drivers by points: loops 7 (28 pts), if/else 3 (21 pts) (nesting depth added 39). 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":"docs/formal/nip-rs-unread/exhaustive.py"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a771e546357f1bf5fc114507d988459bf4f43650ac9b59c722ff95e557318ca"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelPicker.ModelPicker (cognitive 49): ModelPicker.ModelPicker has cognitive complexity 49 (threshold 15). Drivers by points: ternaries 13 (28 pts), if/else 9 (14 pts), boolean chains 5, error handling 2 (nesting depth added 20). Of this number, 26 points are the body\u0027s own statements and 23 belong to 4 function literals 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":"desktop/src/features/agents/ui/ModelPicker.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfee124623ca1d55831fb9a13713dcc4ef527aafa1b900bd2253a672a0a9869d"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaVideoViewerPage.build (cognitive 48): MediaVideoViewerPage.build has cognitive complexity 48 (threshold 15). Drivers by points: if/else 22 (38 pts), boolean chains 5, error handling 3 (4 pts), ternaries 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":"mobile/lib/features/channels/media_viewer_page/video_viewer.dart"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"8477126c8f1ead880ee2db361b6b4e1671ff4c888c66e308b672b0be1a6154fa"}},{"ruleId":"D2","level":"warning","message":{"text":"useHuddlePresentation.useHuddlePresentation (cognitive 48): useHuddlePresentation.useHuddlePresentation has cognitive complexity 48 (threshold 15). Drivers by points: if/else 35, boolean chains 12, error handling 1. Most of this is not in the body itself: 3 of the 48 points are its own statements and the rest belongs to 26 function literals inside it that branch (lines 395, 189, 246, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/app/useHuddlePresentation.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"38e12f3163a9fc9e28b3cd41c84e77768ceb25d382613628e79d59ad1c6b7e48"}},{"ruleId":"D2","level":"warning","message":{"text":"AdminConsoleSettingsCard.AdminConsoleSettingsSession (cognitive 48): AdminConsoleSettingsCard.AdminConsoleSettingsSession has cognitive complexity 48 (threshold 15). Drivers by points: if/else 19 (27 pts), ternaries 5 (8 pts), boolean chains 7, error handling 5 (6 pts) (nesting depth added 12). Of this number, 21 points are the body\u0027s own statements and 27 belong to 4 function literals 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":"desktop/src/features/admin-console/AdminConsoleSettingsCard.tsx"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"92e741149bb404981b9d560742b55f207b6a94b3ec46aa6b058dbbd27f153927"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentDefaultsEditor.AgentDefaultsEditor (cognitive 48): AgentDefaultsEditor.AgentDefaultsEditor has cognitive complexity 48 (threshold 15). Drivers by points: ternaries 15 (31 pts), boolean chains 10, if/else 6, error handling 1 (nesting depth added 16). Of this number, 43 points are the body\u0027s own statements and 5 belong to 4 function literals 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":"desktop/src/features/agents/ui/AgentDefaultsEditor.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcadb387c4a52132a3e87f32dbe88152c979d8a698fbb12196b06e05b62f9535"}},{"ruleId":"D2","level":"warning","message":{"text":"PersonaShareDialog.SnapshotShareDialog (cognitive 48): PersonaShareDialog.SnapshotShareDialog has cognitive complexity 48 (threshold 15). Drivers by points: ternaries 21 (26 pts), if/else 15, boolean chains 6, error handling 1 (nesting depth added 5). Of this number, 42 points are the body\u0027s own statements and 6 belong to 5 function literals 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":"desktop/src/features/agents/ui/PersonaShareDialog.tsx"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ed11ee0aedbd41a50273a4abf290b9dcbea61487aeb5b8fcd7e84b9492f0f28"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectRepositoryManagement.ProjectRepositoryManagement (cognitive 48): ProjectRepositoryManagement.ProjectRepositoryManagement has cognitive complexity 48 (threshold 15). Drivers by points: ternaries 17 (32 pts), if/else 3 (7 pts), boolean chains 6, loops 2 (3 pts) (nesting depth added 20). Of this number, 31 points are the body\u0027s own statements and 17 belong to 7 function literals 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":"desktop/src/features/projects/ui/ProjectRepositoryManagement.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"5748f3037643effd5533702e720695756f4548dd8e9b6b1a03979847e769d8e5"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectsActivityFeed.buildActivityItems (cognitive 48): ProjectsActivityFeed.buildActivityItems has cognitive complexity 48 (threshold 15). Drivers by points: ternaries 10 (34 pts), loops 7 (10 pts), boolean chains 2, if/else 1 (2 pts) (nesting depth added 28). Of this number, 44 points are the body\u0027s own statements and 4 belong to 2 function literals 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":"desktop/src/features/projects/ui/ProjectsActivityFeed.tsx"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"83b288ef9df97f6124e10738e609fb25193ff93760f1a2a3ee1edb8dd9f62472"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_persona::validate::advisory_check_skill_names (cognitive 47): buzz_persona::validate::advisory_check_skill_names has cognitive complexity 47 (threshold 15). Drivers by points: if/else 10 (31 pts), match/switch 4 (8 pts), loops 4 (7 pts), boolean chains 1 (nesting depth added 28). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-persona/src/validate.rs"},"region":{"startLine":354}}}],"partialFingerprints":{"codehealthFindingId/v1":"12bc6293eb03e2513644c73b29da4e6b642d7260955dcd2fbac75106e347ae7a"}},{"ruleId":"D2","level":"warning","message":{"text":"modelCapabilities.resolveModelCapabilities (cognitive 47): modelCapabilities.resolveModelCapabilities has cognitive complexity 47 (threshold 15). Drivers by points: if/else 9 (22 pts), ternaries 5 (11 pts), boolean chains 7, loops 3 (7 pts) (nesting depth added 23). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/modelCapabilities.ts"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c5aef3dc8bc9f3ddf4a25a52ebe227d06c55b08979ef68140bff9ac37454de8"}},{"ruleId":"D2","level":"warning","message":{"text":"MeshComputeSettingsCard.MeshComputeSettingsCard (cognitive 47): MeshComputeSettingsCard.MeshComputeSettingsCard has cognitive complexity 47 (threshold 15). Drivers by points: ternaries 15 (25 pts), boolean chains 12, if/else 7, error handling 3 (nesting depth added 10). Of this number, 39 points are the body\u0027s own statements and 8 belong to 4 function literals 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":"desktop/src/features/mesh-compute/ui/MeshComputeSettingsCard.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc64f75f35b0852c130d00ad0234b01501c21ad83b63691b401a90eaba6e5201"}},{"ruleId":"D2","level":"warning","message":{"text":"ComposerAttachments.MediaAttachmentItem (cognitive 47): ComposerAttachments.MediaAttachmentItem has cognitive complexity 47 (threshold 15). Drivers by points: ternaries 20 (32 pts), boolean chains 10, if/else 4 (5 pts) (nesting depth added 13). Of this number, 42 points are the body\u0027s own statements and 5 belong to 3 function literals 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":"desktop/src/features/messages/ui/ComposerAttachments.tsx"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"02b622c22836be766fdba96f8f78e37ee149f45863c6aa3d24688cc6a9dd74ed"}},{"ruleId":"D2","level":"warning","message":{"text":"useComposerLinkPreviews.useComposerLinkPreviews (cognitive 47): useComposerLinkPreviews.useComposerLinkPreviews has cognitive complexity 47 (threshold 15). Drivers by points: if/else 11 (20 pts), boolean chains 13, ternaries 8 (10 pts), loops 4 (nesting depth added 11). Most of this is not in the body itself: 12 of the 47 points are its own statements and the rest belongs to 17 function literals inside it that branch (lines 443, 385, 411, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useComposerLinkPreviews.tsx"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"caa103207961e2b6e56cdf83bcb43cf02d2610c8dc1d1d0b566120acb0d76f5d"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::unread_catch_up::classify_batch (cognitive 46): buzz_desktop::unread_catch_up::classify_batch has cognitive complexity 46 (threshold 15). Drivers by points: if/else 12 (34 pts), boolean chains 6, loops 4 (6 pts) (nesting depth added 24). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/unread_catch_up.rs"},"region":{"startLine":250}}}],"partialFingerprints":{"codehealthFindingId/v1":"71de1aa770d1766aa2cc5f3f5134937dca81686404bfd3335123aa0c5f78986e"}},{"ruleId":"D2","level":"warning","message":{"text":"acceptance.explore (cognitive 46): acceptance.explore has cognitive complexity 46 (threshold 15). Drivers by points: if/else 11 (36 pts), boolean chains 6, loops 3 (4 pts) (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":"docs/formal/nip-pl/acceptance.py"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"44a411f5054b19fc575f23fd2c2c4d37889cbbb2a5ebefa6fe8db084db6ce11d"}},{"ruleId":"D2","level":"warning","message":{"text":"_SliverChannelsList.build (cognitive 46): _SliverChannelsList.build has cognitive complexity 46 (threshold 15). Drivers by points: if/else 15 (28 pts), loops 8 (9 pts), boolean chains 8, ternaries 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channels_page/body.dart"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"442b314cce4b0f05d4a662a05be5d5b0c7792183954f63fe775ca137bbda7799"}},{"ruleId":"D2","level":"warning","message":{"text":"HuddleTransport._handleJoined (cognitive 46): HuddleTransport._handleJoined has cognitive complexity 46 (threshold 15). Drivers by points: if/else 18 (22 pts), boolean chains 20, ternaries 4 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/huddle/huddle_transport.dart"},"region":{"startLine":437}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9cc6a24ae21d66a87f4d605d6d4bc5cdba1f8e754f632bdd95e610491b69721"}},{"ruleId":"D2","level":"warning","message":{"text":"App.CommunityApp (cognitive 46): App.CommunityApp has cognitive complexity 46 (threshold 15). Drivers by points: if/else 24 (28 pts), boolean chains 11, ternaries 4 (7 pts) (nesting depth added 7). Of this number, 20 points are the body\u0027s own statements and 26 belong to 7 function literals 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":"desktop/src/app/App.tsx"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"78f3d81fde86e692a0c704cecda6a9d4f39da1d1d04f5f4860d8e35bf989fe6e"}},{"ruleId":"D2","level":"warning","message":{"text":"ManagedAgentLogPanel.ManagedAgentLogPanel (cognitive 46): ManagedAgentLogPanel.ManagedAgentLogPanel has cognitive complexity 46 (threshold 15). Drivers by points: ternaries 17 (40 pts), boolean chains 5, if/else 1 (nesting depth added 23). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/ManagedAgentLogPanel.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"b84e45c91fd34466e13413c63acceaa7c4f9b55c361370a668027c6feceebf1e"}},{"ruleId":"D2","level":"warning","message":{"text":"TimelineMessageList.VirtualizedTimelineRows (cognitive 46): TimelineMessageList.VirtualizedTimelineRows has cognitive complexity 46 (threshold 15). Drivers by points: if/else 23 (25 pts), ternaries 10, boolean chains 8, loops 3 (nesting depth added 2). Most of this is not in the body itself: 2 of the 46 points are its own statements and the rest belongs to 13 function literals inside it that branch (lines 497, 630, 713, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/TimelineMessageList.tsx"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ecc465f6feff81a26fa5a39e60c4c5e588d1377232aff14d8fa523d56594506"}},{"ruleId":"D2","level":"warning","message":{"text":"TerminalBootstrap.TerminalBootstrap (cognitive 46): TerminalBootstrap.TerminalBootstrap has cognitive complexity 46 (threshold 15). Drivers by points: if/else 29 (30 pts), boolean chains 9, ternaries 6, loops 1 (nesting depth added 1). Most of this is not in the body itself: 6 of the 46 points are its own statements and the rest belongs to 21 function literals inside it that branch (lines 103, 147, 283, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/terminal/TerminalBootstrap.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"8874e059ea64e5c36065f06fb3d3197020e0bae52d11fd10621f935a15839d8f"}},{"ruleId":"D2","level":"warning","message":{"text":"localStorageSweep.sweepChunked (cognitive 46): localStorageSweep.sweepChunked has cognitive complexity 46 (threshold 15). Drivers by points: if/else 20 (33 pts), error handling 5 (7 pts), boolean chains 3, loops 3 (nesting depth added 15). Most of this is not in the body itself: 13 of the 46 points are its own statements and the rest belongs to one function literal inside it that branches (line 215). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/lib/localStorageSweep.ts"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"efec4b923b62bbd36e58aa10fef871bcff4ba1e9e5c96cc6693327dc9ccbe946"}},{"ruleId":"D2","level":"warning","message":{"text":"AppShell.AppShell (cognitive 45): AppShell.AppShell has cognitive complexity 45 (threshold 15). Drivers by points: ternaries 20 (24 pts), boolean chains 11, if/else 9, error handling 1 (nesting depth added 4). Of this number, 28 points are the body\u0027s own statements and 17 belong to 8 function literals 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":"desktop/src/app/AppShell.tsx"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"f876f5bf38e7ed3988393851e91721e5b10a5ce099eec2ca80bc6156f2e76d33"}},{"ruleId":"D2","level":"warning","message":{"text":"PulseView.PulseView (cognitive 45): PulseView.PulseView has cognitive complexity 45 (threshold 15). Drivers by points: ternaries 16 (28 pts), if/else 7 (8 pts), boolean chains 5, loops 4 (nesting depth added 13). Of this number, 28 points are the body\u0027s own statements and 17 belong to 7 function literals 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":"desktop/src/features/pulse/ui/PulseView.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"863b8d980a3a1461bb43b02bf30e97ff60b8f28de3c782c22e9d50e238d27e96"}},{"ruleId":"D2","level":"warning","message":{"text":"mentionBoundaries.maskMarkdownCode (cognitive 45): mentionBoundaries.maskMarkdownCode has cognitive complexity 45 (threshold 15). Drivers by points: if/else 9 (21 pts), loops 8 (13 pts), boolean chains 11 (nesting depth added 17). Of this number, 42 points are the body\u0027s own statements and 3 belong to 2 function literals 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":"desktop/src/shared/lib/mentionBoundaries.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0b8501e295ef1bf6d859007ee8e8a1b14df5c5089f7bfef001a25ef20b1cd06"}},{"ruleId":"D2","level":"warning","message":{"text":"nostr-client.queryEvents (cognitive 45): nostr-client.queryEvents has cognitive complexity 45 (threshold 15). Drivers by points: if/else 19 (26 pts), ternaries 3 (10 pts), boolean chains 5, error handling 3 (4 pts) (nesting depth added 15). Most of this is not in the body itself: 0 of the 45 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 80, 55, 47, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/shared/lib/nostr-client.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f6e04ebba3831d602d21ebb8e199ec9ed92478840f72677a38ead565ccbd02b"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::relay::resubscribe_after_reconnect (cognitive 44): buzz_acp::relay::resubscribe_after_reconnect has cognitive complexity 44 (threshold 15). Drivers by points: if/else 17 (34 pts), match/switch 3 (7 pts), loops 1 (2 pts), boolean chains 1 (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/buzz-acp/src/relay.rs"},"region":{"startLine":2669}}}],"partialFingerprints":{"codehealthFindingId/v1":"3119620eb6506fdcecc68c8b25dea37d80298359e79a81f32f71a094c0cab6b0"}},{"ruleId":"D2","level":"warning","message":{"text":"BuzzClient::submit_moderation_event (cognitive 44): BuzzClient::submit_moderation_event has cognitive complexity 44 (threshold 15). Drivers by points: if/else 11 (38 pts), boolean chains 3, match/switch 1 (2 pts), 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/buzz-cli/src/client.rs"},"region":{"startLine":980}}}],"partialFingerprints":{"codehealthFindingId/v1":"e456e2de9f3349ea5bdadf9240bed06058b41d9d803961881ba723c3443c951e"}},{"ruleId":"D2","level":"warning","message":{"text":"BuzzPushPresentationCacheStore.updateChannels (cognitive 44): BuzzPushPresentationCacheStore.updateChannels has cognitive complexity 44 (threshold 15). Drivers by points: boolean chains 20, if/else 7 (12 pts), ternaries 5 (10 pts), loops 2 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushPresentationCache.swift"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"120b1ef02e4d979eb13328b504dbaa390369f3b6fb123f544228114cedfbac53"}},{"ruleId":"D2","level":"warning","message":{"text":"CommunityEditForm.CommunityEditForm (cognitive 44): CommunityEditForm.CommunityEditForm has cognitive complexity 44 (threshold 15). Drivers by points: if/else 13 (17 pts), boolean chains 13, ternaries 8 (12 pts), error handling 1 (2 pts) (nesting depth added 9). Of this number, 18 points are the body\u0027s own statements and 26 belong to 4 function literals 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":"desktop/src/features/communities/ui/CommunityEditForm.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"4492eccdb6efaa0fca8bf2ddc279e9e48e97b26bdc25c72ad97def735f01851b"}},{"ruleId":"D2","level":"warning","message":{"text":"useInboxSelectionAnchor.useInboxSelectionAnchor (cognitive 44): useInboxSelectionAnchor.useInboxSelectionAnchor has cognitive complexity 44 (threshold 15). Drivers by points: if/else 19 (22 pts), boolean chains 14, ternaries 6 (8 pts) (nesting depth added 5). Of this number, 16 points are the body\u0027s own statements and 28 belong to 11 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/useInboxSelectionAnchor.ts"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e5d29008500836cd84154963af5015c17c24ee20f296d700c53848f3ab75437"}},{"ruleId":"D2","level":"warning","message":{"text":"useInboxThreadContext.useInboxThreadContext (cognitive 44): useInboxThreadContext.useInboxThreadContext has cognitive complexity 44 (threshold 15). Drivers by points: if/else 16 (18 pts), boolean chains 13, ternaries 8, error handling 4, loops 1 (nesting depth added 2). Most of this is not in the body itself: 5 of the 44 points are its own statements and the rest belongs to 12 function literals inside it that branch (lines 81, 110, 279, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/useInboxThreadContext.ts"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"b36dcd4778ccabd29a9b65104b0bd3dd7bed2c44b5ce2023ad332dcf001f6015"}},{"ruleId":"D2","level":"warning","message":{"text":"useVoiceNoteRecorder.useVoiceNoteRecorder (cognitive 44): useVoiceNoteRecorder.useVoiceNoteRecorder has cognitive complexity 44 (threshold 15). Drivers by points: if/else 18 (23 pts), boolean chains 14, error handling 2 (3 pts), ternaries 2 (3 pts), loops 1 (nesting depth added 7). Most of this is not in the body itself: 0 of the 44 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 68, 125, 52, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useVoiceNoteRecorder.ts"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"da118fac28ed77f65a1ce5a5bc373f7ac473741568abdd10868777919f01b497"}},{"ruleId":"D2","level":"warning","message":{"text":"DownloadKeyStep.DownloadKeyStep (cognitive 44): DownloadKeyStep.DownloadKeyStep has cognitive complexity 44 (threshold 15). Drivers by points: ternaries 30 (44 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":"desktop/src/features/onboarding/ui/DownloadKeyStep.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b3ccc64c9b8971979b19dfdb6bb0fd45d17b24ac75ef9bcf3f73caa1482c928"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectReadmePanel.ReadmePanel (cognitive 44): ProjectReadmePanel.ReadmePanel has cognitive complexity 44 (threshold 15). Drivers by points: ternaries 18 (37 pts), if/else 5 (6 pts), boolean chains 1 (nesting depth added 20). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectReadmePanel.tsx"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b29f31d62c0fb6a634e14c3ed1b4a52305e4ea161cd7cc9fcf189437774c30e"}},{"ruleId":"D2","level":"warning","message":{"text":"useResolvedLinkPreviews.useResolvedLinkPreviews (cognitive 44): useResolvedLinkPreviews.useResolvedLinkPreviews has cognitive complexity 44 (threshold 15). Drivers by points: if/else 10 (20 pts), ternaries 6 (14 pts), loops 4 (7 pts), boolean chains 3 (nesting depth added 21). Most of this is not in the body itself: 0 of the 44 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 695, 756, 771, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/lib/useResolvedLinkPreviews.ts"},"region":{"startLine":646}}}],"partialFingerprints":{"codehealthFindingId/v1":"7eeec858d00388d6d3d0b0dec8e889a7cde4bc6e3eaf1848935e0e701bdb86a9"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::media_proxy::handle_buzz_media (cognitive 43): buzz_desktop::media_proxy::handle_buzz_media has cognitive complexity 43 (threshold 15). Drivers by points: if/else 18 (37 pts), match/switch 3 (4 pts), boolean chains 2 (nesting depth added 20). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/media_proxy.rs"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"16a8eeacafe5c9d597e267e6fdfc0b729bf993814389859a75049d9ee780c5e1"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::agent_models_update::update_managed_agent (cognitive 43): buzz_desktop::commands::agent_models_update::update_managed_agent has cognitive complexity 43 (threshold 15). Drivers by points: if/else 24 (32 pts), boolean chains 5, match/switch 2 (5 pts), loops 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/agent_models_update.rs"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f2345a62647c9a9e971e185b19ba3283ed03dec87527458c62af000ad056af6"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentCardMintDialog.AgentCardMintDialog (cognitive 43): AgentCardMintDialog.AgentCardMintDialog has cognitive complexity 43 (threshold 15). Drivers by points: ternaries 17 (38 pts), boolean chains 5 (nesting depth added 21). Of this number, 42 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. 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":"desktop/src/features/agents/ui/AgentCardMintDialog.tsx"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"eada303006ad93b3484b0ff74d7f54adc3703a78257a73cf28053ad9f1288f33"}},{"ruleId":"D2","level":"warning","message":{"text":"RespondToField.AllowlistPicker (cognitive 43): RespondToField.AllowlistPicker has cognitive complexity 43 (threshold 15). Drivers by points: ternaries 18 (39 pts), boolean chains 4 (nesting depth added 21). Of this number, 39 points are the body\u0027s own statements and 4 belong to one function literal inside it that branches. 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":"desktop/src/features/agents/ui/RespondToField.tsx"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"743512fee231f77e5bc636906688215bd80477f2ddc368ac21f5cd305c3059f1"}},{"ruleId":"D2","level":"warning","message":{"text":"useTtsSubscription.useTtsSubscription (cognitive 43): useTtsSubscription.useTtsSubscription has cognitive complexity 43 (threshold 15). Drivers by points: if/else 30 (34 pts), boolean chains 3, error handling 2 (3 pts), ternaries 1 (2 pts), loops 1 (nesting depth added 6). Most of this is not in the body itself: 0 of the 43 points are its own statements and the rest belongs to 15 function literals inside it that branch (lines 129, 40, 290, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/lib/useTtsSubscription.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b4913aac91fcdcbc137f6c6529abe2ec1bc11e4c298f997ef3829b4cb199890"}},{"ruleId":"D2","level":"warning","message":{"text":"PullRequestReviewCard.PullRequestReviewCard (cognitive 43): PullRequestReviewCard.PullRequestReviewCard has cognitive complexity 43 (threshold 15). Drivers by points: ternaries 13 (20 pts), boolean chains 16, if/else 5, error handling 2 (nesting depth added 7). Of this number, 25 points are the body\u0027s own statements and 18 belong to 4 function literals 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":"desktop/src/features/projects/ui/PullRequestReviewCard.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ba58bdd89e7eec09a2a77e81cc246f4e96cf1c47e67aa2903042bb23849495c"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_agent::databricks_label_grammar::generate_databricks_label (cognitive 42): buzz_agent::databricks_label_grammar::generate_databricks_label has cognitive complexity 42 (threshold 15). Drivers by points: if/else 16 (23 pts), match/switch 5 (9 pts), boolean chains 8, loops 2 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/databricks_label_grammar.rs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"20da06d03e602f6975b290b786331b7f00b336e548621890c069fc8169fbb63b"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::emit_db_usage_metrics (cognitive 42): buzz_relay::emit_db_usage_metrics has cognitive complexity 42 (threshold 15). Drivers by points: if/else 11 (21 pts), loops 16 (21 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/buzz-relay/src/main.rs"},"region":{"startLine":1949}}}],"partialFingerprints":{"codehealthFindingId/v1":"639fdb3a96c083ecb25e87aa75942d3c33099b378bb69344542fbde5b2d2418f"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::app_state::resolve_identity_with_store (cognitive 42): buzz_desktop::app_state::resolve_identity_with_store has cognitive complexity 42 (threshold 15). Drivers by points: if/else 11 (31 pts), match/switch 3 (9 pts), boolean chains 2 (nesting depth added 26). 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":"desktop/src-tauri/src/app_state.rs"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"4872cef521c62569d5800442658dbde49b6b64abaa32eec53cf49d687dbbfd1f"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::agents::create_managed_agent (cognitive 42): buzz_desktop::commands::agents::create_managed_agent has cognitive complexity 42 (threshold 15). Drivers by points: if/else 26 (29 pts), match/switch 3 (6 pts), boolean chains 5, loops 2 (nesting depth added 6). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/agents.rs"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b4e0757e4c89735b2dda6bdd1dbc8b7c59fcdb0f3e47eaf661035e23bdc25c0"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::runtime::spawn_agent_child (cognitive 42): buzz_desktop::managed_agents::runtime::spawn_agent_child has cognitive complexity 42 (threshold 15). Drivers by points: if/else 26 (28 pts), loops 6 (9 pts), match/switch 3 (4 pts), boolean chains 1 (nesting depth added 6). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/runtime.rs"},"region":{"startLine":484}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a6dfe11351920c1eb90063a550fb2941c07f171d567ba959ad55d37bd49e89f"}},{"ruleId":"D2","level":"warning","message":{"text":"useHuddleParticipantRoster.reconstructHuddleParticipantRoster (cognitive 42): useHuddleParticipantRoster.reconstructHuddleParticipantRoster has cognitive complexity 42 (threshold 15). Drivers by points: if/else 11 (35 pts), loops 2 (3 pts), boolean chains 2, match/switch 1 (2 pts) (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":"desktop/src/features/huddle/hooks/useHuddleParticipantRoster.ts"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a4f65edc250b8f6fddfda5c188cc3417af4895b628ff939528b1c201c74577e"}},{"ruleId":"D2","level":"warning","message":{"text":"MaskedAvatarBadgeFrame.MaskedAvatarBadgeFrame (cognitive 42): MaskedAvatarBadgeFrame.MaskedAvatarBadgeFrame has cognitive complexity 42 (threshold 15). Drivers by points: ternaries 21 (27 pts), boolean chains 14, if/else 1 (nesting depth added 6). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/MaskedAvatarBadgeFrame.tsx"},"region":{"startLine":751}}}],"partialFingerprints":{"codehealthFindingId/v1":"33d6f0d92228863636d2e20baf5d9a66d8f0214c161af4fb3e43bfcb4776ec3c"}},{"ruleId":"D2","level":"warning","message":{"text":"relayReconnectReplay.replayLiveSubscriptions (cognitive 42): relayReconnectReplay.replayLiveSubscriptions has cognitive complexity 42 (threshold 15). Drivers by points: if/else 12 (24 pts), boolean chains 9, ternaries 4 (5 pts), error handling 1 (2 pts), loops 2 (nesting depth added 14). Most of this is not in the body itself: 9 of the 42 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 352, 231, 308, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/api/relayReconnectReplay.ts"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"439bb6edc11787ff3aeaa7c3dd8f088a8fe8d2bc196ea67fbc6afcab1c9d8e73"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::audio::handler::recv_loop (cognitive 41): buzz_relay::audio::handler::recv_loop has cognitive complexity 41 (threshold 15). Drivers by points: if/else 6 (26 pts), match/switch 4 (14 pts), loops 1 (nesting depth added 30). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/audio/handler.rs"},"region":{"startLine":1048}}}],"partialFingerprints":{"codehealthFindingId/v1":"905deb388d38c14431165eda0bd77efa5f9b32f891d469893e68b34f9ee10b08"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::channels::fetch::fetch_channels (cognitive 41): buzz_desktop::commands::channels::fetch::fetch_channels has cognitive complexity 41 (threshold 15). Drivers by points: if/else 14 (29 pts), loops 5 (8 pts), boolean chains 4 (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":"desktop/src-tauri/src/commands/channels/fetch.rs"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"2563b2dac709b3c39303e911530f0787768279e20fd2cc5cb4f4d64dfb58b247"}},{"ruleId":"D2","level":"warning","message":{"text":"exhaustive.test_tombstone_stale_merge_direct (cognitive 41): exhaustive.test_tombstone_stale_merge_direct has cognitive complexity 41 (threshold 15). Drivers by points: loops 6 (21 pts), if/else 3 (19 pts), boolean chains 1 (nesting depth added 31). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/formal/nip-rs-unread/exhaustive.py"},"region":{"startLine":475}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3efa0cf240e13bb79d0c9daa2ef27b61c9293d55ee89874935d07c2867a8a61"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelsNotifier._catchUpUnreadEvents (cognitive 41): ChannelsNotifier._catchUpUnreadEvents has cognitive complexity 41 (threshold 15). Drivers by points: if/else 12 (28 pts), loops 6 (8 pts), boolean chains 3, error handling 2 (nesting depth added 18). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channels_provider.dart"},"region":{"startLine":535}}}],"partialFingerprints":{"codehealthFindingId/v1":"49c4e3f9290c113ad39bd9d697cfdc8edbf6bc42d5f5829ad627b863ff733e58"}},{"ruleId":"D2","level":"warning","message":{"text":"useTeamActions.useTeamActions (cognitive 41): useTeamActions.useTeamActions has cognitive complexity 41 (threshold 15). Drivers by points: ternaries 13 (23 pts), if/else 9, error handling 7 (8 pts), loops 1 (nesting depth added 11). Of this number, 38 points are the body\u0027s own statements and 3 belong to 3 function literals 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":"desktop/src/features/agents/ui/useTeamActions.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2f2ee8a137c8b29b83d6fa39e057f70e9c3e19eb11bd3aac8fb44de8e948e01"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelCombobox.ChannelCombobox (cognitive 41): ChannelCombobox.ChannelCombobox has cognitive complexity 41 (threshold 15). Drivers by points: ternaries 13 (20 pts), boolean chains 13, if/else 6 (7 pts), match/switch 1 (nesting depth added 8). Of this number, 28 points are the body\u0027s own statements and 13 belong to 5 function literals 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":"desktop/src/features/workflows/ui/ChannelCombobox.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"8be0cbad475ed6e84515927cffbcf4adf73a3c3dc4a892b7a55df0cc74b334cd"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::imeta::verify_imeta_blobs (cognitive 40): buzz_relay::handlers::imeta::verify_imeta_blobs has cognitive complexity 40 (threshold 15). Drivers by points: if/else 13 (31 pts), boolean chains 3, loops 2 (3 pts), match/switch 1 (3 pts) (nesting depth added 21). 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/buzz-relay/src/handlers/imeta.rs"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"d788b9d5356ebc0158c117cd1227a1e24281a90440c264e6db905edc408cc6f6"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_voice::pocket_april::split_at_natural_boundaries (cognitive 40): buzz_voice::pocket_april::split_at_natural_boundaries has cognitive complexity 40 (threshold 15). Drivers by points: if/else 10 (23 pts), loops 5 (10 pts), boolean chains 4, match/switch 1 (3 pts) (nesting depth added 20). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-voice/src/pocket_april.rs"},"region":{"startLine":983}}}],"partialFingerprints":{"codehealthFindingId/v1":"7314a3f1c3b5b807f83504afbc6fd44b7057df0f01dee5bb0358d934fad30627"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::migration::detach::detach_directory_backed_teams_in_dir (cognitive 40): buzz_desktop::migration::detach::detach_directory_backed_teams_in_dir has cognitive complexity 40 (threshold 15). Drivers by points: if/else 12 (32 pts), match/switch 1 (4 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 24). 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":"desktop/src-tauri/src/migration/detach.rs"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ad801304d0f094998ceb4335af9becbe17945a416c98a792bbc1430581adb11"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::media_proxy::proxy_handler (cognitive 40): buzz_desktop::media_proxy::proxy_handler has cognitive complexity 40 (threshold 15). Drivers by points: if/else 16 (32 pts), match/switch 2 (4 pts), boolean chains 3, loops 1 (nesting depth added 18). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/media_proxy.rs"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"abfb1ac2b4b475d1d328f8de8db30a687f8c9fcb1b3830c20d6808cc4d332254"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::archive::pipeline::commit_archive (cognitive 40): buzz_desktop::archive::pipeline::commit_archive has cognitive complexity 40 (threshold 15). Drivers by points: if/else 8 (20 pts), match/switch 3 (11 pts), loops 5 (8 pts), boolean chains 1 (nesting depth added 23). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/archive/pipeline.rs"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"a22633d04423a9bdc80540922388fd72de4081c642d8d1b7e34c8e37586c214d"}},{"ruleId":"D2","level":"warning","message":{"text":"_NewDirectMessageSheet.build (cognitive 40): _NewDirectMessageSheet.build has cognitive complexity 40 (threshold 15). Drivers by points: if/else 14 (18 pts), ternaries 9 (10 pts), boolean chains 8, loops 2 (3 pts), error handling 1 (nesting depth added 6). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channels_page/sheets.dart"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"431cd572d3e4b6946d5a9465c53f01f597b74059f79da5dd189b086087a74fa1"}},{"ruleId":"D2","level":"warning","message":{"text":"DeviceVoiceNotePlayerController._toggle (cognitive 40): DeviceVoiceNotePlayerController._toggle has cognitive complexity 40 (threshold 15). Drivers by points: if/else 13 (29 pts), boolean chains 11 (nesting depth added 16). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/voice_note_recording.dart"},"region":{"startLine":807}}}],"partialFingerprints":{"codehealthFindingId/v1":"43481fa717b7f97ee00cff0492d0e1340ed706672f331d400e598dcf9105c2de"}},{"ruleId":"D2","level":"warning","message":{"text":"AdminConsoleStaffingTab.RestrictionsSection (cognitive 40): AdminConsoleStaffingTab.RestrictionsSection has cognitive complexity 40 (threshold 15). Drivers by points: boolean chains 14, if/else 11 (14 pts), ternaries 8 (9 pts), error handling 3 (nesting depth added 4). Of this number, 21 points are the body\u0027s own statements and 19 belong to 6 function literals 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":"desktop/src/features/admin-console/AdminConsoleStaffingTab.tsx"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"64218dc18d1d04099381b97f1796b7a61ceaca62117bf3861611020787b2eb9e"}},{"ruleId":"D2","level":"warning","message":{"text":"useAgentManagement.useAgentManagement (cognitive 40): useAgentManagement.useAgentManagement has cognitive complexity 40 (threshold 15). Drivers by points: if/else 17 (19 pts), ternaries 6 (9 pts), boolean chains 8, error handling 2, loops 1 (2 pts) (nesting depth added 6). Of this number, 21 points are the body\u0027s own statements and 19 belong to 8 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/useAgentManagement.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d1662336c59a51bde0486fa0eada17cf45c912d2e18e37d46dbaa6ca266be44"}},{"ruleId":"D2","level":"warning","message":{"text":"CustomEmojiSettingsCard.CustomEmojiSettingsCard (cognitive 40): CustomEmojiSettingsCard.CustomEmojiSettingsCard has cognitive complexity 40 (threshold 15). Drivers by points: ternaries 15 (23 pts), boolean chains 9, if/else 5, error handling 3 (nesting depth added 8). Of this number, 23 points are the body\u0027s own statements and 17 belong to 4 function literals 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":"desktop/src/features/custom-emoji/ui/CustomEmojiSettingsCard.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"9883f976f7b6c70bf36275515ca0f43054e94d24f6e916aef1aa52310d131372"}},{"ruleId":"D2","level":"warning","message":{"text":"ProfileAvatar.ProfileAvatar (cognitive 40): ProfileAvatar.ProfileAvatar has cognitive complexity 40 (threshold 15). Drivers by points: ternaries 18 (28 pts), boolean chains 8, if/else 2 (4 pts) (nesting depth added 12). Of this number, 35 points are the body\u0027s own statements and 5 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/ProfileAvatar.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"a443f7c771158a33667f81a81ac4b5ef0e096df77e8227e6de0883afaf51d5b8"}},{"ruleId":"D2","level":"warning","message":{"text":"HarnessCatalogDialog.HarnessCatalogDialog (cognitive 40): HarnessCatalogDialog.HarnessCatalogDialog has cognitive complexity 40 (threshold 15). Drivers by points: ternaries 14 (30 pts), boolean chains 6, if/else 4 (nesting depth added 16). Of this number, 35 points are the body\u0027s own statements and 5 belong to 3 function literals 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":"desktop/src/features/settings/ui/HarnessCatalogDialog.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"38a75ea5ea6c7af2bfb252f40e814c6c54af3d27377d1553d08f8844633a7b7d"}},{"ruleId":"D2","level":"warning","message":{"text":"terminalBanner.buildTerminalBanner (cognitive 40): terminalBanner.buildTerminalBanner has cognitive complexity 40 (threshold 15). Drivers by points: if/else 11 (17 pts), loops 10 (13 pts), boolean chains 5, ternaries 4 (5 pts) (nesting depth added 10). Of this number, 35 points are the body\u0027s own statements and 5 belong to 3 function literals 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":"desktop/src/features/terminal/terminalBanner.ts"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"da8ad762c351ac8abe2af5204e286f915f1122fad4bebdf79b802c5ded153f41"}},{"ruleId":"D2","level":"warning","message":{"text":"workflowTriggerDescription.workflowTriggerDescription (cognitive 40): workflowTriggerDescription.workflowTriggerDescription has cognitive complexity 40 (threshold 15). Drivers by points: if/else 12 (17 pts), ternaries 7 (14 pts), boolean chains 9 (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":"desktop/src/features/workflows/ui/workflowTriggerDescription.ts"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ef8a88d2cc18c2dda9fbaafa2ab0423e87711c51533d7e011daba917fac7834"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::config::resolve_channel_filters (cognitive 39): buzz_acp::config::resolve_channel_filters has cognitive complexity 39 (threshold 15). Drivers by points: if/else 8 (24 pts), loops 5 (14 pts), match/switch 1 (nesting depth added 25). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/config.rs"},"region":{"startLine":1337}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf29488d3ebec11a89a393a3add4e4cf9fee32921871a713c0fff6ab09694b6b"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_db::store::replaceable::replace_parameterized_event_in_transaction_impl (cognitive 39): buzz_db::store::replaceable::replace_parameterized_event_in_transaction_impl has cognitive complexity 39 (threshold 15). Drivers by points: if/else 18 (26 pts), boolean chains 11, match/switch 1 (2 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/replaceable.rs"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cd8b46588d28300aed3470ef6abbf2293ce1836431e4a92e99d8ad36a76647c"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::agent_models::normalize_agent_models (cognitive 39): buzz_desktop::commands::agent_models::normalize_agent_models has cognitive complexity 39 (threshold 15). Drivers by points: if/else 9 (30 pts), loops 3 (9 pts) (nesting depth added 27). 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":"desktop/src-tauri/src/commands/agent_models.rs"},"region":{"startLine":710}}}],"partialFingerprints":{"codehealthFindingId/v1":"07936942abc5082e6b26bd3fac1ef1584e3fafe04e25f345931fb0be6e8bcf71"}},{"ruleId":"D2","level":"warning","message":{"text":"VoiceNoteComposerRecorder.build (cognitive 39): VoiceNoteComposerRecorder.build has cognitive complexity 39 (threshold 15). Drivers by points: if/else 16 (21 pts), ternaries 6 (9 pts), boolean chains 6, error handling 3 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/voice_note_composer_recorder.dart"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"38406cda1ec883fb73d885a8dcd6cd6b22940a65d96fe24a885e91a6fec77c26"}},{"ruleId":"D2","level":"warning","message":{"text":"ReadStateManager.mergeEvents (cognitive 39): ReadStateManager.mergeEvents has cognitive complexity 39 (threshold 15). Drivers by points: if/else 11 (24 pts), loops 6 (12 pts), boolean chains 3 (nesting depth added 19). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/readState/readStateManager.ts"},"region":{"startLine":456}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ba0015fe89607ea033be8bf29f49319e45607fe6f8b166ff2a66725c4bdbea2"}},{"ruleId":"D2","level":"warning","message":{"text":"AddMemberDialog.DirectAddMemberForm (cognitive 39): AddMemberDialog.DirectAddMemberForm has cognitive complexity 39 (threshold 15). Drivers by points: ternaries 18 (24 pts), boolean chains 8, if/else 4 (5 pts), error handling 1, loops 1 (nesting depth added 7). Of this number, 30 points are the body\u0027s own statements and 9 belong to 5 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/community-members/ui/AddMemberDialog.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c1ccad2d0caa723d65b2e7145919cf898167e38c588cdb6c9d5fc1d3cc93ee8"}},{"ruleId":"D2","level":"warning","message":{"text":"SystemMessageRow.SystemMessageRow (cognitive 39): SystemMessageRow.SystemMessageRow has cognitive complexity 39 (threshold 15). Drivers by points: ternaries 18 (24 pts), boolean chains 9, if/else 5 (6 pts) (nesting depth added 7). Of this number, 29 points are the body\u0027s own statements and 10 belong to 7 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/SystemMessageRow.tsx"},"region":{"startLine":649}}}],"partialFingerprints":{"codehealthFindingId/v1":"6daeb1e4c6a43617d276af930f8d0f658e78ac5f70b3e2efbbd8835f6f06227a"}},{"ruleId":"D2","level":"warning","message":{"text":"CreatePullRequestDialog.CreatePullRequestDialog (cognitive 39): CreatePullRequestDialog.CreatePullRequestDialog has cognitive complexity 39 (threshold 15). Drivers by points: ternaries 10 (26 pts), boolean chains 8, if/else 5 (nesting depth added 16). Of this number, 30 points are the body\u0027s own statements and 9 belong to 6 function literals inside it that branch. 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":"desktop/src/features/projects/ui/CreatePullRequestDialog.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"b49f076fe07c6a4adfb5052e4315000807af1d52ed7e432f5db45d8a96ed38b7"}},{"ruleId":"D2","level":"warning","message":{"text":"entityLink.parseEntityLink (cognitive 39): entityLink.parseEntityLink has cognitive complexity 39 (threshold 15). Drivers by points: if/else 12 (16 pts), boolean chains 11, ternaries 5 (9 pts), loops 2, error handling 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":"desktop/src/shared/lib/entityLink.ts"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbb202b70f6ad351f03e6336c6b47720e05099fd60faac065b55a094bd411b83"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::relay::execute_connected_command (cognitive 38): buzz_acp::relay::execute_connected_command has cognitive complexity 38 (threshold 15). Drivers by points: if/else 18 (35 pts), boolean chains 2, match/switch 1 (nesting depth added 17). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/relay.rs"},"region":{"startLine":1548}}}],"partialFingerprints":{"codehealthFindingId/v1":"a50565384eb6311a23e32fefd283da7fb1ac3c4438c5153a4ffeced131556a73"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_agent::llm::parse_responses (cognitive 38): buzz_agent::llm::parse_responses has cognitive complexity 38 (threshold 15). Drivers by points: if/else 7 (27 pts), loops 3 (7 pts), match/switch 2 (3 pts), boolean chains 1 (nesting depth added 25). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/llm.rs"},"region":{"startLine":1011}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a286606e5138a61afce57631feba5004788243d28541b72980593a87c7875ea"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_dev_mcp::tree::run (cognitive 38): buzz_dev_mcp::tree::run has cognitive complexity 38 (threshold 15). Drivers by points: if/else 16 (31 pts), loops 4 (5 pts), boolean chains 1, match/switch 1 (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-dev-mcp/src/tree.rs"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"de63c4170694ec6b345066e05bf9b37620701675a72cad3ed641c97c17de605e"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_media::validation::validate_gif_metadata_free (cognitive 38): buzz_media::validation::validate_gif_metadata_free has cognitive complexity 38 (threshold 15). Drivers by points: if/else 9 (26 pts), boolean chains 5, match/switch 2 (5 pts), loops 2 (nesting depth added 20). Of this number, 35 points are the body\u0027s own statements and 3 belong to one function item inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-media/src/validation.rs"},"region":{"startLine":750}}}],"partialFingerprints":{"codehealthFindingId/v1":"b90f03c271dea26cb0772f7a0306917bcdc598b4e097979a80aa5832a3370cf6"}},{"ruleId":"D2","level":"warning","message":{"text":"HuddleAudioEngine.runCapture (cognitive 38): HuddleAudioEngine.runCapture has cognitive complexity 38 (threshold 15). Drivers by points: if/else 12 (28 pts), loops 3 (6 pts), boolean chains 3, error handling 1 (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":"mobile/android/app/src/main/kotlin/xyz/block/buzz/mobile/HuddleAudioEngine.kt"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdd3aca4e0cb2b7da096da594faf9252eed800667db0411ad2952c2454806c12"}},{"ruleId":"D2","level":"warning","message":{"text":"AddChannelMembersSheet.build (cognitive 38): AddChannelMembersSheet.build has cognitive complexity 38 (threshold 15). Drivers by points: if/else 8 (14 pts), ternaries 11 (13 pts), loops 4 (7 pts), boolean chains 2, error handling 2 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/add_members_sheet.dart"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"c170cccfea189173d1df4613d35298e2b205c4d083d344ffea740c7c6f7650ff"}},{"ruleId":"D2","level":"warning","message":{"text":"CommunityThemeNotifier.build (cognitive 38): CommunityThemeNotifier.build has cognitive complexity 38 (threshold 15). Drivers by points: if/else 13 (28 pts), boolean chains 8, ternaries 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":"mobile/lib/shared/theme/community_theme_provider.dart"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"56b8c1a1b0407854261116987b2ba936b6c99de38216522df979236274d82836"}},{"ruleId":"D2","level":"warning","message":{"text":"ComposerImageEditor.ComposerImageEditor (cognitive 38): ComposerImageEditor.ComposerImageEditor has cognitive complexity 38 (threshold 15). Drivers by points: if/else 19, boolean chains 14, ternaries 3, error handling 1, loops 1. Most of this is not in the body itself: 4 of the 38 points are its own statements and the rest belongs to 13 function literals inside it that branch (lines 219, 252, 274, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/ComposerImageEditor.tsx"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f83bdbe22d9ec2659195d16144a553c38c630ccb1be508f0aaf563cfb486eeb"}},{"ruleId":"D2","level":"warning","message":{"text":"SetupStep.RuntimeCard (cognitive 38): SetupStep.RuntimeCard has cognitive complexity 38 (threshold 15). Drivers by points: ternaries 16 (27 pts), boolean chains 10, if/else 1 (nesting depth added 11). Of this number, 36 points are the body\u0027s own statements and 2 belong to 2 function literals 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":"desktop/src/features/onboarding/ui/SetupStep.tsx"},"region":{"startLine":420}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a0612cf7335637cb74b61af0be1fab6b1202312c3b277205bdab85e678cdb4e"}},{"ruleId":"D2","level":"warning","message":{"text":"VoiceSettingsCard.VoiceSettingsCard (cognitive 38): VoiceSettingsCard.VoiceSettingsCard has cognitive complexity 38 (threshold 15). Drivers by points: ternaries 10 (16 pts), boolean chains 8, if/else 8, error handling 5 (6 pts) (nesting depth added 7). Most of this is not in the body itself: 11 of the 38 points are its own statements and the rest belongs to 13 function literals inside it that branch (lines 84, 135, 70, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/VoiceSettingsCard.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"caf9abbcfa9bc8ab1f8f94941a28beb5bced534ad1958ae0f05809492196463c"}},{"ruleId":"D2","level":"warning","message":{"text":"InvitePage.InvitePage (cognitive 38): InvitePage.InvitePage has cognitive complexity 38 (threshold 15). Drivers by points: ternaries 11 (15 pts), if/else 12, boolean chains 10, error handling 1 (nesting depth added 4). Of this number, 22 points are the body\u0027s own statements and 16 belong to 11 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/features/invite/ui/InvitePage.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"195896c4f7078ade27dfd74bea90ec60ba598fc5409e1a42529832009d210f05"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::ingest::validate_project_envelope (cognitive 37): buzz_relay::handlers::ingest::validate_project_envelope has cognitive complexity 37 (threshold 15). Drivers by points: if/else 16 (26 pts), match/switch 2 (6 pts), loops 4, boolean chains 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":1681}}}],"partialFingerprints":{"codehealthFindingId/v1":"9eb5bf23c99386696d20ee018802807c1b267b085a8d96193f7002798f3b6221"}},{"ruleId":"D2","level":"warning","message":{"text":"_RecentPhotoGalleryPicker.build (cognitive 37): _RecentPhotoGalleryPicker.build has cognitive complexity 37 (threshold 15). Drivers by points: ternaries 13 (20 pts), if/else 12 (15 pts), boolean chains 1, error handling 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/compose_bar/photo_gallery_picker.dart"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"474d035d63428eb5960a2a898083ed44305cbd814999d39122aa41f20a6f2aee"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelMemberInviteCard.ChannelMemberInviteCard (cognitive 37): ChannelMemberInviteCard.ChannelMemberInviteCard has cognitive complexity 37 (threshold 15). Drivers by points: ternaries 15 (28 pts), boolean chains 6, if/else 3 (nesting depth added 13). Of this number, 21 points are the body\u0027s own statements and 16 belong to 7 function literals 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":"desktop/src/features/channels/ui/ChannelMemberInviteCard.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"19cb6f892ef754e7cb1b7a3772f01b9eba84ea73b96c22fe21d83643c26af565"}},{"ruleId":"D2","level":"warning","message":{"text":"useCommunityJoinAlerts.useCommunityJoinAlerts (cognitive 37): useCommunityJoinAlerts.useCommunityJoinAlerts has cognitive complexity 37 (threshold 15). Drivers by points: if/else 24 (26 pts), boolean chains 7, loops 2, error handling 1, ternaries 1 (nesting depth added 2). Most of this is not in the body itself: 1 of the 37 points is its own statement and the rest belongs to 13 function literals inside it that branch (lines 303, 231, 523, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/community-members/useCommunityJoinAlerts.ts"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"df23eeaed71db1d76e27566dd8dd905c7e0eeffb3356a9dc90103e3c1679317e"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectConversationPanel.ProjectConversationPanel (cognitive 37): ProjectConversationPanel.ProjectConversationPanel has cognitive complexity 37 (threshold 15). Drivers by points: boolean chains 15, ternaries 12 (14 pts), if/else 8 (nesting depth added 2). Of this number, 30 points are the body\u0027s own statements and 7 belong to 5 function literals 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":"desktop/src/features/projects/ui/ProjectConversationPanel.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"00ba1f655031fa2e90c67fc7b4db8badc2dde347666341b2a063047dbefa5a87"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectRepositoryPanel.RepositoryFilesPanel (cognitive 37): ProjectRepositoryPanel.RepositoryFilesPanel has cognitive complexity 37 (threshold 15). Drivers by points: ternaries 15 (23 pts), boolean chains 7, if/else 5 (7 pts) (nesting depth added 10). Of this number, 36 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectRepositoryPanel.tsx"},"region":{"startLine":614}}}],"partialFingerprints":{"codehealthFindingId/v1":"ceeba5c45f81fdc03345517661c74608a65a73cfc89d051955b57f19bcd78772"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelTemplatesSettingsCard.TemplateFormDialog (cognitive 37): ChannelTemplatesSettingsCard.TemplateFormDialog has cognitive complexity 37 (threshold 15). Drivers by points: if/else 10 (14 pts), ternaries 7 (11 pts), boolean chains 8, loops 2 (4 pts) (nesting depth added 10). Of this number, 16 points are the body\u0027s own statements and 21 belong to 7 function literals 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":"desktop/src/features/settings/ui/ChannelTemplatesSettingsCard.tsx"},"region":{"startLine":291}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2cf3aa379986cc8038d4f89fe71c846c34a4bf94c6688a397d04233097fe84f"}},{"ruleId":"D2","level":"warning","message":{"text":"MessageLinkPill.MessageLinkPillContents (cognitive 37): MessageLinkPill.MessageLinkPillContents has cognitive complexity 37 (threshold 15). Drivers by points: ternaries 12 (24 pts), if/else 5 (8 pts), boolean chains 5 (nesting depth added 15). Of this number, 28 points are the body\u0027s own statements and 9 belong to 2 function literals 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":"desktop/src/shared/ui/markdown/MessageLinkPill.tsx"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e22160c28daebe476ce479a9d9883376724896906f25a38f713c31a4047df37"}},{"ruleId":"D2","level":"warning","message":{"text":"GitStore::run_conformance_probe (cognitive 36): GitStore::run_conformance_probe has cognitive complexity 36 (threshold 15). Drivers by points: if/else 7 (13 pts), loops 8 (12 pts), match/switch 4 (9 pts), boolean chains 2 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/git/store.rs"},"region":{"startLine":576}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba726cb18ccfa9c060708b5d080e67cf74e6fbb9a2047d1467cd277d0b061b4f"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::api::git::cas_publish::cas_publish_inner (cognitive 36): buzz_relay::api::git::cas_publish::cas_publish_inner has cognitive complexity 36 (threshold 15). Drivers by points: if/else 15 (26 pts), match/switch 6 (9 pts), boolean chains 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/git/cas_publish.rs"},"region":{"startLine":1021}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a92874f902e116a06b36a21622779f8502f60091ab8a269eaf7cae9af94760c"}},{"ruleId":"D2","level":"warning","message":{"text":"git_sign_nostr::parse_args (cognitive 36): git_sign_nostr::parse_args has cognitive complexity 36 (threshold 15). Drivers by points: if/else 19 (35 pts), loops 1 (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/git-sign-nostr/src/lib.rs"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0d11a2ed1378757e9d9920ac44cacd943f94beac4b95c8a7c645fae4a389820"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::media_gif::strip_gif_metadata (cognitive 36): buzz_desktop::commands::media_gif::strip_gif_metadata has cognitive complexity 36 (threshold 15). Drivers by points: if/else 8 (25 pts), boolean chains 5, match/switch 2 (5 pts), loops 1 (nesting depth added 20). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/media_gif.rs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5327a29e0777b6e14bc2559e265dca56c18b9cd30f410a0bb9e6c42c069fc27"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::terminal_runtime::terminal_attach (cognitive 36): buzz_desktop::terminal_runtime::terminal_attach has cognitive complexity 36 (threshold 15). Drivers by points: if/else 14 (29 pts), match/switch 2 (4 pts), loops 3 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/terminal_runtime.rs"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb52c84d71c37c07a140bcd5a017d3d2340c9b59c32c76168b9550b52c6cd947"}},{"ruleId":"D2","level":"warning","message":{"text":"BuzzDevPushEnrollmentDriver.enroll (cognitive 36): BuzzDevPushEnrollmentDriver.enroll has cognitive complexity 36 (threshold 15). Drivers by points: boolean chains 19, if/else 12 (15 pts), ternaries 1 (2 pts) (nesting depth added 4). 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":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzDevPushEnrollmentDriver.swift"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6405fb5b045cbcf8f7699d197e8c75183300256680f9f4f5e595000fa020771"}},{"ruleId":"D2","level":"warning","message":{"text":"managedAgentControlActions.deleteManagedAgentWithRules (cognitive 36): managedAgentControlActions.deleteManagedAgentWithRules has cognitive complexity 36 (threshold 15). Drivers by points: if/else 11 (33 pts), boolean chains 2, ternaries 1 (nesting depth added 22). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/lib/managedAgentControlActions.ts"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"66e7061b6b95b6955ed0223f57cb71b281f01befe8c17605ecbf9ece7945be23"}},{"ruleId":"D2","level":"warning","message":{"text":"UserMessageBubble.UserMessageBubble (cognitive 36): UserMessageBubble.UserMessageBubble has cognitive complexity 36 (threshold 15). Drivers by points: ternaries 13 (20 pts), boolean chains 11, if/else 3 (5 pts) (nesting depth added 9). Of this number, 28 points are the body\u0027s own statements and 8 belong to 3 function literals 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":"desktop/src/features/agents/ui/activityRenderClasses/UserMessageBubble.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"aad7a0575d8cde441c283d138230d2585baf58110a6e8eac930f1f1819c7f80f"}},{"ruleId":"D2","level":"warning","message":{"text":"TeamDialog.TeamDialog (cognitive 36): TeamDialog.TeamDialog has cognitive complexity 36 (threshold 15). Drivers by points: boolean chains 12, if/else 10 (12 pts), ternaries 9 (12 pts) (nesting depth added 5). Of this number, 21 points are the body\u0027s own statements and 15 belong to 8 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/TeamDialog.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"306d726b85d51402ac352eb82de4485b7031d26af952b55379359c21e7ef58c1"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelScreenHeader.ChannelScreenHeader (cognitive 36): ChannelScreenHeader.ChannelScreenHeader has cognitive complexity 36 (threshold 15). Drivers by points: ternaries 15 (30 pts), boolean chains 5, if/else 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":"desktop/src/features/channels/ui/ChannelScreenHeader.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ade58c4a4b8c6478d4d655a72da8e1f384fe6a64969d75ec8c06eb3ef25061d"}},{"ruleId":"D2","level":"warning","message":{"text":"MembersSidebarMemberCard.MemberActionsMenu (cognitive 36): MembersSidebarMemberCard.MemberActionsMenu has cognitive complexity 36 (threshold 15). Drivers by points: ternaries 17 (28 pts), boolean chains 6, if/else 1 (2 pts) (nesting depth added 12). Of this number, 31 points are the body\u0027s own statements and 5 belong to 2 function literals 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":"desktop/src/features/channels/ui/MembersSidebarMemberCard.tsx"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"3962bb4245824a5efeb76958d629057e46ab4bea3786e80b94431e0e52973298"}},{"ruleId":"D2","level":"warning","message":{"text":"MicControls.MicControls (cognitive 36): MicControls.MicControls has cognitive complexity 36 (threshold 15). Drivers by points: ternaries 19 (22 pts), boolean chains 13, if/else 1 (nesting depth added 3). Of this number, 33 points are the body\u0027s own statements and 3 belong to 3 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/components/MicControls.tsx"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"768cb32a0a50823aadb9e4b17dd0bf710da5662bdbedbb3878eb6cd6e94421af"}},{"ruleId":"D2","level":"warning","message":{"text":"SetupStep.RuntimeProvidersSection (cognitive 36): SetupStep.RuntimeProvidersSection has cognitive complexity 36 (threshold 15). Drivers by points: ternaries 18 (31 pts), boolean chains 3, if/else 2 (nesting depth added 13). Of this number, 29 points are the body\u0027s own statements and 7 belong to 3 function literals 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":"desktop/src/features/onboarding/ui/SetupStep.tsx"},"region":{"startLine":662}}}],"partialFingerprints":{"codehealthFindingId/v1":"700a214390c14259f3204ad011806d2c7d37ac13c3de24b1deb1dab19462b793"}},{"ruleId":"D2","level":"warning","message":{"text":"MergePullRequestButton.MergePullRequestButton (cognitive 36): MergePullRequestButton.MergePullRequestButton has cognitive complexity 36 (threshold 15). Drivers by points: ternaries 13 (19 pts), if/else 8 (9 pts), boolean chains 5, error handling 3 (nesting depth added 7). Of this number, 16 points are the body\u0027s own statements and 20 belong to 4 function literals 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":"desktop/src/features/projects/ui/MergePullRequestButton.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f55c16914375363235355af0740db8dcdef71c33b8d4119e4ae4d98eb38d6a2"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelContextMenu.ChannelContextMenuItems (cognitive 36): ChannelContextMenu.ChannelContextMenuItems has cognitive complexity 36 (threshold 15). Drivers by points: ternaries 17 (21 pts), boolean chains 13, loops 1 (2 pts) (nesting depth added 5). Of this number, 32 points are the body\u0027s own statements and 4 belong to 2 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/ChannelContextMenu.tsx"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9add1d3fbf44b2a92d054305496c0d9ff560803eaf618a35b83012fe0579e41"}},{"ruleId":"D2","level":"warning","message":{"text":"SidebarProjectsSection.SidebarProjectsSectionContent (cognitive 36): SidebarProjectsSection.SidebarProjectsSectionContent has cognitive complexity 36 (threshold 15). Drivers by points: ternaries 11 (22 pts), boolean chains 7, if/else 6, error handling 1 (nesting depth added 11). Most of this is not in the body itself: 13 of the 36 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 226, 299, 211, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/SidebarProjectsSection.tsx"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6533cc9b78598e99024c2d3d81197d6f2dcb9fb50638cf6f702dd43e1f3e394"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::run_models (cognitive 35): buzz_acp::run_models has cognitive complexity 35 (threshold 15). Drivers by points: if/else 9 (21 pts), loops 3 (12 pts), match/switch 2 (nesting depth added 21). 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/buzz-acp/src/lib.rs"},"region":{"startLine":5732}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf0555149e2703c66841a374a9de566117483e79ece48112221138ed47df945a"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_media::validation::validate_jpeg_metadata_free (cognitive 35): buzz_media::validation::validate_jpeg_metadata_free has cognitive complexity 35 (threshold 15). Drivers by points: if/else 15 (26 pts), boolean chains 6, loops 2 (3 pts) (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-media/src/validation.rs"},"region":{"startLine":518}}}],"partialFingerprints":{"codehealthFindingId/v1":"b08ba57c34eea7d2695b72e0e685c4b60b58ff0a3273097826773b98d496f5a3"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_pubsub::subscriber::connect_and_subscribe (cognitive 35): buzz_pubsub::subscriber::connect_and_subscribe has cognitive complexity 35 (threshold 15). Drivers by points: if/else 5 (19 pts), match/switch 5 (14 pts), loops 2 (nesting depth added 23). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-pubsub/src/subscriber.rs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"534c1b2d9cb499e98b15f77256ba96baab8869aabee9b0ab1439e1d0ee33d9f3"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::agent_discovery::install_acp_runtime_blocking (cognitive 35): buzz_desktop::commands::agent_discovery::install_acp_runtime_blocking has cognitive complexity 35 (threshold 15). Drivers by points: if/else 12 (25 pts), loops 2 (5 pts), match/switch 1 (3 pts), boolean chains 2 (nesting depth added 18). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/agent_discovery.rs"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"284460d96a8accce2eccba4f5f28ce1a088ad248cc8af9bc33268abe2ea3d0f0"}},{"ruleId":"D2","level":"warning","message":{"text":"_InboxRow.build (cognitive 35): _InboxRow.build has cognitive complexity 35 (threshold 15). Drivers by points: ternaries 11 (14 pts), if/else 8 (10 pts), boolean chains 8, loops 3 (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":"mobile/lib/features/activity/activity_page/inbox_row.dart"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ef00a3c42c5a935d905260ce6ca6d5750e88187cfcc641fcce243db1ecfa5a6"}},{"ruleId":"D2","level":"warning","message":{"text":"_HuddleCallAvatar.build (cognitive 35): _HuddleCallAvatar.build has cognitive complexity 35 (threshold 15). Drivers by points: ternaries 18, boolean chains 9, if/else 8. 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":"mobile/lib/features/channels/channel_detail_page/huddle_call_avatar.dart"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"525ffe8a6aa51b2932ac120b2cea54457fdec3a03077c310b9148daf774fa223"}},{"ruleId":"D2","level":"warning","message":{"text":"_IOSInlinePhotoPicker.build (cognitive 35): _IOSInlinePhotoPicker.build has cognitive complexity 35 (threshold 15). Drivers by points: if/else 12 (18 pts), boolean chains 7, ternaries 6, loops 1 (2 pts), error handling 1, match/switch 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/compose_bar/ios_photo_picker.dart"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e0d0fbe22d47ec6d3cfbcc45324224b48a5c10a578ae158cc891103f5550b72"}},{"ruleId":"D2","level":"warning","message":{"text":"SetStatusDialog.SetStatusDialog (cognitive 35): SetStatusDialog.SetStatusDialog has cognitive complexity 35 (threshold 15). Drivers by points: boolean chains 15, if/else 9 (10 pts), ternaries 8 (9 pts), match/switch 1 (nesting depth added 2). Of this number, 23 points are the body\u0027s own statements and 12 belong to 5 function literals 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":"desktop/src/features/user-status/ui/SetStatusDialog.tsx"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"0702798c3d92cbc04d779c997d352f74d3f2db1291f607d68605d4f750d1bc90"}},{"ruleId":"D2","level":"warning","message":{"text":"PkceOAuthTokenSource::acquire_locked (cognitive 34): PkceOAuthTokenSource::acquire_locked has cognitive complexity 34 (threshold 15). Drivers by points: if/else 15 (27 pts), match/switch 4 (6 pts), boolean chains 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/auth.rs"},"region":{"startLine":1090}}}],"partialFingerprints":{"codehealthFindingId/v1":"de76686ccc5f7ddcc37777c615512acf3987c8f5a51f2f4acdadbe7a74920c6a"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_core::filter::filter_match_one (cognitive 34): buzz_core::filter::filter_match_one has cognitive complexity 34 (threshold 15). Drivers by points: if/else 17 (32 pts), boolean chains 1, loops 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-core/src/filter.rs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2f2cb00ca01454b9491ff77950f6a76b773582cde58d79a40e4884ad16c047b"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_dev_mcp::rg::scan_file (cognitive 34): buzz_dev_mcp::rg::scan_file has cognitive complexity 34 (threshold 15). Drivers by points: if/else 11 (27 pts), loops 2 (4 pts), match/switch 2 (3 pts) (nesting depth added 19). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-dev-mcp/src/rg.rs"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d8ef760452b040b0f286f3b8799fb058d0cab1ed75e6d3ea290c7c06b7d5685"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::workflow_sink::resolve_mention_pubkeys (cognitive 34): buzz_relay::workflow_sink::resolve_mention_pubkeys has cognitive complexity 34 (threshold 15). Drivers by points: if/else 8 (19 pts), loops 7 (12 pts), boolean chains 3 (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/workflow_sink.rs"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"d09d8f683056ffe3216b2d7bc9036955d4546d416facb366cc01da20b05bb882"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_voice::imported::decode_wav (cognitive 34): buzz_voice::imported::decode_wav has cognitive complexity 34 (threshold 15). Drivers by points: if/else 16 (23 pts), boolean chains 4, loops 3 (4 pts), match/switch 1 (3 pts) (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-voice/src/imported.rs"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6f0bf5bac44a3d93d9df92a6a06ad102c5474166b0d2d0012545e66172ce8b3"}},{"ruleId":"D2","level":"warning","message":{"text":"ActivityNotifier._resurfaceHiddenDm (cognitive 34): ActivityNotifier._resurfaceHiddenDm has cognitive complexity 34 (threshold 15). Drivers by points: if/else 9 (25 pts), boolean chains 4, error handling 1 (3 pts), loops 1 (2 pts) (nesting depth added 19). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/activity/activity_provider.dart"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"4913f5879c3ac2383307a034be555f83f76ef39e0370c334569c41d318b281f0"}},{"ruleId":"D2","level":"warning","message":{"text":"_InlineCameraPreview.build (cognitive 34): _InlineCameraPreview.build has cognitive complexity 34 (threshold 15). Drivers by points: if/else 16 (23 pts), boolean chains 5, ternaries 4, error handling 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":"mobile/lib/features/channels/compose_bar/camera_preview.dart"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d3ec72062c727b63e415e1f06a4f351022fbf6986fc93fc2bbf9c49f70496a5"}},{"ruleId":"D2","level":"warning","message":{"text":"ManageChannelSheet.build (cognitive 34): ManageChannelSheet.build has cognitive complexity 34 (threshold 15). Drivers by points: ternaries 10 (15 pts), if/else 8 (10 pts), boolean chains 7, error handling 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":"mobile/lib/features/channels/manage_channel_sheet.dart"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"f86646f6e263d99d41ecb922c547896e6d35f822e2abe1554ce9abf4e68c0fbf"}},{"ruleId":"D2","level":"warning","message":{"text":"ProfileAvatarCropPage.build (cognitive 34): ProfileAvatarCropPage.build has cognitive complexity 34 (threshold 15). Drivers by points: if/else 15 (20 pts), ternaries 8, boolean chains 6 (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":"mobile/lib/features/profile/profile_avatar_crop_page.dart"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5bcfe546f2fcf4d6666c772ff8eec8adab60a276a7b8997ada45a5039ef88fd"}},{"ruleId":"D2","level":"warning","message":{"text":"agentConfigControls.AgentModelField (cognitive 34): agentConfigControls.AgentModelField has cognitive complexity 34 (threshold 15). Drivers by points: boolean chains 18, ternaries 12 (14 pts), if/else 2 (nesting depth added 2). Of this number, 29 points are the body\u0027s own statements and 5 belong to 2 function literals inside it that branch. 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":"desktop/src/features/agents/ui/agentConfigControls.tsx"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"87ce4f41d9d69066b0dff6f8ac5efea44ee3583ab115bbdeb1fc020603b425a5"}},{"ruleId":"D2","level":"warning","message":{"text":"InboxMessageRow.InboxMessageRow (cognitive 34): InboxMessageRow.InboxMessageRow has cognitive complexity 34 (threshold 15). Drivers by points: ternaries 21 (30 pts), boolean chains 4 (nesting depth added 9). Of this number, 31 points are the body\u0027s own statements and 3 belong to 3 function literals 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":"desktop/src/features/home/ui/InboxMessageRow.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"f40ef85183bd65b83d30e68f7bc734e8cacab87cd9a4fd4c15907f3305d1b517"}},{"ruleId":"D2","level":"warning","message":{"text":"AddAgentDialog.AddAgentDialog (cognitive 34): AddAgentDialog.AddAgentDialog has cognitive complexity 34 (threshold 15). Drivers by points: ternaries 8 (14 pts), if/else 11 (12 pts), error handling 3 (6 pts), boolean chains 2 (nesting depth added 10). Of this number, 26 points are the body\u0027s own statements and 8 belong to 6 function literals 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":"desktop/src/features/huddle/components/AddAgentDialog.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"90e1059b14774715e6d879add9829734ae3655118a6327842e225b23dec0e493"}},{"ruleId":"D2","level":"warning","message":{"text":"MessageActionBar.MoreActionsMenu (cognitive 34): MessageActionBar.MoreActionsMenu has cognitive complexity 34 (threshold 15). Drivers by points: ternaries 18 (22 pts), if/else 5 (7 pts), boolean chains 5 (nesting depth added 6). Of this number, 27 points are the body\u0027s own statements and 7 belong to 3 function literals 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":"desktop/src/features/messages/ui/MessageActionBar.tsx"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"43b21f521de84a6e3d15c68bb2ce74265baceb99ae96b25456054e8c632ec947"}},{"ruleId":"D2","level":"warning","message":{"text":"hooks.useAppOnboardingState (cognitive 34): hooks.useAppOnboardingState has cognitive complexity 34 (threshold 15). Drivers by points: if/else 11 (14 pts), boolean chains 10, ternaries 4 (10 pts) (nesting depth added 9). Of this number, 17 points are the body\u0027s own statements and 17 belong to 7 function literals 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":"desktop/src/features/onboarding/hooks.ts"},"region":{"startLine":466}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b41c72428b7e98c11df4eaf86fb3a82acad1c7cb31b1b18a0ce98dae963e883"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectChannelHome.ProjectChannelHome (cognitive 34): ProjectChannelHome.ProjectChannelHome has cognitive complexity 34 (threshold 15). Drivers by points: ternaries 13 (22 pts), boolean chains 7, if/else 5 (nesting depth added 9). Of this number, 27 points are the body\u0027s own statements and 7 belong to 6 function literals 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":"desktop/src/features/projects/ui/ProjectChannelHome.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a122368f13614f06853848f0d1320d60af0ac6db014593bff8ce09788d34f3f"}},{"ruleId":"D2","level":"warning","message":{"text":"HarnessRow.HarnessRow (cognitive 34): HarnessRow.HarnessRow has cognitive complexity 34 (threshold 15). Drivers by points: ternaries 17 (23 pts), boolean chains 6, if/else 5 (nesting depth added 6). Of this number, 26 points are the body\u0027s own statements and 8 belong to 5 function literals 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":"desktop/src/features/settings/ui/HarnessRow.tsx"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff24db52ee15819d77165454d9c6baa06f821b2ab21afe7709d47001dfde6885"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::relay::merge_discovered_channels (cognitive 33): buzz_acp::relay::merge_discovered_channels has cognitive complexity 33 (threshold 15). Drivers by points: if/else 6 (19 pts), match/switch 2 (8 pts), loops 3 (6 pts) (nesting depth added 22). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/relay.rs"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"09cca8a21b35c792af522ad705c01d4d04feec68565a14887cdbb867ef272848"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_dev_mcp::shell::run (cognitive 33): buzz_dev_mcp::shell::run has cognitive complexity 33 (threshold 15). Drivers by points: if/else 7 (15 pts), match/switch 10 (15 pts), loops 1 (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/buzz-dev-mcp/src/shell.rs"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a999a480936a3b30e3a28033ffc62c042eec98a753001c41a1042d033a61756"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_dev_mcp::rg::walk (cognitive 33): buzz_dev_mcp::rg::walk has cognitive complexity 33 (threshold 15). Drivers by points: if/else 8 (21 pts), match/switch 3 (8 pts), loops 2 (3 pts), boolean chains 1 (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/buzz-dev-mcp/src/rg.rs"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"285c89e88793370b4eef9e3385ee87eddcc855e7bc59b2b08305aaeaa809f450"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::ingest::effective_message_author (cognitive 33): buzz_relay::handlers::ingest::effective_message_author has cognitive complexity 33 (threshold 15). Drivers by points: if/else 10 (31 pts), loops 1 (2 pts) (nesting depth added 22). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":1177}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ee76307a64c514e48db1e3cd4c0954a2705c4baa191944032ec338332489fe9"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::admin::admin_probe_inner (cognitive 33): buzz_desktop::commands::admin::admin_probe_inner has cognitive complexity 33 (threshold 15). Drivers by points: match/switch 6 (18 pts), if/else 8 (15 pts) (nesting depth added 19). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/admin/mod.rs"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc8efd4ece9d650ca5e35f78e64c933f9caa3d196439bcf23a2ceabe5a46996d"}},{"ruleId":"D2","level":"warning","message":{"text":"_ThreadMessage.build (cognitive 33): _ThreadMessage.build has cognitive complexity 33 (threshold 15). Drivers by points: if/else 12 (16 pts), ternaries 8 (10 pts), boolean chains 5, loops 2 (nesting depth added 6). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/thread_detail_page/thread_message.dart"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"5731259260aad25bf241ef8eaa3811d8d11895f49e897ef093bdb7a4161f8a99"}},{"ruleId":"D2","level":"warning","message":{"text":"PairingNotifier._continueAfterSas (cognitive 33): PairingNotifier._continueAfterSas has cognitive complexity 33 (threshold 15). Drivers by points: boolean chains 16, if/else 11 (16 pts), ternaries 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":"mobile/lib/features/pairing/pairing_provider.dart"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ddc0939b3ba2e640902be86b65c19de4181fa1fd8bee8662f7415cf9748224c"}},{"ruleId":"D2","level":"warning","message":{"text":"useChannelUnreadState.useChannelUnreadState (cognitive 33): useChannelUnreadState.useChannelUnreadState has cognitive complexity 33 (threshold 15). Drivers by points: if/else 17 (19 pts), loops 5 (6 pts), boolean chains 5, ternaries 3 (nesting depth added 3). Most of this is not in the body itself: 7 of the 33 points are its own statements and the rest belongs to 14 function literals inside it that branch (lines 454, 238, 275, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/useChannelUnreadState.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b06cf0f1a51319745c70c06a5c27b8afd79d92236876155d07fb868e6b85d99"}},{"ruleId":"D2","level":"warning","message":{"text":"MembersSidebarMemberCard.MembersSidebarMemberCard (cognitive 33): MembersSidebarMemberCard.MembersSidebarMemberCard has cognitive complexity 33 (threshold 15). Drivers by points: ternaries 14 (24 pts), boolean chains 9 (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":"desktop/src/features/channels/ui/MembersSidebarMemberCard.tsx"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"358d2d4bbf803c66628e161d60bf1e6fc6ab24b12e95bb78310272c7657d76c6"}},{"ruleId":"D2","level":"warning","message":{"text":"useMembersSidebarActions.useMembersSidebarActions (cognitive 33): useMembersSidebarActions.useMembersSidebarActions has cognitive complexity 33 (threshold 15). Drivers by points: ternaries 7 (14 pts), if/else 11 (13 pts), error handling 2 (3 pts), boolean chains 2, loops 1 (nesting depth added 10). Of this number, 30 points are the body\u0027s own statements and 3 belong to 3 function literals 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":"desktop/src/features/channels/ui/useMembersSidebarActions.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0bf3984200cc66429cebb6c070c6692e45d14ad8c886cadbbc687629aaafa7c"}},{"ruleId":"D2","level":"warning","message":{"text":"hooks.useChannelSubscription (cognitive 33): hooks.useChannelSubscription has cognitive complexity 33 (threshold 15). Drivers by points: if/else 21 (26 pts), boolean chains 4, error handling 1 (2 pts), ternaries 1 (nesting depth added 6). Most of this is not in the body itself: 0 of the 33 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 327, 399, 407, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/hooks.ts"},"region":{"startLine":318}}}],"partialFingerprints":{"codehealthFindingId/v1":"7857e7686153932a592a928a976f8ef000ff42e715e877efdb67c0187ffdfc15"}},{"ruleId":"D2","level":"warning","message":{"text":"SetupStep.RuntimeStatus (cognitive 33): SetupStep.RuntimeStatus has cognitive complexity 33 (threshold 15). Drivers by points: if/else 11 (15 pts), ternaries 7 (14 pts), boolean chains 4 (nesting depth added 11). Of this number, 26 points are the body\u0027s own statements and 7 belong to 3 function literals 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":"desktop/src/features/onboarding/ui/SetupStep.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e48002e48e3c337341e748c3f7be26b11902c8bc63f892e5d9f38daaa7c8cf9"}},{"ruleId":"D2","level":"warning","message":{"text":"UserProfilePanelTabs.ProfileRuntimeTabContent (cognitive 33): UserProfilePanelTabs.ProfileRuntimeTabContent has cognitive complexity 33 (threshold 15). Drivers by points: ternaries 11 (21 pts), boolean chains 7, if/else 3 (5 pts) (nesting depth added 12). Of this number, 28 points are the body\u0027s own statements and 5 belong to 2 function literals 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":"desktop/src/features/profile/ui/UserProfilePanelTabs.tsx"},"region":{"startLine":713}}}],"partialFingerprints":{"codehealthFindingId/v1":"d08a46c06cb6b22e86c6568543c211ad2824cd5be2cb92d652a4e2bcbce0db12"}},{"ruleId":"D2","level":"warning","message":{"text":"projectActivity.summarizeProjectActivityEvents (cognitive 33): projectActivity.summarizeProjectActivityEvents has cognitive complexity 33 (threshold 15). Drivers by points: if/else 8 (20 pts), loops 6 (9 pts), boolean chains 4 (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":"desktop/src/features/projects/projectActivity.mjs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"8eaa63e860ba64ed8fdca47f53b0c09838c4bfe7767b33603ff6a62621795419"}},{"ruleId":"D2","level":"warning","message":{"text":"workflowFormTypes.actionFieldsForStep (cognitive 33): workflowFormTypes.actionFieldsForStep has cognitive complexity 33 (threshold 15). Drivers by points: if/else 17 (31 pts), boolean chains 1, match/switch 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/workflowFormTypes.ts"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cef96e88d0f7b3dd60f8c724af5daedd59a55d77167121ef8a9fdac5dbd6888"}},{"ruleId":"D2","level":"warning","message":{"text":"CodeBlock.SyntaxHighlightedCode (cognitive 33): CodeBlock.SyntaxHighlightedCode has cognitive complexity 33 (threshold 15). Drivers by points: if/else 12 (14 pts), ternaries 5 (7 pts), boolean chains 6, error handling 4 (6 pts) (nesting depth added 6). Most of this is not in the body itself: 1 of the 33 points is its own statement and the rest belongs to 4 function literals inside it that branch (lines 150, 190, 235, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/markdown/CodeBlock.tsx"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e45a9f31cbdfd7974fe9245a08f76d6620f0f5f43172750ae6850ac787929b4"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::relay::wait_for_reconnect (cognitive 32): buzz_acp::relay::wait_for_reconnect has cognitive complexity 32 (threshold 15). Drivers by points: match/switch 5 (16 pts), if/else 6 (11 pts), loops 3 (5 pts) (nesting depth added 18). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/relay.rs"},"region":{"startLine":3203}}}],"partialFingerprints":{"codehealthFindingId/v1":"eca69996cb4586e87e54a50c950ea5ff5345d1da493ae2315372b1f6faaa0c54"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_admin::reconcile_channels (cognitive 32): buzz_admin::reconcile_channels has cognitive complexity 32 (threshold 15). Drivers by points: if/else 11 (22 pts), loops 3 (6 pts), boolean chains 3, match/switch 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-admin/src/main.rs"},"region":{"startLine":623}}}],"partialFingerprints":{"codehealthFindingId/v1":"664709db17eda265ca322fe5a518bed982f90d2f1c120e5fb7a415378aa06403"}},{"ruleId":"D2","level":"warning","message":{"text":"RunCtx::execute_parallel (cognitive 32): RunCtx::execute_parallel has cognitive complexity 32 (threshold 15). Drivers by points: match/switch 6 (14 pts), if/else 7 (13 pts), loops 4 (5 pts) (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/agent.rs"},"region":{"startLine":909}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f72f9c66c683cd20cdf53bd1551cad23ad5cbf046d20c8cf5d4e5ac5b083462"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_agent::catalog::fetch_catalog_page (cognitive 32): buzz_agent::catalog::fetch_catalog_page has cognitive complexity 32 (threshold 15). Drivers by points: if/else 11 (25 pts), boolean chains 4, match/switch 1 (2 pts), loops 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/catalog.rs"},"region":{"startLine":514}}}],"partialFingerprints":{"codehealthFindingId/v1":"c09d851d125e2f66350288db83deae41a47896474350c0f4259e650da71a9757"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_media::validation::validate_video_file (cognitive 32): buzz_media::validation::validate_video_file has cognitive complexity 32 (threshold 15). Drivers by points: if/else 12 (28 pts), match/switch 1 (2 pts), boolean chains 1, loops 1 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-media/src/validation.rs"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"431c3781ed09cfccb58bd3442445a2bc026164770d1cf27947e5d44510fc128d"}},{"ruleId":"D2","level":"warning","message":{"text":"ClientMessage::parse (cognitive 32): ClientMessage::parse has cognitive complexity 32 (threshold 15). Drivers by points: if/else 16 (31 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/buzz-relay/src/protocol.rs"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"dee895d11e9af8bc7ae339ca2bde6aa1f7a60a8e01ec7bbabe74ac5209224380"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::side_effects::handle_edit_metadata (cognitive 32): buzz_relay::handlers::side_effects::handle_edit_metadata has cognitive complexity 32 (threshold 15). Drivers by points: if/else 6 (18 pts), match/switch 2 (7 pts), loops 2 (6 pts), boolean chains 1 (nesting depth added 21). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/side_effects.rs"},"region":{"startLine":1568}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ca69f9e0e4e628301603d0b9ef1f15a99ee1077f2babb069b4a0527e204a8e8"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::personas::inbound::reconcile_inbound_persona_event_blocking (cognitive 32): buzz_desktop::commands::personas::inbound::reconcile_inbound_persona_event_blocking has cognitive complexity 32 (threshold 15). Drivers by points: if/else 14 (26 pts), match/switch 3 (5 pts), boolean chains 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/personas/inbound.rs"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0b4e5c4573fe8f79b549580e277b49a2f661c4200ad3b8101b46f64e7db5db8"}},{"ruleId":"D2","level":"warning","message":{"text":"exhaustive.check_compaction_safety (cognitive 32): exhaustive.check_compaction_safety has cognitive complexity 32 (threshold 15). Drivers by points: if/else 6 (19 pts), loops 3 (7 pts), boolean chains 3, ternaries 1 (3 pts) (nesting depth added 19). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/formal/nip-rs-unread/exhaustive.py"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1b2ab7d5a8986e6c869be382195a4a9c9806b8d8dd2960f5e5bec577656c238"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelMessagesNotifier._handleLiveEvent (cognitive 32): ChannelMessagesNotifier._handleLiveEvent has cognitive complexity 32 (threshold 15). Drivers by points: if/else 12 (22 pts), boolean chains 8, ternaries 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":"mobile/lib/features/channels/channel_messages_provider.dart"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff5b8ab821465181beb1940e18777ee70919a9d3be86c5cab25966666f6d6ab6"}},{"ruleId":"D2","level":"warning","message":{"text":"agentSessionTranscriptGrouping.buildBlocksForRun (cognitive 32): agentSessionTranscriptGrouping.buildBlocksForRun has cognitive complexity 32 (threshold 15). Drivers by points: if/else 13 (24 pts), loops 4 (7 pts), boolean chains 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/agentSessionTranscriptGrouping.ts"},"region":{"startLine":599}}}],"partialFingerprints":{"codehealthFindingId/v1":"00406ef3cd71629d7814d8b71d250d6aae6ee8d677700ee27528c4e29f89ac1a"}},{"ruleId":"D2","level":"warning","message":{"text":"observedUnreadStorage.pruneEventsByChannel (cognitive 32): observedUnreadStorage.pruneEventsByChannel has cognitive complexity 32 (threshold 15). Drivers by points: if/else 7 (18 pts), loops 7 (14 pts) (nesting depth added 18). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/observedUnreadStorage.ts"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"c880f633f312aaeb2075f91cd44b254111c36a8e7990091a0ec6a7a2ba1b2986"}},{"ruleId":"D2","level":"warning","message":{"text":"InviteLinkSection.InviteLinkSection (cognitive 32): InviteLinkSection.InviteLinkSection has cognitive complexity 32 (threshold 15). Drivers by points: ternaries 11 (14 pts), if/else 8 (10 pts), boolean chains 6, error handling 2 (nesting depth added 5). Of this number, 21 points are the body\u0027s own statements and 11 belong to 4 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/community-members/ui/InviteLinkSection.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfe0531daea1683ccef10075781f5fb5dc27b8106155fae2b75b9a57e75766c9"}},{"ruleId":"D2","level":"warning","message":{"text":"useHomeInboxReadState.useHomeInboxReadState (cognitive 32): useHomeInboxReadState.useHomeInboxReadState has cognitive complexity 32 (threshold 15). Drivers by points: if/else 11 (20 pts), boolean chains 6, loops 3 (4 pts), ternaries 2 (nesting depth added 10). Most of this is not in the body itself: 0 of the 32 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 211, 171, 276). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/useHomeInboxReadState.ts"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4f582d23cf00cd7a7bcdf388c362a97784bb93b1bd3ef4f9cbc7302449cc3ce"}},{"ruleId":"D2","level":"warning","message":{"text":"ParticipantList.HuddleParticipantsControl (cognitive 32): ParticipantList.HuddleParticipantsControl has cognitive complexity 32 (threshold 15). Drivers by points: ternaries 13 (22 pts), if/else 6, boolean chains 4 (nesting depth added 9). Most of this is not in the body itself: 8 of the 32 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 310, 257, 154, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/components/ParticipantList.tsx"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"035d920e1bb8016af2ede3dd2a5c47e5ef3f10661b3d334795e384923747a333"}},{"ruleId":"D2","level":"warning","message":{"text":"ComposerAttachments.ComposerAttachments (cognitive 32): ComposerAttachments.ComposerAttachments has cognitive complexity 32 (threshold 15). Drivers by points: ternaries 9 (14 pts), boolean chains 13, if/else 5 (nesting depth added 5). Most of this is not in the body itself: 8 of the 32 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 750, 635, 875). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/ComposerAttachments.tsx"},"region":{"startLine":591}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8384a0f0306d263f0957b013465eef47d5be817e4df1be9e40f39c5fc73a586"}},{"ruleId":"D2","level":"warning","message":{"text":"useNewMessageRecipients.useNewMessageRecipients (cognitive 32): useNewMessageRecipients.useNewMessageRecipients has cognitive complexity 32 (threshold 15). Drivers by points: boolean chains 16, if/else 7 (8 pts), ternaries 4 (5 pts), loops 3 (nesting depth added 2). Most of this is not in the body itself: 7 of the 32 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 122, 101, 235, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useNewMessageRecipients.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e2cd2830bb9aed9d67d4afd8306cb6f6763bfa597e32378871a4c7b8d59a386"}},{"ruleId":"D2","level":"warning","message":{"text":"useProfileInteractionActions.useProfileInteractionActions (cognitive 32): useProfileInteractionActions.useProfileInteractionActions has cognitive complexity 32 (threshold 15). Drivers by points: if/else 11 (12 pts), boolean chains 10, ternaries 3 (8 pts), error handling 2 (nesting depth added 6). Most of this is not in the body itself: 6 of the 32 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 117, 195, 164, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/useProfileInteractionActions.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"17376e20a926929860eb4b1fa0d50a9e150fea1299bf83bc3134830b2cd370d3"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectsAgentPromptPage.ProjectsAgentPromptPage (cognitive 32): ProjectsAgentPromptPage.ProjectsAgentPromptPage has cognitive complexity 32 (threshold 15). Drivers by points: ternaries 14 (20 pts), if/else 6, boolean chains 5, error handling 1 (nesting depth added 6). Of this number, 16 points are the body\u0027s own statements and 16 belong to 5 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectsAgentPromptPage.tsx"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9db51ca791484d265582f66c23ae7b4b0d9ff987165c20bb6ac7a5f31610888"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_agent::llm::apply_anthropic_cache_control (cognitive 31): buzz_agent::llm::apply_anthropic_cache_control has cognitive complexity 31 (threshold 15). Drivers by points: if/else 11 (29 pts), loops 1 (2 pts) (nesting depth added 19). 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/buzz-agent/src/llm.rs"},"region":{"startLine":2543}}}],"partialFingerprints":{"codehealthFindingId/v1":"acf795f2a62aa78789e9b234d9f6dc24414dbd22a9620197dd57a343c1c82944"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_core::network::is_not_global_unicast (cognitive 31): buzz_core::network::is_not_global_unicast has cognitive complexity 31 (threshold 15). Drivers by points: boolean chains 19, if/else 6 (11 pts), match/switch 1 (nesting depth added 5). 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/buzz-core/src/network.rs"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"6be2178e761a1952df8694d75c35f17c4f081553835b56c9d56bd31cadcf13fd"}},{"ruleId":"D2","level":"warning","message":{"text":"SubscriptionRegistry::fan_out_scoped (cognitive 31): SubscriptionRegistry::fan_out_scoped has cognitive complexity 31 (threshold 15). Drivers by points: loops 6 (18 pts), if/else 7 (13 pts) (nesting depth added 18). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/subscription.rs"},"region":{"startLine":379}}}],"partialFingerprints":{"codehealthFindingId/v1":"6979d1d0a6c53782debc684edf3d2a280f3fd9ae366b2a6e8cc4ad324d2615b4"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::api::bridge::handle_bridge_search (cognitive 31): buzz_relay::api::bridge::handle_bridge_search has cognitive complexity 31 (threshold 15). Drivers by points: if/else 13 (22 pts), match/switch 3 (6 pts), loops 2 (3 pts) (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/bridge.rs"},"region":{"startLine":2214}}}],"partialFingerprints":{"codehealthFindingId/v1":"024de825d3fad304b48795e986f006a4d222e3680a5c9a1dbf0f251d59ec20d9"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::personas::update::update_persona_with (cognitive 31): buzz_desktop::commands::personas::update::update_persona_with has cognitive complexity 31 (threshold 15). Drivers by points: if/else 11 (22 pts), loops 3 (7 pts), boolean chains 2 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/personas/update.rs"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"de88221ec90767fdcec4faf1ce6d892f1d0634bde239b7ae68090fd9cecf6fdf"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::migration::refresh_builtin_agent_avatars_in_file (cognitive 31): buzz_desktop::migration::refresh_builtin_agent_avatars_in_file has cognitive complexity 31 (threshold 15). Drivers by points: if/else 14 (27 pts), boolean chains 2, loops 2 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/migration.rs"},"region":{"startLine":594}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b03619a62eda39e144cb406e0ff7dc6103310785a8f1a91c50ad34c51ec000b"}},{"ruleId":"D2","level":"warning","message":{"text":"_MessageBubble.build (cognitive 31): _MessageBubble.build has cognitive complexity 31 (threshold 15). Drivers by points: if/else 10 (14 pts), boolean chains 7, ternaries 6, loops 4 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_detail_page/message_bubble.dart"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ad4623511ae2874d8da0174f122f24915e945edf4b0e2b0840974d240268935"}},{"ruleId":"D2","level":"warning","message":{"text":"_SystemMessageRow.build (cognitive 31): _SystemMessageRow.build has cognitive complexity 31 (threshold 15). Drivers by points: ternaries 11 (14 pts), boolean chains 10, if/else 5, 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_detail_page/system_rows.dart"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6b7e3ea2b95a58d90e48a17032474ebae9be96d9c975e1c89301c31dc6234f2"}},{"ruleId":"D2","level":"warning","message":{"text":"MessageContent._buildLink (cognitive 31): MessageContent._buildLink has cognitive complexity 31 (threshold 15). Drivers by points: if/else 10 (12 pts), boolean chains 8, match/switch 3 (5 pts), ternaries 4 (5 pts), error handling 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":"mobile/lib/features/channels/message_content.dart"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"372f5578eb7dae065b209f799fd9f019fcdc50b1557659e48c9589cb23f42286"}},{"ruleId":"D2","level":"warning","message":{"text":"VoiceNoteAttachment.build (cognitive 31): VoiceNoteAttachment.build has cognitive complexity 31 (threshold 15). Drivers by points: ternaries 18, if/else 6 (7 pts), boolean chains 6 (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":"mobile/lib/features/channels/voice_note_attachment.dart"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"d098fa5ee35903aa9f60cb6b141f036d64d8b3fd454860cfc458e96d61dbba10"}},{"ruleId":"D2","level":"warning","message":{"text":"CommunityThemeSyncManager.flush (cognitive 31): CommunityThemeSyncManager.flush has cognitive complexity 31 (threshold 15). Drivers by points: if/else 12 (21 pts), boolean chains 9, error handling 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":"mobile/lib/shared/theme/community_theme_sync.dart"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"06a0d2ca3464c90d422fca749e427f43881bede5ff1bc7b5fbd96828b4ffa2c0"}},{"ruleId":"D2","level":"warning","message":{"text":"LifecycleActivity.LifecycleActivity (cognitive 31): LifecycleActivity.LifecycleActivity has cognitive complexity 31 (threshold 15). Drivers by points: ternaries 9 (24 pts), if/else 4, boolean chains 3 (nesting depth added 15). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/activityRenderClasses/LifecycleActivity.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"e14dadfe9962f2af1dd8d06f345dc5a19ec729a12d9847513a639d50f1062823"}},{"ruleId":"D2","level":"warning","message":{"text":"CanvasHistoryPanel.CanvasHistoryPanel (cognitive 31): CanvasHistoryPanel.CanvasHistoryPanel has cognitive complexity 31 (threshold 15). Drivers by points: ternaries 14 (21 pts), if/else 6, boolean chains 4 (nesting depth added 7). Most of this is not in the body itself: 15 of the 31 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 198, 89, 212, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/CanvasHistoryPanel.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fc6c3bed9c5fc059a3f13848b03459e04fb3211b77dd4f3813ea1104b0cdb5c"}},{"ruleId":"D2","level":"warning","message":{"text":"buildMentionCandidates.buildMentionCandidates (cognitive 31): buildMentionCandidates.buildMentionCandidates has cognitive complexity 31 (threshold 15). Drivers by points: boolean chains 15, ternaries 4 (7 pts), loops 4 (5 pts), if/else 4 (nesting depth added 4). Of this number, 18 points are the body\u0027s own statements and 13 belong to one function literal inside it that branches. 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":"desktop/src/features/messages/lib/buildMentionCandidates.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5e96de682c439a3a54cf2d6e185aa0b1404c8decd2a77e060dcb6219acc9927"}},{"ruleId":"D2","level":"warning","message":{"text":"machineOnboarding.useMachineOnboardingState (cognitive 31): machineOnboarding.useMachineOnboardingState has cognitive complexity 31 (threshold 15). Drivers by points: boolean chains 15, if/else 14, ternaries 2. Of this number, 20 points are the body\u0027s own statements and 11 belong to 7 function literals inside it that branch. 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":"desktop/src/features/onboarding/machineOnboarding.ts"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"de990b00c5af2b531ae526f8dcdb19884cd38ccf5d8867ff1dae3ab0b04186a2"}},{"ruleId":"D2","level":"warning","message":{"text":"UserProfilePanelFields.buildOwnerFields (cognitive 31): UserProfilePanelFields.buildOwnerFields has cognitive complexity 31 (threshold 15). Drivers by points: ternaries 8 (16 pts), if/else 13, 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":"desktop/src/features/profile/ui/UserProfilePanelFields.tsx"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"60f4e8b5cac2b564f7e16b3bb78818a85ac5a98ffff6d3116bea94395d2829e6"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectAgentChatPanel.ProjectAgentChatPanel (cognitive 31): ProjectAgentChatPanel.ProjectAgentChatPanel has cognitive complexity 31 (threshold 15). Drivers by points: ternaries 13 (16 pts), boolean chains 7, if/else 6 (7 pts), error handling 1 (nesting depth added 4). Of this number, 18 points are the body\u0027s own statements and 13 belong to 2 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectAgentChatPanel.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"594fbfc4d2bd8dadb9b2e592f07f1406cc60487f1fbf25deb40901e2bea4a1ad"}},{"ruleId":"D2","level":"warning","message":{"text":"PrivateKeyBackupRow.PrivateKeyBackupRow (cognitive 31): PrivateKeyBackupRow.PrivateKeyBackupRow has cognitive complexity 31 (threshold 15). Drivers by points: ternaries 9 (19 pts), if/else 6 (10 pts), error handling 1 (2 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":"desktop/src/features/settings/ui/PrivateKeyBackupRow.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"edf212f94aae6053807b8aed9934c4ab1d433cef758c320a6bd184b30b29199c"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowMessageTextConditionEditor.WorkflowMessageTextCondition (cognitive 31): WorkflowMessageTextConditionEditor.WorkflowMessageTextCondition has cognitive complexity 31 (threshold 15). Drivers by points: ternaries 10 (17 pts), boolean chains 7, if/else 7 (nesting depth added 7). Of this number, 18 points are the body\u0027s own statements and 13 belong to 6 function literals 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":"desktop/src/features/workflows/ui/WorkflowMessageTextConditionEditor.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"9053c8a4f5f0bad0272801f6bfcb4b16f82d52c7cc4e8888558f1486b12d268b"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::config::resolve_dynamic_channel_filter (cognitive 30): buzz_acp::config::resolve_dynamic_channel_filter has cognitive complexity 30 (threshold 15). Drivers by points: if/else 9 (23 pts), loops 2 (6 pts), match/switch 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/buzz-acp/src/config.rs"},"region":{"startLine":1439}}}],"partialFingerprints":{"codehealthFindingId/v1":"2380c76294c73af7d4127f9299c8fe46f3424caaeafeccfcd8d52d59bf93d9c3"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_agent::llm::anthropic_body (cognitive 30): buzz_agent::llm::anthropic_body has cognitive complexity 30 (threshold 15). Drivers by points: if/else 12 (23 pts), loops 2 (4 pts), match/switch 1 (2 pts), boolean chains 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/llm.rs"},"region":{"startLine":566}}}],"partialFingerprints":{"codehealthFindingId/v1":"81feabadc18f579763085985c203d9745a8d62eeb40b5329b8a4729ee795d107"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_db::store::channel_members::add_member (cognitive 30): buzz_db::store::channel_members::add_member has cognitive complexity 30 (threshold 15). Drivers by points: if/else 11 (19 pts), match/switch 3 (8 pts), boolean chains 3 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/channel_members.rs"},"region":{"startLine":394}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf5c3759c01dd39fe3cb5fde08afe4efb104ba94ca85efb73d94ef57beafb503"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::side_effects::effective_message_author (cognitive 30): buzz_relay::handlers::side_effects::effective_message_author has cognitive complexity 30 (threshold 15). Drivers by points: if/else 8 (28 pts), loops 1 (2 pts) (nesting depth added 21). 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/buzz-relay/src/handlers/side_effects.rs"},"region":{"startLine":2528}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b822e81c8f48fe7cc588225ee51777ceeaf82489cd909b744f8af306ad15fe6"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::api::bridge::handle_channel_window_filter (cognitive 30): buzz_relay::api::bridge::handle_channel_window_filter has cognitive complexity 30 (threshold 15). Drivers by points: if/else 8 (18 pts), loops 4 (8 pts), match/switch 3, boolean chains 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/bridge.rs"},"region":{"startLine":672}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4cb727abac5a95148d0b2702c197db414585685bc9cb6539a499e19d8ce53cb"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_sdk::builders::build_repo_announcement (cognitive 30): buzz_sdk::builders::build_repo_announcement has cognitive complexity 30 (threshold 15). Drivers by points: if/else 18 (26 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/buzz-sdk/src/builders.rs"},"region":{"startLine":1040}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcf0170b4c735e19df758ea7448dc9eab9808cf69ce203e3e1cb64d44bbdfb9a"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_sdk::mentions::extract_at_names (cognitive 30): buzz_sdk::mentions::extract_at_names has cognitive complexity 30 (threshold 15). Drivers by points: if/else 7 (21 pts), loops 2 (5 pts), boolean chains 4 (nesting depth added 17). 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/buzz-sdk/src/mentions.rs"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e33f0485cb388d8723ac3aaa75a6b0d67337161a4f39296284fafac37e6bc5c"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::team_catalog::is_safe_catalog_avatar_url (cognitive 30): buzz_desktop::managed_agents::team_catalog::is_safe_catalog_avatar_url has cognitive complexity 30 (threshold 15). Drivers by points: if/else 10 (23 pts), boolean chains 4, loops 1 (3 pts) (nesting depth added 15). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/team_catalog.rs"},"region":{"startLine":408}}}],"partialFingerprints":{"codehealthFindingId/v1":"010dd081d5976e15de17d8048e4f21c742bd449d13570314e2ff83e11f438d90"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::shutdown::shutdown_managed_agents (cognitive 30): buzz_desktop::shutdown::shutdown_managed_agents has cognitive complexity 30 (threshold 15). Drivers by points: if/else 8 (19 pts), loops 6 (11 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":"desktop/src-tauri/src/shutdown.rs"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"a69dc0a34bac9becd47e2fe7bcd1ef3b45103978898143f5b6defb5de6a1d5e9"}},{"ruleId":"D2","level":"warning","message":{"text":"AppDelegate.handleMediaUploadMethodCall (cognitive 30): AppDelegate.handleMediaUploadMethodCall has cognitive complexity 30 (threshold 15). Drivers by points: if/else 11 (23 pts), error handling 2 (4 pts), boolean chains 2, match/switch 1 (nesting depth added 14). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/AppDelegate.swift"},"region":{"startLine":649}}}],"partialFingerprints":{"codehealthFindingId/v1":"45b9859d55bb376c4fec591453630097a22b59c210787efab300886417e7ac4d"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaSanitizer.scrubJpeg (cognitive 30): MediaSanitizer.scrubJpeg has cognitive complexity 30 (threshold 15). Drivers by points: if/else 10 (19 pts), boolean chains 8, loops 2 (3 pts) (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/MediaSanitizer.swift"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"97da543cc7bf095d10130573e6399c56b57fc075cb9272c030d67c1697d02b74"}},{"ruleId":"D2","level":"warning","message":{"text":"NativeEmojiPickerDataLoader.parse (cognitive 30): NativeEmojiPickerDataLoader.parse has cognitive complexity 30 (threshold 15). Drivers by points: if/else 11 (18 pts), loops 3 (6 pts), boolean chains 5, ternaries 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":"mobile/ios/Runner/NativeEmojiPickerModel.swift"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"e81b411bedbc01700b69aee4dcaee0523abc018c845849185fc2ef7f1ba82957"}},{"ruleId":"D2","level":"warning","message":{"text":"ActivityNotifier._fetch (cognitive 30): ActivityNotifier._fetch has cognitive complexity 30 (threshold 15). Drivers by points: if/else 8 (14 pts), boolean chains 10, loops 6 (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":"mobile/lib/features/activity/activity_provider.dart"},"region":{"startLine":443}}}],"partialFingerprints":{"codehealthFindingId/v1":"34da041623ed84526e8bfd72a19da7d6f1442e8ac74a35917e52c94172978497"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaUploadService.uploadVideo (cognitive 30): MediaUploadService.uploadVideo has cognitive complexity 30 (threshold 15). Drivers by points: if/else 6 (14 pts), error handling 3 (8 pts), ternaries 2 (5 pts), loops 1 (2 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":"mobile/lib/shared/relay/media_upload.dart"},"region":{"startLine":365}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ba9130daaded306289514e171262ea0b16dbf5fc747131435326c92eb005e8e"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelRouteScreen.ChannelRouteScreen (cognitive 30): ChannelRouteScreen.ChannelRouteScreen has cognitive complexity 30 (threshold 15). Drivers by points: if/else 11 (13 pts), boolean chains 9, ternaries 4 (6 pts), loops 1 (2 pts) (nesting depth added 5). Most of this is not in the body itself: 11 of the 30 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 177, 230, 164, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/app/routes/ChannelRouteScreen.tsx"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"cca0f398b0bb3abf8ffc741af77d52fb53763fbc7c124a937b40ae9b28efd051"}},{"ruleId":"D2","level":"warning","message":{"text":"providerApiKeyFieldState.getProviderApiKeyFieldState (cognitive 30): providerApiKeyFieldState.getProviderApiKeyFieldState has cognitive complexity 30 (threshold 15). Drivers by points: ternaries 10 (26 pts), boolean chains 3, if/else 1 (nesting depth added 16). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/providerApiKeyFieldState.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"3baa032f9165b14bff224ac92b04507b38a1aa25e459b5f30a314985c9dbb667"}},{"ruleId":"D2","level":"warning","message":{"text":"CompactMessageSummary.CompactMessageSummary (cognitive 30): CompactMessageSummary.CompactMessageSummary has cognitive complexity 30 (threshold 15). Drivers by points: ternaries 13 (19 pts), boolean chains 9, if/else 2 (nesting depth added 6). Of this number, 25 points are the body\u0027s own statements and 5 belong to 2 function literals 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":"desktop/src/features/agents/ui/AgentSessionToolItem/CompactMessageSummary.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1e5b8f1a25c5321044f4146e72d1b072531bc0fba6369ebcb6874992010d20e"}},{"ruleId":"D2","level":"warning","message":{"text":"useForumMentionPreparation.useForumMentionPreparation (cognitive 30): useForumMentionPreparation.useForumMentionPreparation has cognitive complexity 30 (threshold 15). Drivers by points: if/else 13 (17 pts), boolean chains 6, ternaries 3 (5 pts), error handling 2 (nesting depth added 6). Most of this is not in the body itself: 0 of the 30 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 121, 60, 55, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/forum/ui/useForumMentionPreparation.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfa6aa441b0cc11d8b78a229a9b585a3753b70554213fae5e9ccb71c95363281"}},{"ruleId":"D2","level":"warning","message":{"text":"HuddleAttachment.HuddleAttachment (cognitive 30): HuddleAttachment.HuddleAttachment has cognitive complexity 30 (threshold 15). Drivers by points: boolean chains 11, if/else 8 (10 pts), ternaries 6 (8 pts), error handling 1 (nesting depth added 4). Of this number, 19 points are the body\u0027s own statements and 11 belong to 5 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/components/HuddleAttachment.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"f32c655ea0134394ca75a1a8184eb5237a55cb232eacf6823bed43553b2d7dce"}},{"ruleId":"D2","level":"warning","message":{"text":"useLinkEditor.useLinkEditor (cognitive 30): useLinkEditor.useLinkEditor has cognitive complexity 30 (threshold 15). Drivers by points: if/else 19 (20 pts), ternaries 7, boolean chains 2, error handling 1 (nesting depth added 1). Most of this is not in the body itself: 4 of the 30 points are its own statements and the rest belongs to 16 function literals inside it that branch (lines 80, 179, 243, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useLinkEditor.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"99fc18f4b632abc8b0ed135511e9a9a8503af50e26ad4a27c47c0519c58bc973"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultConfigStep.AgentDefaultsSection (cognitive 30): DefaultConfigStep.AgentDefaultsSection has cognitive complexity 30 (threshold 15). Drivers by points: ternaries 7 (17 pts), boolean chains 7, if/else 6 (nesting depth added 10). Of this number, 20 points are the body\u0027s own statements and 10 belong to 5 function literals 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":"desktop/src/features/onboarding/ui/DefaultConfigStep.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"0765c63a62e88c3d9ca5030f3bd867b7fa34a73e7dab38831f0b60ad015b2b42"}},{"ruleId":"D2","level":"warning","message":{"text":"selfProfileStorage.trimSelfProfileCaches (cognitive 30): selfProfileStorage.trimSelfProfileCaches has cognitive complexity 30 (threshold 15). Drivers by points: if/else 10 (18 pts), loops 5 (6 pts), boolean chains 2, error handling 1 (2 pts), ternaries 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":"desktop/src/features/profile/lib/selfProfileStorage.ts"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4d197b9157c2840f32c601231b79529b81bbd6d2f8c6c25f94e2bf0d2da36fa"}},{"ruleId":"D2","level":"warning","message":{"text":"projectDetailAgentContext.projectDetailAgentContextBlock (cognitive 30): projectDetailAgentContext.projectDetailAgentContextBlock has cognitive complexity 30 (threshold 15). Drivers by points: if/else 9 (14 pts), ternaries 4 (10 pts), loops 2 (4 pts), boolean chains 2 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/lib/projectDetailAgentContext.ts"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7a770764933970c680114e3f74ca16468ebbc596df55f1ba05f5daa62a6fb56"}},{"ruleId":"D2","level":"warning","message":{"text":"use-updater.useUpdater (cognitive 30): use-updater.useUpdater has cognitive complexity 30 (threshold 15). Drivers by points: if/else 17 (23 pts), boolean chains 4, error handling 3 (nesting depth added 6). Most of this is not in the body itself: 0 of the 30 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 125, 68, 79, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/hooks/use-updater.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"95ddbccd1e62f52b0e7d11b66510f0c023c7aec573458af377bb20a21517e63e"}},{"ruleId":"D2","level":"warning","message":{"text":"inviteHelpers.parseInviteInput (cognitive 30): inviteHelpers.parseInviteInput has cognitive complexity 30 (threshold 15). Drivers by points: if/else 11 (18 pts), boolean chains 7, error handling 2 (3 pts), ternaries 1 (2 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/api/inviteHelpers.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7516ca1438e2d686596aaaa7f0dd2deeac59cc311614b58744cede36ef01029"}},{"ruleId":"D2","level":"warning","message":{"text":"HarnessRelay::discover_channels (cognitive 29): HarnessRelay::discover_channels has cognitive complexity 29 (threshold 15). Drivers by points: if/else 6 (25 pts), loops 2 (4 pts) (nesting depth added 21). 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/buzz-acp/src/relay.rs"},"region":{"startLine":818}}}],"partialFingerprints":{"codehealthFindingId/v1":"87daa40f86d20e5368716fe8a05c2322f5fc1ffbabd4139cb7ac557415492802"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::relay::try_autonomous_reconnect (cognitive 29): buzz_acp::relay::try_autonomous_reconnect has cognitive complexity 29 (threshold 15). Drivers by points: match/switch 4 (15 pts), if/else 4 (9 pts), loops 2 (4 pts), boolean chains 1 (nesting depth added 18). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/relay.rs"},"region":{"startLine":3073}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7dc4121e1502d1c672b2dab26c247c184847ea2e3e09bc5ee3ce14e7b22af89"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::link_preview::fetch_sanitized_image_using (cognitive 29): buzz_desktop::commands::link_preview::fetch_sanitized_image_using has cognitive complexity 29 (threshold 15). Drivers by points: if/else 10 (25 pts), boolean chains 3, loops 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/link_preview.rs"},"region":{"startLine":431}}}],"partialFingerprints":{"codehealthFindingId/v1":"65ac8ed01750710656f2abef8c643238e19f549744d2babfdb0c376f678b3ea9"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::discovery::resolve_command_uncached (cognitive 29): buzz_desktop::managed_agents::discovery::resolve_command_uncached has cognitive complexity 29 (threshold 15). Drivers by points: if/else 10 (19 pts), loops 6 (10 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":"desktop/src-tauri/src/managed_agents/discovery.rs"},"region":{"startLine":587}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc42d27f98a11a39ce1ade207372ab95f0215dbd2dc01199d520b8011c64cfff"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::event_sync::reconcile_team_catalog_heads_core (cognitive 29): buzz_desktop::event_sync::reconcile_team_catalog_heads_core has cognitive complexity 29 (threshold 15). Drivers by points: if/else 11 (25 pts), match/switch 1 (2 pts), boolean chains 1, loops 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/event_sync.rs"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"82450f6a8133061d96d22313ae3054ccf5f82b31a5cb411d88a8164e7c5057ff"}},{"ruleId":"D2","level":"warning","message":{"text":"AndroidVoiceNotePackager.writeBlackVideoTrack (cognitive 29): AndroidVoiceNotePackager.writeBlackVideoTrack has cognitive complexity 29 (threshold 15). Drivers by points: if/else 8 (22 pts), boolean chains 2, error handling 2, match/switch 1 (2 pts), loops 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/android/app/src/main/kotlin/xyz/block/buzz/mobile/AndroidVoiceNotePackager.kt"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4ef24fd23fd8dbf719bdd2dbc4de3f1d8b928ab7bf76f27282728b8c59ccee8"}},{"ruleId":"D2","level":"warning","message":{"text":"exhaustive.test_merge_algebra_a (cognitive 29): exhaustive.test_merge_algebra_a has cognitive complexity 29 (threshold 15). Drivers by points: loops 7 (17 pts), if/else 3 (12 pts) (nesting depth added 19). 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":"docs/formal/nip-rs-unread/exhaustive.py"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"07b09eac8bb1634338d6dabb677aac42db970c2cf905737cc518fafc74e0fcba"}},{"ruleId":"D2","level":"warning","message":{"text":"exhaustive.test_tombstone_merge_monotonic (cognitive 29): exhaustive.test_tombstone_merge_monotonic has cognitive complexity 29 (threshold 15). Drivers by points: loops 6 (21 pts), if/else 1 (7 pts), boolean chains 1 (nesting depth added 21). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/formal/nip-rs-unread/exhaustive.py"},"region":{"startLine":509}}}],"partialFingerprints":{"codehealthFindingId/v1":"eadd6302bb77ac10affc7d4c213b383f9f203d4e3ac79fc7885d170aa390bb9d"}},{"ruleId":"D2","level":"warning","message":{"text":"BuzzPushBootstrap.build (cognitive 29): BuzzPushBootstrap.build has cognitive complexity 29 (threshold 15). Drivers by points: if/else 10 (14 pts), boolean chains 5, error handling 3 (5 pts), loops 2 (3 pts), ternaries 1 (2 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/push/push_bootstrap.dart"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d367dffad053d2655955fb24fcf17e3dc452b54e0ba557bc4230e5706a713b2"}},{"ruleId":"D2","level":"warning","message":{"text":"PersonaModelCombobox.PersonaModelCombobox (cognitive 29): PersonaModelCombobox.PersonaModelCombobox has cognitive complexity 29 (threshold 15). Drivers by points: if/else 9 (15 pts), boolean chains 6, ternaries 3 (5 pts), loops 2, match/switch 1 (nesting depth added 8). Of this number, 15 points are the body\u0027s own statements and 14 belong to 5 function literals 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":"desktop/src/features/agents/ui/PersonaModelCombobox.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"013a3a0ac33fe86cc2289c6dc96400bec4d6c15eb6615c09719ae2a8b9885016"}},{"ruleId":"D2","level":"warning","message":{"text":"agentSessionTranscriptGrouping.splitIntoSessionRuns (cognitive 29): agentSessionTranscriptGrouping.splitIntoSessionRuns has cognitive complexity 29 (threshold 15). Drivers by points: if/else 13 (22 pts), boolean chains 6, 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":"desktop/src/features/agents/ui/agentSessionTranscriptGrouping.ts"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"1342a528199ba368b1c05f303d5261cd900a4a3be96e3269595f236a26cacb64"}},{"ruleId":"D2","level":"warning","message":{"text":"useObserverEvents.useLoadArchivedObserverEvents (cognitive 29): useObserverEvents.useLoadArchivedObserverEvents has cognitive complexity 29 (threshold 15). Drivers by points: if/else 16, boolean chains 6, error handling 4 (6 pts), loops 1 (nesting depth added 2). Most of this is not in the body itself: 1 of the 29 points is its own statement and the rest belongs to 8 function literals inside it that branch (lines 272, 210, 159, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/useObserverEvents.ts"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"962b534f77761e51b21c15aaa7532201da3841038e094a1573c7b667f516b1b2"}},{"ruleId":"D2","level":"warning","message":{"text":"MeshComputeSettingsCard.StatusLine (cognitive 29): MeshComputeSettingsCard.StatusLine has cognitive complexity 29 (threshold 15). Drivers by points: ternaries 6 (14 pts), if/else 11 (13 pts), boolean chains 2 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/mesh-compute/ui/MeshComputeSettingsCard.tsx"},"region":{"startLine":617}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a273502d2b941afe43131be398c81fd6b7b0ea286fc641d1a30923326a3d03a"}},{"ruleId":"D2","level":"warning","message":{"text":"FormattingToolbar.FormattingToolbar (cognitive 29): FormattingToolbar.FormattingToolbar has cognitive complexity 29 (threshold 15). Drivers by points: if/else 20 (22 pts), boolean chains 4, ternaries 3 (nesting depth added 2). Most of this is not in the body itself: 2 of the 29 points are its own statements and the rest belongs to 12 function literals inside it that branch (lines 231, 165, 155, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/FormattingToolbar.tsx"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"a81362f8a84f163fba060a44749459661ed8b0f99b1734885968e6079ea9b283"}},{"ruleId":"D2","level":"warning","message":{"text":"desktop.listenForDesktopNotificationActions (cognitive 29): desktop.listenForDesktopNotificationActions has cognitive complexity 29 (threshold 15). Drivers by points: if/else 8 (16 pts), error handling 3 (8 pts), loops 1 (3 pts), boolean chains 2 (nesting depth added 15). Of this number, 18 points are the body\u0027s own statements and 11 belong to 2 function literals 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":"desktop/src/features/notifications/lib/desktop.ts"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"edb346f642e5663c126693975ac48472beae4f465f4d8bd230a28927723deaca"}},{"ruleId":"D2","level":"warning","message":{"text":"SetupStep.SetupStepContent (cognitive 29): SetupStep.SetupStepContent has cognitive complexity 29 (threshold 15). Drivers by points: ternaries 9 (13 pts), if/else 8 (9 pts), boolean chains 7 (nesting depth added 5). Of this number, 20 points are the body\u0027s own statements and 9 belong to 4 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/SetupStep.tsx"},"region":{"startLine":963}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e957245d442f08f06a93fdaed5c11b88a6903413a0ffc70f1821da7a8e822a9"}},{"ruleId":"D2","level":"warning","message":{"text":"hooks.usePresenceSession (cognitive 29): hooks.usePresenceSession has cognitive complexity 29 (threshold 15). Drivers by points: ternaries 9 (16 pts), if/else 10, boolean chains 2, error handling 1 (nesting depth added 7). Most of this is not in the body itself: 14 of the 29 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 362, 265, 298, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/presence/hooks.ts"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"f286b1449dd81f5da0f72142e1daf63c28acbabe0ce5b5c8b8cee931af3ff5b8"}},{"ruleId":"D2","level":"warning","message":{"text":"projectIssues.assignmentStateForIssue (cognitive 29): projectIssues.assignmentStateForIssue has cognitive complexity 29 (threshold 15). Drivers by points: if/else 9 (19 pts), boolean chains 6, loops 3 (4 pts) (nesting depth added 11). Of this number, 27 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/projectIssues.mjs"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce2f88691cb45cc283273444eaeb9e635c73ed1134f4b1ccbd7cac0b9bdf86ce"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectEntityListRow.ProjectEntityListRow (cognitive 29): ProjectEntityListRow.ProjectEntityListRow has cognitive complexity 29 (threshold 15). Drivers by points: ternaries 14 (17 pts), boolean chains 10, if/else 2 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectEntityListRow.tsx"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fae51b1cc35b5361bae5d93f6948314b6132f5d10687d1070e30c9eec447ec3"}},{"ruleId":"D2","level":"warning","message":{"text":"HarnessCatalogDialog.CatalogDetail (cognitive 29): HarnessCatalogDialog.CatalogDetail has cognitive complexity 29 (threshold 15). Drivers by points: ternaries 15 (25 pts), boolean chains 2, if/else 2 (nesting depth added 10). Of this number, 27 points are the body\u0027s own statements and 2 belong to 2 function literals 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":"desktop/src/features/settings/ui/HarnessCatalogDialog.tsx"},"region":{"startLine":451}}}],"partialFingerprints":{"codehealthFindingId/v1":"caa06a687ef979f035f1bb707f11e2a2909bdf2c4a98d7607d1ff5b945d69673"}},{"ruleId":"D2","level":"warning","message":{"text":"BestieGlobalOverlay.BestieGlobalOverlay (cognitive 29): BestieGlobalOverlay.BestieGlobalOverlay has cognitive complexity 29 (threshold 15). Drivers by points: if/else 14, boolean chains 8, ternaries 7. Most of this is not in the body itself: 7 of the 29 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 94, 140, 85, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/protectedFeatures/bestie/BestieGlobalOverlay.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"39bfa419876107849c0f95232f781b433332ef49fdc7438c8f5a4c4811e676c3"}},{"ruleId":"D2","level":"warning","message":{"text":"RelayClient.sendRawWithReconnectRetry (cognitive 29): RelayClient.sendRawWithReconnectRetry has cognitive complexity 29 (threshold 15). Drivers by points: if/else 6 (14 pts), boolean chains 6, ternaries 3 (6 pts), error handling 2 (3 pts) (nesting depth added 12). Of this number, 16 points are the body\u0027s own statements and 13 belong to 6 function literals 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":"desktop/src/shared/api/relayClientSession.ts"},"region":{"startLine":745}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd50ff9c3e6aea1cc23b09a3069f242645d34315f13ff4e4150610694db4988d"}},{"ruleId":"D2","level":"warning","message":{"text":"useResolvedLinkPreviews.createMetadataLoader (cognitive 29): useResolvedLinkPreviews.createMetadataLoader has cognitive complexity 29 (threshold 15). Drivers by points: if/else 15 (19 pts), boolean chains 8, loops 2 (nesting depth added 4). Most of this is not in the body itself: 6 of the 29 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 253, 198, 241, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/lib/useResolvedLinkPreviews.ts"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"47fadc52526fd2c4a9feba430d620ae3ce961c4f040c9672668c442a0c892369"}},{"ruleId":"D2","level":"warning","message":{"text":"installNativeRig::openScope (cognitive 29): installNativeRig::openScope has cognitive complexity 29 (threshold 15). Drivers by points: if/else 5 (13 pts), loops 4 (12 pts), boolean chains 3, other 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":"desktop/src/features/channels/observedUnreadNativeRig.mjs"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"45f6a804d6ec30adc6ab9f8c40d42df721b7c6c5716fedbc5e888c6b209c0e87"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_agent::model_capabilities::validate_manifest (cognitive 28): buzz_agent::model_capabilities::validate_manifest has cognitive complexity 28 (threshold 15). Drivers by points: if/else 13 (22 pts), loops 5 (6 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/buzz-agent/src/model_capabilities.rs"},"region":{"startLine":537}}}],"partialFingerprints":{"codehealthFindingId/v1":"033c194d5faa6359a48e335130fcb147442558ee773e3700f6002871cb81ad51"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_cli::commands::pack::cmd_inspect (cognitive 28): buzz_cli::commands::pack::cmd_inspect has cognitive complexity 28 (threshold 15). Drivers by points: if/else 19 (27 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/buzz-cli/src/commands/pack.rs"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cd4fde5396da3d5ef5b5cb61740cabda90d6faaf8635bbacc419ed45adcae40"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_db::store::event::insert_event_with_thread_metadata_tx (cognitive 28): buzz_db::store::event::insert_event_with_thread_metadata_tx has cognitive complexity 28 (threshold 15). Drivers by points: if/else 9 (28 pts) (nesting depth added 19). 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/buzz-db/src/store/event.rs"},"region":{"startLine":1381}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3f2b9af9b97911ecd13b94f28530c1e745e34e33af8d1da00eaaee20e079973"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::audio::join::read_owner_control (cognitive 28): buzz_relay::audio::join::read_owner_control has cognitive complexity 28 (threshold 15). Drivers by points: if/else 6 (18 pts), match/switch 3 (9 pts), 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/buzz-relay/src/audio/join.rs"},"region":{"startLine":1584}}}],"partialFingerprints":{"codehealthFindingId/v1":"be9125d602b505222e4661d8508045f7589fbf7438b389e57e222ec2744dbd48"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::native_websocket::run_connection (cognitive 28): buzz_desktop::native_websocket::run_connection has cognitive complexity 28 (threshold 15). Drivers by points: if/else 6 (18 pts), match/switch 3 (8 pts), boolean chains 1, loops 1 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/native_websocket.rs"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"42e8c6e0f675f652556087fa41326d2da2e6958cfd3907fc11a91134116f44a0"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::observed_unread::open_scope_locked (cognitive 28): buzz_desktop::observed_unread::open_scope_locked has cognitive complexity 28 (threshold 15). Drivers by points: if/else 5 (18 pts), loops 2 (10 pts) (nesting depth added 21). 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":"desktop/src-tauri/src/observed_unread.rs"},"region":{"startLine":460}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2b740db099cecd32f62bac4683490b7d980e858f16d8559027a3daeb5278304"}},{"ruleId":"D2","level":"warning","message":{"text":"exhaustive.explore_b (cognitive 28): exhaustive.explore_b has cognitive complexity 28 (threshold 15). Drivers by points: if/else 5 (16 pts), loops 5 (12 pts) (nesting depth added 18). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/formal/nip-rs-unread/exhaustive.py"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"45ea9d4373bb6dbafc7fe65729e4ed8a91b36d1132a9a3a7aea38dbc5c29eddb"}},{"ruleId":"D2","level":"warning","message":{"text":"PairingNotifier._handlePairingEvent (cognitive 28): PairingNotifier._handlePairingEvent has cognitive complexity 28 (threshold 15). Drivers by points: if/else 9 (19 pts), boolean chains 4, error handling 2 (3 pts), match/switch 1 (2 pts) (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/pairing/pairing_provider.dart"},"region":{"startLine":513}}}],"partialFingerprints":{"codehealthFindingId/v1":"679e9cf1741a942d8c9a860911b3d75fa78e750d323954172ccbe6d36ff405c3"}},{"ruleId":"D2","level":"warning","message":{"text":"HuddleSessionNotifier._wireMediaAndTransport (cognitive 28): HuddleSessionNotifier._wireMediaAndTransport has cognitive complexity 28 (threshold 15). Drivers by points: if/else 15 (21 pts), boolean chains 4, ternaries 1 (2 pts), error handling 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":"mobile/lib/shared/huddle/huddle_session.dart"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b59c5e24e93a0c111c4e82c4a1f08afda8b2b3fa213216c3f250adcc6fd2e60"}},{"ruleId":"D2","level":"warning","message":{"text":"RelaySessionNotifier._handleClosed (cognitive 28): RelaySessionNotifier._handleClosed has cognitive complexity 28 (threshold 15). Drivers by points: if/else 13 (16 pts), boolean chains 6, ternaries 4 (6 pts) (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":"mobile/lib/shared/relay/relay_session.dart"},"region":{"startLine":710}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e196099e75115f900e78bd11fe4f88bc6ba15968ae6205c6ce13aab066bc186"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelCanvas.ChannelCanvas (cognitive 28): ChannelCanvas.ChannelCanvas has cognitive complexity 28 (threshold 15). Drivers by points: ternaries 12 (19 pts), boolean chains 5, if/else 4 (nesting depth added 7). Of this number, 26 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/ChannelCanvas.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"687fc5fa355d57664b4eab20befd9960386e2384fd0c518b6c2404cd207b7ed6"}},{"ruleId":"D2","level":"warning","message":{"text":"ForumView.ForumView (cognitive 28): ForumView.ForumView has cognitive complexity 28 (threshold 15). Drivers by points: ternaries 7 (12 pts), if/else 5 (7 pts), loops 4 (7 pts), boolean chains 2 (nesting depth added 10). Of this number, 14 points are the body\u0027s own statements and 14 belong to 4 function literals 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":"desktop/src/features/forum/ui/ForumView.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"91fb840abfc3fafe55a4abe16e957eb1241887066003df9764243b6d74840869"}},{"ruleId":"D2","level":"warning","message":{"text":"use-feed-desktop-notifications.useFeedDesktopNotifications (cognitive 28): use-feed-desktop-notifications.useFeedDesktopNotifications has cognitive complexity 28 (threshold 15). Drivers by points: if/else 11 (14 pts), boolean chains 5, ternaries 3 (5 pts), loops 3 (4 pts) (nesting depth added 6). Most of this is not in the body itself: 0 of the 28 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 131, 95, 113, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/notifications/use-feed-desktop-notifications.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fd0a18594c7bf4c4d67a1f6c81825a6e3814234ae63a9e0e06f462f099f27a2"}},{"ruleId":"D2","level":"warning","message":{"text":"useProjectSidebarMembership.useProjectSidebarMembership (cognitive 28): useProjectSidebarMembership.useProjectSidebarMembership has cognitive complexity 28 (threshold 15). Drivers by points: if/else 20, boolean chains 8. Most of this is not in the body itself: 0 of the 28 points are its own statements and the rest belongs to 13 function literals inside it that branch (lines 90, 157, 33, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/lib/useProjectSidebarMembership.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c8a4783c5e1dbfe9fba1c674f13dd200bc6e2a8ea9c8de848126a88f4a9c61a"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectsActivityFeed.ActivityCard (cognitive 28): ProjectsActivityFeed.ActivityCard has cognitive complexity 28 (threshold 15). Drivers by points: ternaries 19 (27 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":"desktop/src/features/projects/ui/ProjectsActivityFeed.tsx"},"region":{"startLine":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"d31598d0ac50b076c80b3affa355142b9bc3566dc6334a66d3a12784a0c7d0e4"}},{"ruleId":"D2","level":"warning","message":{"text":"NotificationSettingsCard.NotificationSettingsCard (cognitive 28): NotificationSettingsCard.NotificationSettingsCard has cognitive complexity 28 (threshold 15). Drivers by points: ternaries 10 (18 pts), boolean chains 10 (nesting depth added 8). Of this number, 18 points are the body\u0027s own statements and 10 belong to 3 function literals 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":"desktop/src/features/settings/ui/NotificationSettingsCard.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"95f66a3f2d956ae80fdff217ba84116076d8920fc7edf26e89f544f2b583e84e"}},{"ruleId":"D2","level":"warning","message":{"text":"relayClosedRecovery.handleRelayClosed (cognitive 28): relayClosedRecovery.handleRelayClosed has cognitive complexity 28 (threshold 15). Drivers by points: if/else 8 (26 pts), boolean chains 2 (nesting depth added 18). Most of this is not in the body itself: 12 of the 28 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 66, 85, 77). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/api/relayClosedRecovery.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"751785e538ace4b07613770c622519a50f5bbc0cfd8e5e73753886cd7ee8aab5"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::pool::create_session_and_apply_model (cognitive 27): buzz_acp::pool::create_session_and_apply_model has cognitive complexity 27 (threshold 15). Drivers by points: if/else 10 (17 pts), match/switch 3 (8 pts), boolean chains 2 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/pool.rs"},"region":{"startLine":1490}}}],"partialFingerprints":{"codehealthFindingId/v1":"91e81ebc9647515c08fdeb797d3b7da4b23d2c55e8c9ec890ca17bd84bb53640"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_db::store::deletion::validate_manifest_key_chunks (cognitive 27): buzz_db::store::deletion::validate_manifest_key_chunks has cognitive complexity 27 (threshold 15). Drivers by points: if/else 9 (17 pts), loops 4 (6 pts), match/switch 1 (3 pts), boolean chains 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/deletion.rs"},"region":{"startLine":3051}}}],"partialFingerprints":{"codehealthFindingId/v1":"6344af73456c7cfb9647243daa76696e18ff9e44dd2616e2eceb693e09c5bae5"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_deletion::enumerate_tenant_prefixes (cognitive 27): buzz_deletion::enumerate_tenant_prefixes has cognitive complexity 27 (threshold 15). Drivers by points: if/else 6 (21 pts), loops 3 (6 pts) (nesting depth added 18). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-deletion/src/lib.rs"},"region":{"startLine":744}}}],"partialFingerprints":{"codehealthFindingId/v1":"91962075dca81e2a9caa50f024386e5999e48f7c0229bd32d830ff4b37b53c11"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::connection::send_loop_inner (cognitive 27): buzz_relay::connection::send_loop_inner has cognitive complexity 27 (threshold 15). Drivers by points: match/switch 7 (21 pts), loops 3 (6 pts) (nesting depth added 17). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/connection.rs"},"region":{"startLine":595}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f76028701eb7b56e0f1407d746d76b048c6e2abdf060edc33d97e6808a12b8b"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowDef::validate (cognitive 27): WorkflowDef::validate has cognitive complexity 27 (threshold 15). Drivers by points: if/else 13 (20 pts), boolean chains 4, loops 2 (3 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-workflow/src/schema.rs"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"836b0b0619a1adc019b1c69b41e6f8063ed312835874afef3dbc19fa0a6761fe"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::huddle::relay_api::audio_relay_pipeline (cognitive 27): buzz_desktop::huddle::relay_api::audio_relay_pipeline has cognitive complexity 27 (threshold 15). Drivers by points: if/else 7 (18 pts), match/switch 3 (6 pts), 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":"desktop/src-tauri/src/huddle/relay_api.rs"},"region":{"startLine":467}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a7d32a2fdba58cfe7fafe6c7e56b8f3612d4639f2d8cf9846b45a82ae84471b"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::config_bridge::effort::resolve_effective_effort (cognitive 27): buzz_desktop::managed_agents::config_bridge::effort::resolve_effective_effort has cognitive complexity 27 (threshold 15). Drivers by points: if/else 15 (27 pts) (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/config_bridge/effort.rs"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"acaa1c1ba624d3c50c345eab3b0069588cbac23302a0657bee30b70ff4949d1b"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::personas::card::mint_agent_card (cognitive 27): buzz_desktop::commands::personas::card::mint_agent_card has cognitive complexity 27 (threshold 15). Drivers by points: if/else 15 (21 pts), match/switch 4 (5 pts), boolean chains 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/personas/card.rs"},"region":{"startLine":534}}}],"partialFingerprints":{"codehealthFindingId/v1":"568a3ff54cbd2681664fc4ffda5e8067c314057ebc1e1aaeab642a3f1b4c560f"}},{"ruleId":"D2","level":"warning","message":{"text":"ActivityNotifier._subscribeChannelBatches (cognitive 27): ActivityNotifier._subscribeChannelBatches has cognitive complexity 27 (threshold 15). Drivers by points: loops 5 (14 pts), if/else 4 (9 pts), error handling 1 (2 pts), ternaries 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":"mobile/lib/features/activity/activity_provider.dart"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fab27b073f45de45cb3b62b17fbc1024381e7ebb521d63d1ec3cd64694ef1c5"}},{"ruleId":"D2","level":"warning","message":{"text":"_DeepLinkDispatcherState._maybeDispatchInvite (cognitive 27): _DeepLinkDispatcherState._maybeDispatchInvite has cognitive complexity 27 (threshold 15). Drivers by points: if/else 9 (20 pts), boolean chains 6, error handling 1 (nesting depth added 11). 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":"mobile/lib/features/channels/deep_link_dispatcher.dart"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5e6bf0eb8b09b4957092dcd06179c881b1a97e837e8b42550ad5a123e5c9003"}},{"ruleId":"D2","level":"warning","message":{"text":"InviteJoinNotifier.confirmJoin (cognitive 27): InviteJoinNotifier.confirmJoin has cognitive complexity 27 (threshold 15). Drivers by points: if/else 8 (15 pts), boolean chains 6, ternaries 2 (5 pts), error handling 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/invites/invite_join_provider.dart"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"2db5b59dc094590c072c5a3c0555bf7717bc1f52318980d54b638456a74fb9a3"}},{"ruleId":"D2","level":"warning","message":{"text":"UserProfileSheet.build (cognitive 27): UserProfileSheet.build has cognitive complexity 27 (threshold 15). Drivers by points: if/else 11 (13 pts), ternaries 7 (11 pts), boolean chains 2, error handling 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/profile/user_profile_sheet.dart"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"c37c139d18b760e2b482d899271bcf2a69578453d1564daa1e017870956f32ca"}},{"ruleId":"D2","level":"warning","message":{"text":"MethodChannelHuddleMedia._handleNativeCall (cognitive 27): MethodChannelHuddleMedia._handleNativeCall has cognitive complexity 27 (threshold 15). Drivers by points: if/else 7 (14 pts), ternaries 3 (6 pts), error handling 2 (4 pts), boolean chains 2, match/switch 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/huddle/huddle_media.dart"},"region":{"startLine":627}}}],"partialFingerprints":{"codehealthFindingId/v1":"1048b985961297825a75f95a8ee1a0f3693dc564c80b31fa65c7decca95d7f64"}},{"ruleId":"D2","level":"warning","message":{"text":"AdminConsoleStaffingTab.StaffingTab (cognitive 27): AdminConsoleStaffingTab.StaffingTab has cognitive complexity 27 (threshold 15). Drivers by points: boolean chains 14, if/else 8, error handling 3, ternaries 2. Of this number, 16 points are the body\u0027s own statements and 11 belong to 5 function literals inside it that branch. 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":"desktop/src/features/admin-console/AdminConsoleStaffingTab.tsx"},"region":{"startLine":471}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6a5d9a9ea34c72c4f5714c3af56d2887418ab6d9aeadb175cdc95891d86870c"}},{"ruleId":"D2","level":"warning","message":{"text":"AddTeamToChannelDialog.AddTeamToChannelDialog (cognitive 27): AddTeamToChannelDialog.AddTeamToChannelDialog has cognitive complexity 27 (threshold 15). Drivers by points: ternaries 12 (15 pts), boolean chains 7, if/else 4, error handling 1 (nesting depth added 3). Of this number, 22 points are the body\u0027s own statements and 5 belong to 3 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AddTeamToChannelDialog.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef634758a51fb3cbece2d74f4cb5bcfa0e542d882c80e04bc473322b43b3eea5"}},{"ruleId":"D2","level":"warning","message":{"text":"PersonaShareRecipients.PersonaShareRecipients (cognitive 27): PersonaShareRecipients.PersonaShareRecipients has cognitive complexity 27 (threshold 15). Drivers by points: if/else 9 (10 pts), ternaries 7 (9 pts), boolean chains 8 (nesting depth added 3). Of this number, 14 points are the body\u0027s own statements and 13 belong to 6 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/PersonaShareRecipients.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"78d1bfb0eaf9c9ba2463790536b549868acdcd32c9ab7ae95e9f3a85df34b806"}},{"ruleId":"D2","level":"warning","message":{"text":"agentConfigControls.AgentDropdownSelect (cognitive 27): agentConfigControls.AgentDropdownSelect has cognitive complexity 27 (threshold 15). Drivers by points: boolean chains 14, ternaries 7 (10 pts), if/else 3 (nesting depth added 3). Of this number, 17 points are the body\u0027s own statements and 10 belong to 4 function literals inside it that branch. 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":"desktop/src/features/agents/ui/agentConfigControls.tsx"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d53e3c859d258d0e3e6f8fe9a3b14fda4e5d1d36ca311fba718848967e2c9a7"}},{"ruleId":"D2","level":"warning","message":{"text":"ToolDetailBlocks.ToolDetailBlocks (cognitive 27): ToolDetailBlocks.ToolDetailBlocks has cognitive complexity 27 (threshold 15). Drivers by points: ternaries 10 (20 pts), boolean chains 7 (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":"desktop/src/features/agents/ui/AgentSessionToolItem/ToolDetailBlocks.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a89b011d6a610c3fd3ae42064b5efcbf26c7e035161961a6bc06a4092eb58d8"}},{"ruleId":"D2","level":"warning","message":{"text":"useApplyTemplate.useApplyTemplate (cognitive 27): useApplyTemplate.useApplyTemplate has cognitive complexity 27 (threshold 15). Drivers by points: if/else 13 (18 pts), loops 3 (4 pts), error handling 2, ternaries 1 (2 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":"desktop/src/features/channel-templates/useApplyTemplate.ts"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8d9f72fa0c465ea79781289c3536e8a02507d9947c64acaa9927416b1c2eaa1"}},{"ruleId":"D2","level":"warning","message":{"text":"FeedSection.FeedSection (cognitive 27): FeedSection.FeedSection has cognitive complexity 27 (threshold 15). Drivers by points: ternaries 10 (21 pts), if/else 2 (4 pts), boolean chains 2 (nesting depth added 13). Most of this is not in the body itself: 1 of the 27 points is its own statement and the rest belongs to 2 function literals inside it that branch (lines 165, 250). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/ui/FeedSection.tsx"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"a488696392d8da54980252c1d3c8c988ee70295fdb1e05197b2e753895dd296d"}},{"ruleId":"D2","level":"warning","message":{"text":"hooks.useSendMessageMutation (cognitive 27): hooks.useSendMessageMutation has cognitive complexity 27 (threshold 15). Drivers by points: ternaries 8 (14 pts), if/else 9 (10 pts), boolean chains 3 (nesting depth added 7). Most of this is not in the body itself: 0 of the 27 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 499, 657, 584, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/hooks.ts"},"region":{"startLine":476}}}],"partialFingerprints":{"codehealthFindingId/v1":"962853dbbefcce2d422bc9630670df3ac17d4f6b58f67b91b017aae1acf8f357"}},{"ruleId":"D2","level":"warning","message":{"text":"workflowActivationWarning.matchesEveryHour (cognitive 27): workflowActivationWarning.matchesEveryHour has cognitive complexity 27 (threshold 15). Drivers by points: if/else 7 (18 pts), boolean chains 4, loops 2 (3 pts), ternaries 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":"desktop/src/features/workflows/ui/workflowActivationWarning.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"69983f47d51db026efa2c08537eb38bfc65b6dadc7eb8e5d1f1d85b04e4bfece"}},{"ruleId":"D2","level":"warning","message":{"text":"BestiePopover.BestiePopover (cognitive 27): BestiePopover.BestiePopover has cognitive complexity 27 (threshold 15). Drivers by points: if/else 13, boolean chains 10, ternaries 4. Most of this is not in the body itself: 7 of the 27 points are its own statements and the rest belongs to 13 function literals inside it that branch (lines 357, 262, 305, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/protectedFeatures/bestie/BestiePopover.tsx"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"022d2721544454cce6549b86beb2a800962de02e55e19dd631a77eb0f569b61a"}},{"ruleId":"D2","level":"warning","message":{"text":"RelayClient.handleWsMessage (cognitive 27): RelayClient.handleWsMessage has cognitive complexity 27 (threshold 15). Drivers by points: if/else 13 (15 pts), boolean chains 7, ternaries 2 (4 pts), error handling 1 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/api/relayClientSession.ts"},"region":{"startLine":867}}}],"partialFingerprints":{"codehealthFindingId/v1":"8eba11968d1429faa8567261ab076c182e889afe4cdec562a6ad8a60a1e9dfd7"}},{"ruleId":"D2","level":"warning","message":{"text":"linkPreviewSnapshot.parseLinkPreviewSnapshots (cognitive 27): linkPreviewSnapshot.parseLinkPreviewSnapshots has cognitive complexity 27 (threshold 15). Drivers by points: boolean chains 11, if/else 6 (11 pts), ternaries 2 (4 pts), loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/lib/linkPreviewSnapshot.ts"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"76070f060b88e2afde57977e7c9ddc3258407bbfdcf9ab0be4ff5297bcb5c1f0"}},{"ruleId":"D2","level":"warning","message":{"text":"use-repo-refs.parseRefs (cognitive 27): use-repo-refs.parseRefs has cognitive complexity 27 (threshold 15). Drivers by points: if/else 7 (16 pts), loops 4 (8 pts), boolean chains 3 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/features/repos/use-repo-refs.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"69f2983b2dd96edc2e680b9b77148d9236d28eeeb0ca134a7310e06c1dda159a"}},{"ruleId":"D2","level":"warning","message":{"text":"installNativeRig::ingest (cognitive 27): installNativeRig::ingest has cognitive complexity 27 (threshold 15). Drivers by points: if/else 9 (14 pts), loops 6 (7 pts), other 4, 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":"desktop/src/features/channels/observedUnreadNativeRig.mjs"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"15126a22e77f48e48f4e0adec4e5bdb1897ab936ae6b7a3264dbf0f81681ec7b"}},{"ruleId":"D2","level":"warning","message":{"text":"AcpClient::read_until_response (cognitive 26): AcpClient::read_until_response has cognitive complexity 26 (threshold 15). Drivers by points: if/else 6 (17 pts), match/switch 3 (7 pts), boolean chains 1, loops 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/acp.rs"},"region":{"startLine":1247}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb59973b54c140485dd477d4d51a3a333897cc980b441ae11ed417ef3e066e3d"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::queue::format_prompt (cognitive 26): buzz_acp::queue::format_prompt has cognitive complexity 26 (threshold 15). Drivers by points: if/else 14 (20 pts), loops 2 (4 pts), boolean chains 1, match/switch 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/queue.rs"},"region":{"startLine":1993}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8499764b8319dd0a448186f2d6c1739b51f10080a98d19855cd32f6da528052"}},{"ruleId":"D2","level":"warning","message":{"text":"McpRegistry::call_hooks (cognitive 26): McpRegistry::call_hooks has cognitive complexity 26 (threshold 15). Drivers by points: if/else 9 (20 pts), loops 3, match/switch 1 (2 pts), boolean chains 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/mcp.rs"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fecad7894dd1f827302279073b307f59c5a4efb2e1ad6988d410464a1803dd1"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_db::store::thread::get_channel_window_on (cognitive 26): buzz_db::store::thread::get_channel_window_on has cognitive complexity 26 (threshold 15). Drivers by points: if/else 9 (15 pts), match/switch 3 (6 pts), loops 3 (5 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/buzz-db/src/store/thread.rs"},"region":{"startLine":582}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d699cec79a79e3d526bdb7e5c5278797b32b4474f7022dcc9356b0492523529"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_dev_mcp::view_image::gif_has_two_image_descriptors (cognitive 26): buzz_dev_mcp::view_image::gif_has_two_image_descriptors has cognitive complexity 26 (threshold 15). Drivers by points: if/else 9 (19 pts), match/switch 3 (6 pts), loops 1 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-dev-mcp/src/view_image.rs"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"92eda2c27dded12fd2b7c2bfa6ea6ee06004d1482890b0bfee6b7402301c4a45"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::ingest::validate_event_reminder (cognitive 26): buzz_relay::handlers::ingest::validate_event_reminder has cognitive complexity 26 (threshold 15). Drivers by points: if/else 11 (23 pts), match/switch 1 (2 pts), loops 1 (nesting depth added 13). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":2057}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a82a3fe08401504b879b854cb0858598642bf4a9b316c35c78022475323366d"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::team_snapshot::materialize_team_snapshot_bytes (cognitive 26): buzz_desktop::commands::team_snapshot::materialize_team_snapshot_bytes has cognitive complexity 26 (threshold 15). Drivers by points: if/else 8 (18 pts), loops 2 (7 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":"desktop/src-tauri/src/commands/team_snapshot.rs"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"5472273282ecfa996e891b02aaebe3e6846b63da66b5334b28fe9bf473a1d67f"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::huddle::stt::process_16k_samples (cognitive 26): buzz_desktop::huddle::stt::process_16k_samples has cognitive complexity 26 (threshold 15). Drivers by points: if/else 7 (17 pts), match/switch 2 (5 pts), boolean chains 3, loops 1 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/huddle/stt.rs"},"region":{"startLine":660}}}],"partialFingerprints":{"codehealthFindingId/v1":"a33d688e5244ab1bec33abd5294e57b5532b15b649e1fb31efc2c748b5b71dd2"}},{"ruleId":"D2","level":"warning","message":{"text":"desktop_release.validate (cognitive 26): desktop_release.validate has cognitive complexity 26 (threshold 15). Drivers by points: if/else 15 (17 pts), boolean chains 6, ternaries 3 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/desktop_release.py"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"70c9b1df03938479afa56a063d05e310c4ba91a64409c1460e34004664dbcf6e"}},{"ruleId":"D2","level":"warning","message":{"text":"NativeEmojiCategoryTracker.selectedSectionID (cognitive 26): NativeEmojiCategoryTracker.selectedSectionID has cognitive complexity 26 (threshold 15). Drivers by points: if/else 10 (14 pts), boolean chains 11, loops 1 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/NativeEmojiPickerModel.swift"},"region":{"startLine":415}}}],"partialFingerprints":{"codehealthFindingId/v1":"baffa916984cbc0d56f13d87959b3f8505a162df5d593e4aaefeb4486a72289d"}},{"ruleId":"D2","level":"warning","message":{"text":"BuzzPushNotificationResolver.refreshPresentation (cognitive 26): BuzzPushNotificationResolver.refreshPresentation has cognitive complexity 26 (threshold 15). Drivers by points: boolean chains 17, if/else 6, ternaries 3. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushNotificationResolver.swift"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"9df0ee42b02ea165acf49e2ea07a96a8b3bd1b523ed1340ee054912ebc637d88"}},{"ruleId":"D2","level":"warning","message":{"text":"_MorphingQuickActionsButton.build (cognitive 26): _MorphingQuickActionsButton.build has cognitive complexity 26 (threshold 15). Drivers by points: ternaries 11 (18 pts), if/else 5 (7 pts), boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channels_page/quick_actions.dart"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a49ed972c76600e17c5222ac5bde9613005f7e3e21ed9b6cbe093b11f439d0d"}},{"ruleId":"D2","level":"warning","message":{"text":"agentSessionToolCatalog.getBuzzToolInfo (cognitive 26): agentSessionToolCatalog.getBuzzToolInfo has cognitive complexity 26 (threshold 15). Drivers by points: ternaries 8 (14 pts), boolean chains 6, if/else 6 (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":"desktop/src/features/agents/ui/agentSessionToolCatalog.ts"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"758dff0f3c6c8a2706b9578f65c78272e4cf7909082b8e20ec7316b977a6d76e"}},{"ruleId":"D2","level":"warning","message":{"text":"usePersonaSync.startPersonaSync (cognitive 26): usePersonaSync.startPersonaSync has cognitive complexity 26 (threshold 15). Drivers by points: if/else 12 (18 pts), loops 3 (4 pts), boolean chains 2, error handling 1 (2 pts) (nesting depth added 8). Most of this is not in the body itself: 0 of the 26 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 377, 343, 356, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/lib/usePersonaSync.ts"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ef1195bbfe2b8a774008965186233eeba0a32058e007971a904d3934ac7c3b4"}},{"ruleId":"D2","level":"warning","message":{"text":"AddAgentToChannelDialog.AddAgentToChannelDialog (cognitive 26): AddAgentToChannelDialog.AddAgentToChannelDialog has cognitive complexity 26 (threshold 15). Drivers by points: boolean chains 10, ternaries 9 (10 pts), if/else 5, error handling 1 (nesting depth added 1). Of this number, 20 points are the body\u0027s own statements and 6 belong to 3 function literals inside it that branch. 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":"desktop/src/features/agents/ui/AddAgentToChannelDialog.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"af8c6312641c7a7b24819663f9c43745689610d57f4af2cb76ef82667f48185f"}},{"ruleId":"D2","level":"warning","message":{"text":"usePersonaModelDiscovery.usePersonaModelDiscovery (cognitive 26): usePersonaModelDiscovery.usePersonaModelDiscovery has cognitive complexity 26 (threshold 15). Drivers by points: if/else 11 (12 pts), boolean chains 8, ternaries 5 (6 pts) (nesting depth added 2). Most of this is not in the body itself: 10 of the 26 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 248, 229, 304, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/usePersonaModelDiscovery.ts"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"393f411ba046012825acd19b1935718c6ef0967a5e8f37e4a1dfd4fc3c389bf1"}},{"ruleId":"D2","level":"warning","message":{"text":"observedUnreadStorage.pruneObservedUnreadByMarkers (cognitive 26): observedUnreadStorage.pruneObservedUnreadByMarkers has cognitive complexity 26 (threshold 15). Drivers by points: if/else 7 (16 pts), loops 5 (9 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":"desktop/src/features/channels/observedUnreadStorage.ts"},"region":{"startLine":365}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5fdb56924e077b1f6ad216b95703a2605c4f1a09bf5cacc4d3bb4200d3fe9c7"}},{"ruleId":"D2","level":"warning","message":{"text":"BotActivityBar.BotActivityComposerAction (cognitive 26): BotActivityBar.BotActivityComposerAction has cognitive complexity 26 (threshold 15). Drivers by points: ternaries 14, if/else 7 (10 pts), boolean chains 1, loops 1 (nesting depth added 3). Most of this is not in the body itself: 10 of the 26 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 64, 186, 102, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/BotActivityBar.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"796241a437bdb6a7963749787ac5efaa008f86d7baf73e6fa17d28cf555d448d"}},{"ruleId":"D2","level":"warning","message":{"text":"sendToChannelSemantics.getSendToChannelSemantics (cognitive 26): sendToChannelSemantics.getSendToChannelSemantics has cognitive complexity 26 (threshold 15). Drivers by points: if/else 5 (13 pts), boolean chains 9, ternaries 2 (3 pts), loops 1 (nesting depth added 9). Of this number, 22 points are the body\u0027s own statements and 4 belong to 2 function literals 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":"desktop/src/features/messages/lib/sendToChannelSemantics.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"896975bb3a5e61c3fb2091251492d0a8d5724ce0e7705ae428778f7faef7ce9b"}},{"ruleId":"D2","level":"warning","message":{"text":"AnimatedAvatarControls.AvatarFramingSlider (cognitive 26): AnimatedAvatarControls.AvatarFramingSlider has cognitive complexity 26 (threshold 15). Drivers by points: if/else 12, ternaries 8 (9 pts), boolean chains 5 (nesting depth added 1). Most of this is not in the body itself: 10 of the 26 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 186, 125, 145, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/AnimatedAvatarControls.tsx"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"d70db60a86c28560750ed4637c9b2e6e8c4b4a461c16c682f705dd9ecb9450fa"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectPullRequestFilesChangedPanel.DiffPreview (cognitive 26): ProjectPullRequestFilesChangedPanel.DiffPreview has cognitive complexity 26 (threshold 15). Drivers by points: boolean chains 11, ternaries 9 (11 pts), if/else 4 (nesting depth added 2). Most of this is not in the body itself: 2 of the 26 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 509, 461, 470, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectPullRequestFilesChangedPanel.tsx"},"region":{"startLine":447}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c7803809d438584e08f4c08620a24c913989497a1a2110cb79f08305ea6e17c"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectsChannelsList.ProjectsChannelsList (cognitive 26): ProjectsChannelsList.ProjectsChannelsList has cognitive complexity 26 (threshold 15). Drivers by points: ternaries 13 (18 pts), if/else 3 (4 pts), boolean chains 2, loops 2 (nesting depth added 6). Most of this is not in the body itself: 7 of the 26 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 171, 90, 112, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectsChannelsList.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c13cc67a091fda314dccdb0f3da3371fb575a315d0fbd57e14191ca65ceee64"}},{"ruleId":"D2","level":"warning","message":{"text":"LaneReconciler.runAttempt (cognitive 26): LaneReconciler.runAttempt has cognitive complexity 26 (threshold 15). Drivers by points: if/else 15 (17 pts), boolean chains 7, error handling 2 (nesting depth added 2). Of this number, 23 points are the body\u0027s own statements and 3 belong to 2 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/lib/sidebarLaneReconciler.ts"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"850f9a7c0758da4d5be27ddd2cdedf6d9915802527a6f890d67fb4f9b33f58a7"}},{"ruleId":"D2","level":"warning","message":{"text":"useChannelMutes.useChannelMutes (cognitive 26): useChannelMutes.useChannelMutes has cognitive complexity 26 (threshold 15). Drivers by points: if/else 22, boolean chains 4. Most of this is not in the body itself: 1 of the 26 points is its own statement and the rest belongs to 15 function literals inside it that branch (lines 77, 142, 41, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/lib/useChannelMutes.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"20828246c7cf635f2d1517ab146b2beb212430178b1f5bc8918d4e5fa24c5714"}},{"ruleId":"D2","level":"warning","message":{"text":"useChannelStars.useChannelStars (cognitive 26): useChannelStars.useChannelStars has cognitive complexity 26 (threshold 15). Drivers by points: if/else 22, boolean chains 4. Most of this is not in the body itself: 1 of the 26 points is its own statement and the rest belongs to 15 function literals inside it that branch (lines 77, 142, 41, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/lib/useChannelStars.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"d86e77a384a90a493b01a4aebae13e7588aaf4e8d84bc3e9958dd93113c96c30"}},{"ruleId":"D2","level":"warning","message":{"text":"SidebarSection.SidebarSection (cognitive 26): SidebarSection.SidebarSection has cognitive complexity 26 (threshold 15). Drivers by points: ternaries 8 (18 pts), boolean chains 7, if/else 1 (nesting depth added 10). Most of this is not in the body itself: 12 of the 26 points are its own statements and the rest belongs to one function literal inside it that branches (line 471). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/SidebarSection.tsx"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d4d066736fc85ca4905c016463b7ad50415b3c78a26c920bad591edcd8863f7"}},{"ruleId":"D2","level":"warning","message":{"text":"useSidebarRelayConnectionCard.useSidebarRelayConnectionCard (cognitive 26): useSidebarRelayConnectionCard.useSidebarRelayConnectionCard has cognitive complexity 26 (threshold 15). Drivers by points: if/else 12 (14 pts), boolean chains 11, ternaries 1 (nesting depth added 2). Most of this is not in the body itself: 10 of the 26 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 115, 157, 185, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/useSidebarRelayConnectionCard.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa5dd864cd735871573877d7422a2fba745b5695ee01b3e8f353667fe03b2a93"}},{"ruleId":"D2","level":"warning","message":{"text":"mediaUrl.fetchProxyPort (cognitive 26): mediaUrl.fetchProxyPort has cognitive complexity 26 (threshold 15). Drivers by points: if/else 6 (16 pts), error handling 2 (6 pts), boolean chains 3, loops 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/lib/mediaUrl.ts"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"59d405829b975307eb65d176e0f3b2c5885bfa8320166c1ab43d7ddf2dddc865"}},{"ruleId":"D2","level":"warning","message":{"text":"ThemeProvider.ThemeProvider (cognitive 26): ThemeProvider.ThemeProvider has cognitive complexity 26 (threshold 15). Drivers by points: if/else 13 (15 pts), ternaries 6, boolean chains 4, error handling 1 (nesting depth added 2). Most of this is not in the body itself: 2 of the 26 points are its own statements and the rest belongs to 15 function literals inside it that branch (lines 678, 537, 555, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/theme/ThemeProvider.tsx"},"region":{"startLine":480}}}],"partialFingerprints":{"codehealthFindingId/v1":"477d5f377d3863c72cf0defe09e17fd9c279afbf4ab7bc9f03130f502a3397b6"}},{"ruleId":"D2","level":"warning","message":{"text":"CommunityThemeController.CommunityThemeController (cognitive 26): CommunityThemeController.CommunityThemeController has cognitive complexity 26 (threshold 15). Drivers by points: if/else 22, boolean chains 4. Most of this is not in the body itself: 0 of the 26 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 189, 96, 115, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/theme/CommunityThemeController.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"65f85776ebc60f55878c63aaab8f8ed5c532c1cedabb58c592447f518c76c197"}},{"ruleId":"D2","level":"warning","message":{"text":"compact-link-preview-attachment.CompactLinkPreviewAttachment (cognitive 26): compact-link-preview-attachment.CompactLinkPreviewAttachment has cognitive complexity 26 (threshold 15). Drivers by points: ternaries 15 (22 pts), boolean chains 4 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/compact-link-preview-attachment.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"356943dc7cbccd32a935abef3d2b215d5c1e16d4af7de013a17e027757e00b84"}},{"ruleId":"D2","level":"warning","message":{"text":"entityLinks.EntityMetadataTooltip (cognitive 26): entityLinks.EntityMetadataTooltip has cognitive complexity 26 (threshold 15). Drivers by points: ternaries 11 (18 pts), boolean chains 7, if/else 1 (nesting depth added 7). Of this number, 25 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/markdown/entityLinks.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2a14025628857e05a0f0352cdf45fd403bf3e7d8e99dce38503b58dbe1cdeb2"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::relay::drain_commands (cognitive 25): buzz_acp::relay::drain_commands has cognitive complexity 25 (threshold 15). Drivers by points: if/else 6 (13 pts), match/switch 4 (10 pts), boolean chains 1, 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/buzz-acp/src/relay.rs"},"region":{"startLine":2973}}}],"partialFingerprints":{"codehealthFindingId/v1":"a69a3d6e3f744250df044aa7c360183e005cb829a221a293c0f0d85e99fa516f"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_core::engram::extract_refs (cognitive 25): buzz_core::engram::extract_refs has cognitive complexity 25 (threshold 15). Drivers by points: if/else 5 (17 pts), boolean chains 4, loops 2 (4 pts) (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-core/src/engram.rs"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"687e63de0d0df2f8b5f53f55300e7946b08b49e8203a2bf537898ded1b621b12"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_db::store::thread::get_thread_replies_on (cognitive 25): buzz_db::store::thread::get_thread_replies_on has cognitive complexity 25 (threshold 15). Drivers by points: if/else 7 (13 pts), match/switch 4 (8 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/thread.rs"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdebf70687a830a48ca1a352bcd853e6f95874e07c783b4675afdb9430920384"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_push_gateway::app_attest::verify_attestation_environment (cognitive 25): buzz_push_gateway::app_attest::verify_attestation_environment has cognitive complexity 25 (threshold 15). Drivers by points: if/else 5 (9 pts), loops 3 (9 pts), match/switch 3 (7 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/buzz-push-gateway/src/app_attest.rs"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"acaadf6d8cc0ab4a8574beadfaf13edd1a29d1a254301378f16d4d64868375b8"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::mesh_boot::run_demo_echo (cognitive 25): buzz_relay::mesh_boot::run_demo_echo has cognitive complexity 25 (threshold 15). Drivers by points: if/else 7 (20 pts), match/switch 2 (4 pts), loops 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/mesh_boot.rs"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba10f8f2f6d2868c688b8d359de25103502a9b79a1885696b898e8d9da6e9b19"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::push_runtime::match_job (cognitive 25): buzz_relay::push_runtime::match_job has cognitive complexity 25 (threshold 15). Drivers by points: if/else 8 (20 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/push_runtime.rs"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7e6c719566f564c25f009e7d205d19ba05b05fe02dc409fff087aa1d4def93b"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::push_runtime::deliver_one (cognitive 25): buzz_relay::push_runtime::deliver_one has cognitive complexity 25 (threshold 15). Drivers by points: match/switch 11 (15 pts), if/else 6 (8 pts), boolean chains 2 (nesting depth added 6). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/push_runtime.rs"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"4663eda809e41509a360a4347d0371a8afc97bb52b8818624a96241394bf957d"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::config_bridge::schema_walker::extract_config_fields (cognitive 25): buzz_desktop::managed_agents::config_bridge::schema_walker::extract_config_fields has cognitive complexity 25 (threshold 15). Drivers by points: loops 3 (10 pts), if/else 3 (8 pts), match/switch 3 (7 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":"desktop/src-tauri/src/managed_agents/config_bridge/schema_walker.rs"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"b08cc534942fded414a6518a13886088ca95053ca22f887084d4764624c688aa"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::media::is_animated_image (cognitive 25): buzz_desktop::commands::media::is_animated_image has cognitive complexity 25 (threshold 15). Drivers by points: if/else 6 (18 pts), loops 2 (4 pts), boolean chains 2, match/switch 1 (nesting depth added 14). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/media.rs"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"5db30b46fc70185da79bdb00f450266c76d333c91c54482aa16dd7e9fefa0163"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::relay::profile_avatar::localize_avatar (cognitive 25): buzz_desktop::relay::profile_avatar::localize_avatar has cognitive complexity 25 (threshold 15). Drivers by points: if/else 17 (22 pts), boolean chains 2, loops 1 (nesting depth added 5). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/relay/profile_avatar.rs"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0610be5c64f2571fbbd3850765026ed70914e9eb3136883d87d8b6aecd76c2d"}},{"ruleId":"D2","level":"warning","message":{"text":"exhaustive.enabled_transitions (cognitive 25): exhaustive.enabled_transitions has cognitive complexity 25 (threshold 15). Drivers by points: if/else 6 (19 pts), loops 4 (6 pts) (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/formal/nip-rs-unread/exhaustive.py"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"546d4677932ac1e4e1dc3556517308355e173cd90dde7b87b72aab96157deeb1"}},{"ruleId":"D2","level":"warning","message":{"text":"BuzzPushPresentationCacheStore.updateProfiles (cognitive 25): BuzzPushPresentationCacheStore.updateProfiles has cognitive complexity 25 (threshold 15). Drivers by points: if/else 7 (11 pts), boolean chains 9, ternaries 2 (4 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":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushPresentationCache.swift"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"df80b0f634c59658438a64ebb7d6db772e96da95bd6771b57010687730a64919"}},{"ruleId":"D2","level":"warning","message":{"text":"HuddleSessionNotifier.join (cognitive 25): HuddleSessionNotifier.join has cognitive complexity 25 (threshold 15). Drivers by points: if/else 12 (20 pts), boolean chains 2, ternaries 1 (2 pts), error handling 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":"mobile/lib/shared/huddle/huddle_session.dart"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"f514ff7fa739f61f5f90aea0041a3bdddcbd169732053d7e7384f015c1ccddae"}},{"ruleId":"D2","level":"warning","message":{"text":"HuddleSessionNotifier._drainPlayback (cognitive 25): HuddleSessionNotifier._drainPlayback has cognitive complexity 25 (threshold 15). Drivers by points: if/else 4 (12 pts), ternaries 2 (6 pts), loops 2 (5 pts), boolean chains 1, error handling 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":"mobile/lib/shared/huddle/huddle_session.dart"},"region":{"startLine":515}}}],"partialFingerprints":{"codehealthFindingId/v1":"abfc6129319531687f4988e6c3066673efe0bc445944f1e74438f04c17ff9b88"}},{"ruleId":"D2","level":"warning","message":{"text":"UserCacheNotifier._flushPending (cognitive 25): UserCacheNotifier._flushPending has cognitive complexity 25 (threshold 15). Drivers by points: if/else 8 (20 pts), boolean chains 2, loops 1 (2 pts), error handling 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":"mobile/lib/shared/profile/user_cache_provider.dart"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e911406431360087afced7457cfae41dcf008e329d1eb6d96307a1ad70c61dd"}},{"ruleId":"D2","level":"warning","message":{"text":"BuzzPushLeaseDescriptor.fromRelayInformation (cognitive 25): BuzzPushLeaseDescriptor.fromRelayInformation has cognitive complexity 25 (threshold 15). Drivers by points: if/else 14 (20 pts), loops 3, 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":"mobile/lib/shared/push/dev_push_lease.dart"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ae9463edfc048685acdc927c2224f59491ba9aadf58286dc76f814e9042ad83"}},{"ruleId":"D2","level":"warning","message":{"text":"AddChannelBotDialog.AddChannelBotDialog (cognitive 25): AddChannelBotDialog.AddChannelBotDialog has cognitive complexity 25 (threshold 15). Drivers by points: ternaries 10 (12 pts), if/else 6 (7 pts), boolean chains 5, error handling 1 (nesting depth added 3). Of this number, 23 points are the body\u0027s own statements and 2 belong to 2 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/AddChannelBotDialog.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee0665ccee3279c418b9f71b79264f4d4a05782d3b53bbd29797fa2fa38125b3"}},{"ruleId":"D2","level":"warning","message":{"text":"communityUnreadObserver.fetchCommunityUnread (cognitive 25): communityUnreadObserver.fetchCommunityUnread has cognitive complexity 25 (threshold 15). Drivers by points: if/else 7 (13 pts), boolean chains 5, ternaries 2 (4 pts), error handling 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":"desktop/src/features/communities/communityUnreadObserver.ts"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"d77a3ed68225dcef834ebc33d2d500dcb6a16171a495a995694957985b652e4d"}},{"ruleId":"D2","level":"warning","message":{"text":"CommunityMembersSettingsCard.RelayMemberRow (cognitive 25): CommunityMembersSettingsCard.RelayMemberRow has cognitive complexity 25 (threshold 15). Drivers by points: ternaries 11 (16 pts), boolean chains 8, error handling 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/community-members/ui/CommunityMembersSettingsCard.tsx"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7c2470f2deb4f9b32f36c439f3a6cbe5f8f56736c1ae3ce5032b5beb1e78b74"}},{"ruleId":"D2","level":"warning","message":{"text":"LocalArchiveSettingsCard.LocalArchiveSettingsCard (cognitive 25): LocalArchiveSettingsCard.LocalArchiveSettingsCard has cognitive complexity 25 (threshold 15). Drivers by points: ternaries 8 (12 pts), if/else 6, error handling 4, boolean chains 2, loops 1 (nesting depth added 4). Most of this is not in the body itself: 4 of the 25 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 460, 490, 432, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/local-archive/ui/LocalArchiveSettingsCard.tsx"},"region":{"startLine":391}}}],"partialFingerprints":{"codehealthFindingId/v1":"388a872b81a3d99da2b353f601f4254af2dea46cbae03385e22e860651fe9a58"}},{"ruleId":"D2","level":"warning","message":{"text":"useEnsureAgentMentionsReady.useEnsureAgentMentionsReady (cognitive 25): useEnsureAgentMentionsReady.useEnsureAgentMentionsReady has cognitive complexity 25 (threshold 15). Drivers by points: if/else 8 (15 pts), boolean chains 4, error handling 1 (2 pts), loops 2, ternaries 1 (2 pts) (nesting depth added 9). Most of this is not in the body itself: 0 of the 25 points are its own statements and the rest belongs to one function literal inside it that branches (line 74). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useEnsureAgentMentionsReady.ts"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"f93cd8275de285cc1890da8cb69a03463c4d2b49ada3724ad8abf9d70831a199"}},{"ruleId":"D2","level":"warning","message":{"text":"useAutoPinMentionedAgents.useAutoPinMentionedAgents (cognitive 25): useAutoPinMentionedAgents.useAutoPinMentionedAgents has cognitive complexity 25 (threshold 15). Drivers by points: if/else 12, boolean chains 6, ternaries 5 (6 pts), loops 1 (nesting depth added 1). Most of this is not in the body itself: 2 of the 25 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 138, 92, 65, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useAutoPinMentionedAgents.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"997cff540a26f0fa5af90f6f1552144dcd10970c48d3c1a9300f4e1cde59a954"}},{"ruleId":"D2","level":"warning","message":{"text":"UserProfileAgentActions.UserProfileAgentSettingsMenu (cognitive 25): UserProfileAgentActions.UserProfileAgentSettingsMenu has cognitive complexity 25 (threshold 15). Drivers by points: ternaries 11 (16 pts), boolean chains 8, if/else 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":"desktop/src/features/profile/ui/UserProfileAgentActions.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"309d4a393a2dfcc56ac2a967e9a80944cd62e98c67c93a65844acf25a1272dab"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectRepositoryPanel.repositoryEntries (cognitive 25): ProjectRepositoryPanel.repositoryEntries has cognitive complexity 25 (threshold 15). Drivers by points: if/else 7 (15 pts), ternaries 4 (8 pts), boolean chains 1, loops 1 (nesting depth added 12). Of this number, 22 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectRepositoryPanel.tsx"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"311624ee01b1f2a07d506fb3e4f3471c476283e62d35f5314bf87f94af73119f"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectHomeWorkspaceSheet.ProjectHomeWorkspaceSheet (cognitive 25): ProjectHomeWorkspaceSheet.ProjectHomeWorkspaceSheet has cognitive complexity 25 (threshold 15). Drivers by points: boolean chains 10, if/else 9, ternaries 4 (5 pts), match/switch 1 (nesting depth added 1). Most of this is not in the body itself: 9 of the 25 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 215, 272, 189, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectHomeWorkspaceSheet.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fb57c5a491db7f62a3e681363e31641aabd8a574acc9ebcd99bcbade724c854"}},{"ruleId":"D2","level":"warning","message":{"text":"EncryptedBackupProvider.EncryptedBackupProvider (cognitive 25): EncryptedBackupProvider.EncryptedBackupProvider has cognitive complexity 25 (threshold 15). Drivers by points: if/else 14 (15 pts), ternaries 4 (6 pts), boolean chains 3, error handling 1 (nesting depth added 3). Most of this is not in the body itself: 0 of the 25 points are its own statements and the rest belongs to 11 function literals inside it that branch (lines 158, 115, 81, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/EncryptedBackupProvider.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe1ade162ab3eeb4787dc00c6959e60e6539c4c282cdb6f945188479808fd7e5"}},{"ruleId":"D2","level":"warning","message":{"text":"SendFeedbackDialog.SendFeedbackDialog (cognitive 25): SendFeedbackDialog.SendFeedbackDialog has cognitive complexity 25 (threshold 15). Drivers by points: ternaries 12 (15 pts), boolean chains 4, if/else 4, error handling 2 (nesting depth added 3). Of this number, 21 points are the body\u0027s own statements and 4 belong to 2 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/SendFeedbackDialog.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"42d2ceca40c7255ab81582239dd6fb1fbfc4ffb8675af990599e73cbb5007faa"}},{"ruleId":"D2","level":"warning","message":{"text":"workflowConditionExpression.parseConditionExpression (cognitive 25): workflowConditionExpression.parseConditionExpression has cognitive complexity 25 (threshold 15). Drivers by points: ternaries 7 (17 pts), if/else 4 (5 pts), boolean chains 3 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/workflowConditionExpression.ts"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"e95cd2527c949801f87aa37546da1340d872f0cd847994ff7c0504fc7b312b57"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::setup_mode::run_setup_listener (cognitive 24): buzz_acp::setup_mode::run_setup_listener has cognitive complexity 24 (threshold 15). Drivers by points: if/else 12 (20 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/buzz-acp/src/setup_mode.rs"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"6511f7382fa18963802623596d01fed14bb6731b8de2d5f986e2b168afbafefe"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_db::store::push::accept_lease_event (cognitive 24): buzz_db::store::push::accept_lease_event has cognitive complexity 24 (threshold 15). Drivers by points: if/else 14 (21 pts), boolean chains 3 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/push.rs"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfb7bf6ea2f5216a0e9d448661d0e70f7c6185dbd3f66275a780ed621c0a7f06"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_deletion::execute_stage (cognitive 24): buzz_deletion::execute_stage has cognitive complexity 24 (threshold 15). Drivers by points: if/else 6 (12 pts), match/switch 4 (7 pts), loops 2 (4 pts), boolean chains 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-deletion/src/lib.rs"},"region":{"startLine":1193}}}],"partialFingerprints":{"codehealthFindingId/v1":"0851696d01ada1d687c8e28eaa0dc7ebc12375b487315ecd81b515f37bbc1c64"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_media::validation::validate_mp4_metadata_free::walk (cognitive 24): buzz_media::validation::validate_mp4_metadata_free::walk has cognitive complexity 24 (threshold 15). Drivers by points: if/else 11 (20 pts), boolean chains 3, loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-media/src/validation.rs"},"region":{"startLine":879}}}],"partialFingerprints":{"codehealthFindingId/v1":"d950fc28c870ef9c97f4cda8906b06dcadcc4dae4ebe2abee3467dbbeb21002f"}},{"ruleId":"D2","level":"warning","message":{"text":"SubscriptionRegistry::register_with_scope (cognitive 24): SubscriptionRegistry::register_with_scope has cognitive complexity 24 (threshold 15). Drivers by points: loops 4 (13 pts), match/switch 2 (6 pts), if/else 4 (5 pts) (nesting depth added 14). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/subscription.rs"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8f9f01516283d01f2f16bbe2040143cc5dc25e208e50993577ca53cd3157194"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::event::handle_event (cognitive 24): buzz_relay::handlers::event::handle_event has cognitive complexity 24 (threshold 15). Drivers by points: match/switch 6 (11 pts), if/else 7 (10 pts), boolean chains 3 (nesting depth added 8). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/event.rs"},"region":{"startLine":608}}}],"partialFingerprints":{"codehealthFindingId/v1":"be03ca02ebe571f53ff334d2fcd7a3833c42071586497e99af9fcb295ebc93ef"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::push_runtime::process_match_batch (cognitive 24): buzz_relay::push_runtime::process_match_batch has cognitive complexity 24 (threshold 15). Drivers by points: if/else 7 (12 pts), match/switch 4 (7 pts), loops 3 (5 pts) (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/push_runtime.rs"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"f880b4f56dff6fbfa7e53c4ea39c5ff983e65f2479307c7fdd8724da00a78a2e"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::router::build_router (cognitive 24): buzz_relay::router::build_router has cognitive complexity 24 (threshold 15). Drivers by points: if/else 9 (23 pts), boolean chains 1 (nesting depth added 14). 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/buzz-relay/src/router.rs"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"39b0196d012a14a6c147ca840ee22990b5733bf0a4309df48076066b8f520fe2"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::huddle::tts_speaker_cancellation::spawn_tts_monitor (cognitive 24): buzz_desktop::huddle::tts_speaker_cancellation::spawn_tts_monitor has cognitive complexity 24 (threshold 15). Drivers by points: if/else 7 (21 pts), boolean chains 2, loops 1 (nesting depth added 14). 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":"desktop/src-tauri/src/huddle/tts_speaker_cancellation.rs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6b06d7de2c347b82a29958290ed5e68d794229adaa51b2de8dc09c9caec7641"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::personas::card::extract_card_output (cognitive 24): buzz_desktop::commands::personas::card::extract_card_output has cognitive complexity 24 (threshold 15). Drivers by points: if/else 4 (17 pts), loops 2 (5 pts), match/switch 1 (2 pts) (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/personas/card.rs"},"region":{"startLine":397}}}],"partialFingerprints":{"codehealthFindingId/v1":"45c17149d9f63ae19fa8d8b01cf6a7b2a7b416953e99af445952c6ccaff86d15"}},{"ruleId":"D2","level":"warning","message":{"text":"ComposeDraft.fromJson (cognitive 24): ComposeDraft.fromJson has cognitive complexity 24 (threshold 15). Drivers by points: if/else 7 (11 pts), ternaries 3 (6 pts), boolean chains 4, loops 1 (3 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/activity/compose_drafts_provider.dart"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"599fc78b8d106156bab5b754192b88d9b493ce9cd37e85bc1ca61240e4b1cdd8"}},{"ruleId":"D2","level":"warning","message":{"text":"ProfileTextEditSheet.build (cognitive 24): ProfileTextEditSheet.build has cognitive complexity 24 (threshold 15). Drivers by points: if/else 7 (11 pts), ternaries 9, boolean chains 2, error handling 2 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/profile/profile_text_edit_sheet.dart"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"cae905160754f8e4151b5752f3110e8d8505906edb311fd2433bceab130b99fa"}},{"ruleId":"D2","level":"warning","message":{"text":"UserStatusCacheNotifier._fetchStatuses (cognitive 24): UserStatusCacheNotifier._fetchStatuses has cognitive complexity 24 (threshold 15). Drivers by points: if/else 4 (12 pts), boolean chains 4, loops 2 (4 pts), ternaries 1 (3 pts), error handling 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":"mobile/lib/features/profile/user_status_cache_provider.dart"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3d065bbbd219d07cb67926007acfeb8c1d1bc13d6c7a0bee3ae5dc005c82ffb"}},{"ruleId":"D2","level":"warning","message":{"text":"_ConnectionSection.build (cognitive 24): _ConnectionSection.build has cognitive complexity 24 (threshold 15). Drivers by points: if/else 8 (22 pts), boolean chains 2 (nesting depth added 14). 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":"mobile/lib/features/settings/settings_page/connection_section.dart"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6eb0c083c92a3183a466953879086506337f5e29796fb3dda82a96cae98728b"}},{"ruleId":"D2","level":"warning","message":{"text":"FrostedAppBar.build (cognitive 24): FrostedAppBar.build has cognitive complexity 24 (threshold 15). Drivers by points: ternaries 16, boolean chains 7, if/else 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":"mobile/lib/shared/widgets/frosted_app_bar.dart"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca23d58e78134c8788a08834eebcf0534e277f393a87caf08ef899d9208fc9cb"}},{"ruleId":"D2","level":"warning","message":{"text":"useChannelPaneHandlers.useChannelPaneHandlers (cognitive 24): useChannelPaneHandlers.useChannelPaneHandlers has cognitive complexity 24 (threshold 15). Drivers by points: if/else 15 (16 pts), boolean chains 4, loops 1 (2 pts), ternaries 2 (nesting depth added 2). Most of this is not in the body itself: 0 of the 24 points are its own statements and the rest belongs to 11 function literals inside it that branch (lines 346, 174, 217, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/useChannelPaneHandlers.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1594df22d49f1f0d2069951d1edb51bc69c7da59ee75c5b072dac2331db0ac1"}},{"ruleId":"D2","level":"warning","message":{"text":"ComposerAddressControls.ComposerMentionButton (cognitive 24): ComposerAddressControls.ComposerMentionButton has cognitive complexity 24 (threshold 15). Drivers by points: ternaries 14 (21 pts), if/else 3 (nesting depth added 7). Of this number, 12 points are the body\u0027s own statements and 12 belong to 4 function literals 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":"desktop/src/features/messages/ui/ComposerAddressControls.tsx"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b2d89f36cdfccc16ef002d7a49943fb7414277bb5edc068db0348643b681979"}},{"ruleId":"D2","level":"warning","message":{"text":"hooks.useNotificationSettings (cognitive 24): hooks.useNotificationSettings has cognitive complexity 24 (threshold 15). Drivers by points: if/else 9 (12 pts), boolean chains 4, ternaries 2 (4 pts), loops 2 (3 pts), error handling 1 (nesting depth added 6). Most of this is not in the body itself: 0 of the 24 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 315, 245, 236, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/notifications/hooks.ts"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"79ba99ecc71615a6845ccf9cc53a8a3009d741b7d235053e982f2ae07f18f1cd"}},{"ruleId":"D2","level":"warning","message":{"text":"NsecMaskedDisplay.NsecMaskedDisplay (cognitive 24): NsecMaskedDisplay.NsecMaskedDisplay has cognitive complexity 24 (threshold 15). Drivers by points: ternaries 16 (21 pts), if/else 3 (nesting depth added 5). Of this number, 23 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. 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":"desktop/src/features/onboarding/ui/NsecMaskedDisplay.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"94a2b43b31baebb407e306f64837a957f15933151f6f68c44f2943a9fc17df93"}},{"ruleId":"D2","level":"warning","message":{"text":"ProfileStep.ProfileStep (cognitive 24): ProfileStep.ProfileStep has cognitive complexity 24 (threshold 15). Drivers by points: ternaries 11 (15 pts), boolean chains 5, if/else 2 (4 pts) (nesting depth added 6). Of this number, 18 points are the body\u0027s own statements and 6 belong to 2 function literals 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":"desktop/src/features/onboarding/ui/ProfileStep.tsx"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"3eccfa52bf7cfaa021dbb9fbb761d3dfb72ff61a6e841101b923a55f8bb8861a"}},{"ruleId":"D2","level":"warning","message":{"text":"RepositoryCards.RepositoryHostIcon (cognitive 24): RepositoryCards.RepositoryHostIcon has cognitive complexity 24 (threshold 15). Drivers by points: ternaries 10 (23 pts), boolean chains 1 (nesting depth added 13). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/RepositoryCards.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a92419b27a7310f61836f8867c0e42d14429283a3da923fcb216019f1c31b9a"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentSnapshotCard.AgentSnapshotCard (cognitive 24): AgentSnapshotCard.AgentSnapshotCard has cognitive complexity 24 (threshold 15). Drivers by points: ternaries 15 (21 pts), boolean chains 1, error handling 1, if/else 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":"desktop/src/shared/ui/markdown/AgentSnapshotCard.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4812d9357439e4d2ab721cb3280e56209044897334142eb7d1a245d787c5542"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::pool::parse_nostr_thread_response_with_meta (cognitive 23): buzz_acp::pool::parse_nostr_thread_response_with_meta has cognitive complexity 23 (threshold 15). Drivers by points: if/else 13 (20 pts), boolean chains 2, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/pool.rs"},"region":{"startLine":4629}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc02f5a0a19435843a7cc4213570f193d993f587d91846f23838701f4237bd26"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::side_effects::handle_git_repo_announcement_inner (cognitive 23): buzz_relay::handlers::side_effects::handle_git_repo_announcement_inner has cognitive complexity 23 (threshold 15). Drivers by points: if/else 14 (20 pts), match/switch 2 (3 pts) (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/side_effects.rs"},"region":{"startLine":2691}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b8319e02df1f2ac6543fb1954578de3f2c0c6a55ac1aaa1914a26c79c723adc"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::req::extract_channel_id_from_filters (cognitive 23): buzz_relay::handlers::req::extract_channel_id_from_filters has cognitive complexity 23 (threshold 15). Drivers by points: if/else 3 (10 pts), loops 3 (7 pts), match/switch 1 (6 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/buzz-relay/src/handlers/req.rs"},"region":{"startLine":1289}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f610fc4117e4cffa28e8a9f15b9c6628ed4a329b656027f597ec3b6bba79ac3"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::huddle::relay_api::run_tts_audio_publisher (cognitive 23): buzz_desktop::huddle::relay_api::run_tts_audio_publisher has cognitive complexity 23 (threshold 15). Drivers by points: if/else 5 (13 pts), match/switch 2 (5 pts), loops 2 (4 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":"desktop/src-tauri/src/huddle/relay_api.rs"},"region":{"startLine":359}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5f2c00e5d06ab4e2e8d7abec9923cbb8013ef0d954db6453c0ed52adf037117"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::project_git_diff::local_diff_range (cognitive 23): buzz_desktop::commands::project_git_diff::local_diff_range has cognitive complexity 23 (threshold 15). Drivers by points: if/else 11 (21 pts), boolean chains 2 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/project_git_diff.rs"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"36db980f5ba3a99928a3ab80ddac466efb8fac748d45c3d9171de289da10f4e8"}},{"ruleId":"D2","level":"warning","message":{"text":"AndroidMediaSanitizer.scrubJpeg (cognitive 23): AndroidMediaSanitizer.scrubJpeg has cognitive complexity 23 (threshold 15). Drivers by points: if/else 6 (13 pts), boolean chains 7, loops 2 (3 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/android/app/src/main/kotlin/xyz/block/buzz/mobile/AndroidMediaSanitizer.kt"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"f86554272e6613e0aaf495b342af6279275ec6ebb2780b17aa987719a74ff732"}},{"ruleId":"D2","level":"warning","message":{"text":"desktop_release.previous_release (cognitive 23): desktop_release.previous_release has cognitive complexity 23 (threshold 15). Drivers by points: if/else 10 (11 pts), boolean chains 10, error handling 1, ternaries 1 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/desktop_release.py"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b65171fab06fb7457f384e77b59d7198818490fbd3540ad45f84006c03f43b4"}},{"ruleId":"D2","level":"warning","message":{"text":"NativeAttachmentPopoverViewController.configureAndStartCamera (cognitive 23): NativeAttachmentPopoverViewController.configureAndStartCamera has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (20 pts), boolean chains 2, error handling 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":"mobile/ios/Runner/NativeAttachmentPopover.swift"},"region":{"startLine":660}}}],"partialFingerprints":{"codehealthFindingId/v1":"68dc889c4847a2a464a22a2fc7e456130c92c8728afc0c4de473e189225313e8"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelMessagesNotifier.cachedThreadReplyIds (cognitive 23): ChannelMessagesNotifier.cachedThreadReplyIds has cognitive complexity 23 (threshold 15). Drivers by points: if/else 5 (11 pts), loops 5 (7 pts), boolean chains 5 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_messages_provider.dart"},"region":{"startLine":536}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc7a3b8d55135d3cd39779744b4774e1fc804903ff5db9e8ef6b7aa5d5390b0e"}},{"ruleId":"D2","level":"warning","message":{"text":"_IOSAttachmentPopoverCoordinator.present (cognitive 23): _IOSAttachmentPopoverCoordinator.present has cognitive complexity 23 (threshold 15). Drivers by points: if/else 11 (20 pts), boolean chains 2, error handling 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":"mobile/lib/features/channels/compose_bar/ios_attachment_popover.dart"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"59d8f1be9ec55002b0dbce8effb3e939e2c51c1c1e3de8f5f1a0fb67290dcf9b"}},{"ruleId":"D2","level":"warning","message":{"text":"_SetStatusSheet.build (cognitive 23): _SetStatusSheet.build has cognitive complexity 23 (threshold 15). Drivers by points: if/else 10 (12 pts), boolean chains 5, ternaries 3 (4 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":"mobile/lib/features/profile/set_status_sheet.dart"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3c302b26705199f47682ad1501e9eddbed6cb0f882b2145fdfc679b5e76db6e"}},{"ruleId":"D2","level":"warning","message":{"text":"useAppNavigation.useAppNavigation (cognitive 23): useAppNavigation.useAppNavigation has cognitive complexity 23 (threshold 15). Drivers by points: ternaries 17, if/else 5, boolean chains 1. Most of this is not in the body itself: 0 of the 23 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 131, 264, 31, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/app/navigation/useAppNavigation.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"f22a79337cf61bf8123a5964c453326dd9f1e0a6922c848c7fac1e08631d4098"}},{"ruleId":"D2","level":"warning","message":{"text":"agentSessionToolClassifier.findBuzzCommand (cognitive 23): agentSessionToolClassifier.findBuzzCommand has cognitive complexity 23 (threshold 15). Drivers by points: if/else 6 (18 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/agentSessionToolClassifier.ts"},"region":{"startLine":487}}}],"partialFingerprints":{"codehealthFindingId/v1":"96ffc56b0357c2379cccff686bef8118787b88ca3475c658d26ac7aa9349ed2e"}},{"ruleId":"D2","level":"warning","message":{"text":"observerRelayStore.processLiveObserverEvents (cognitive 23): observerRelayStore.processLiveObserverEvents has cognitive complexity 23 (threshold 15). Drivers by points: if/else 8 (14 pts), loops 3 (7 pts), boolean chains 2 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/observerRelayStore.ts"},"region":{"startLine":470}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff89b461ca60932d4da5018f54ec4f07e60dd26bc7a56bcf689587e2d07b0571"}},{"ruleId":"D2","level":"warning","message":{"text":"EnvVarsEditor.EnvVarsEditor (cognitive 23): EnvVarsEditor.EnvVarsEditor has cognitive complexity 23 (threshold 15). Drivers by points: if/else 10, ternaries 9, boolean chains 4. Most of this is not in the body itself: 3 of the 23 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 288, 545, 258, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/EnvVarsEditor.tsx"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9c5d83018ccc7c001f58dbb7414a8a41f711963a4b72e240cbcbf651ad74e77"}},{"ruleId":"D2","level":"warning","message":{"text":"EditAgentAdvancedFields.EditAgentAdvancedFields (cognitive 23): EditAgentAdvancedFields.EditAgentAdvancedFields has cognitive complexity 23 (threshold 15). Drivers by points: ternaries 10 (13 pts), if/else 6 (8 pts), boolean chains 2 (nesting depth added 5). Of this number, 12 points are the body\u0027s own statements and 11 belong to 5 function literals 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":"desktop/src/features/agents/ui/EditAgentAdvancedFields.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"273e001d928b995e179fdd72925b26b4bc7d10da19bbd89919e64749eb3c3d11"}},{"ruleId":"D2","level":"warning","message":{"text":"useCommunityUnread.useCommunityUnread (cognitive 23): useCommunityUnread.useCommunityUnread has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (15 pts), error handling 2 (3 pts), loops 2 (3 pts), boolean chains 1, ternaries 1 (nesting depth added 8). Most of this is not in the body itself: 0 of the 23 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 113, 164, 73, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/communities/useCommunityUnread.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"5260d54ef7d5baf5c55ba7b777e5de34d89a01fbf96b6ad189b37b6539b20df6"}},{"ruleId":"D2","level":"warning","message":{"text":"MessageActionBar.MessageActionBar (cognitive 23): MessageActionBar.MessageActionBar has cognitive complexity 23 (threshold 15). Drivers by points: ternaries 9 (11 pts), boolean chains 8, if/else 4 (nesting depth added 2). Of this number, 17 points are the body\u0027s own statements and 6 belong to 4 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/MessageActionBar.tsx"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"956054b8502c40911bf4db8aba1a1b4ba84a836be87eda66e4990e8b11199f06"}},{"ruleId":"D2","level":"warning","message":{"text":"useNonMemberInvite.useNonMemberInvite (cognitive 23): useNonMemberInvite.useNonMemberInvite has cognitive complexity 23 (threshold 15). Drivers by points: if/else 11 (13 pts), boolean chains 7, ternaries 1 (2 pts), loops 1 (nesting depth added 3). Most of this is not in the body itself: 0 of the 23 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 94, 60, 79, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useNonMemberInvite.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"e14518d57b70b26fe748ed9953171dd98ac1e15946bd751b291f5e0660c12f2e"}},{"ruleId":"D2","level":"warning","message":{"text":"MessageComposerToolbar.MessageComposerToolbar (cognitive 23): MessageComposerToolbar.MessageComposerToolbar has cognitive complexity 23 (threshold 15). Drivers by points: ternaries 10 (20 pts), boolean chains 3 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/MessageComposerToolbar.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"c34eecda10d5cb3da9185e662ace58772512141cbc73f9412ec20fc994b26c84"}},{"ruleId":"D2","level":"warning","message":{"text":"agentReadiness.resolveAgentReadiness (cognitive 23): agentReadiness.resolveAgentReadiness has cognitive complexity 23 (threshold 15). Drivers by points: if/else 8 (13 pts), boolean chains 7, loops 1 (2 pts), ternaries 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/agentReadiness.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"23fbc971c4b68a7e9484870f59950347716d54d49bd489f6e2b676d99d3fbcd3"}},{"ruleId":"D2","level":"warning","message":{"text":"AnimatedAvatarCameraControls.AnimatedAvatarCameraControls (cognitive 23): AnimatedAvatarCameraControls.AnimatedAvatarCameraControls has cognitive complexity 23 (threshold 15). Drivers by points: ternaries 10 (17 pts), boolean chains 6 (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":"desktop/src/features/profile/ui/AnimatedAvatarCameraControls.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"8aa37172b1854f1fffe738b8c6c279eb41ae3fda257781b02260046ed192e90b"}},{"ruleId":"D2","level":"warning","message":{"text":"UserProfilePanelPersonaSubmit.submitProfilePersonaDialog (cognitive 23): UserProfilePanelPersonaSubmit.submitProfilePersonaDialog has cognitive complexity 23 (threshold 15). Drivers by points: if/else 7 (11 pts), ternaries 4 (9 pts), error handling 2 (3 pts) (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/UserProfilePanelPersonaSubmit.ts"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"b12deaaa6f0199d391bf2efbf3b80bfebf0bd9e827b229836260f7452d4aa332"}},{"ruleId":"D2","level":"warning","message":{"text":"useProjectChannelRequests.useProjectChannelRequests (cognitive 23): useProjectChannelRequests.useProjectChannelRequests has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (10 pts), boolean chains 6, ternaries 4 (5 pts), error handling 1, loops 1 (nesting depth added 2). Of this number, 15 points are the body\u0027s own statements and 8 belong to 4 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/useProjectChannelRequests.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"c264544a43a0599f18097960d9ec170507e4c7befc390d863661a592887a09f9"}},{"ruleId":"D2","level":"warning","message":{"text":"terminalBannerColor.bannerStops (cognitive 23): terminalBannerColor.bannerStops has cognitive complexity 23 (threshold 15). Drivers by points: if/else 7 (14 pts), loops 5 (7 pts), ternaries 1 (2 pts) (nesting depth added 10). Most of this is not in the body itself: 10 of the 23 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 265, 303). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/terminal/terminalBannerColor.ts"},"region":{"startLine":249}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5feb051b7b9326610f6b69d76bf8b04454e231e1d50b5796f362204e896bca8"}},{"ruleId":"D2","level":"warning","message":{"text":"workflowConditionExpression.splitTopLevel (cognitive 23): workflowConditionExpression.splitTopLevel has cognitive complexity 23 (threshold 15). Drivers by points: if/else 12 (20 pts), boolean chains 2, 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":"desktop/src/features/workflows/ui/workflowConditionExpression.ts"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2ff876382ade2923b6881dae1056272d0e96133539c2058d64118a658424190"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowsView.WorkflowsView (cognitive 23): WorkflowsView.WorkflowsView has cognitive complexity 23 (threshold 15). Drivers by points: ternaries 8 (10 pts), boolean chains 6, if/else 5, error handling 1, loops 1 (nesting depth added 2). Most of this is not in the body itself: 8 of the 23 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 128, 221, 252, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/WorkflowsView.tsx"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"4754c84933c79eb4e19649b407559af494333458a8e5f38185c3a8a083931d30"}},{"ruleId":"D2","level":"warning","message":{"text":"RepoBlobViewer.RepoBlobPage (cognitive 23): RepoBlobViewer.RepoBlobPage has cognitive complexity 23 (threshold 15). Drivers by points: ternaries 8 (14 pts), boolean chains 8, if/else 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":"web/src/features/repos/ui/RepoBlobViewer.tsx"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0bae419f74630d03358e9dc742140a936e4d0aadfacc977694652ff3dbddb5c"}},{"ruleId":"D2","level":"warning","message":{"text":"eventToProjectPullRequest (cognitive 23): eventToProjectPullRequest has cognitive complexity 23 (threshold 15). Drivers by points: other 12, boolean chains 6, ternaries 5. Of this number, 14 points are the body\u0027s own statements and 9 belong to 2 function literals inside it that branch. 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":"desktop/src/features/projects/projectPullRequests.mjs"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"54a14f75e721109213f7f9ffdf9980b85c2ea692bad93f6b59b0ebf56878419b"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::acp::resolve_model_switch_method (cognitive 22): buzz_acp::acp::resolve_model_switch_method has cognitive complexity 22 (threshold 15). Drivers by points: if/else 5 (13 pts), loops 3 (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/buzz-acp/src/acp.rs"},"region":{"startLine":2271}}}],"partialFingerprints":{"codehealthFindingId/v1":"f42cb5d93bdd008d571d60c8592550630632a7b0da2a13837fb8cc51375e4364"}},{"ruleId":"D2","level":"warning","message":{"text":"RunCtx::execute_calls (cognitive 22): RunCtx::execute_calls has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (17 pts), loops 2 (4 pts), boolean chains 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/agent.rs"},"region":{"startLine":834}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd8ca914dd9122c39afb0971ce4794ec029318c2874598db894ed8e311b31eb1"}},{"ruleId":"D2","level":"warning","message":{"text":"McpRegistry::spawn_all (cognitive 22): McpRegistry::spawn_all has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (17 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/mcp.rs"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"75a429ba07fbf7671afcc506b42bf67e5c5f59153a489e803c60d6717046ddc3"}},{"ruleId":"D2","level":"warning","message":{"text":"RefPattern::parse (cognitive 22): RefPattern::parse has cognitive complexity 22 (threshold 15). Drivers by points: if/else 12 (19 pts), boolean chains 2, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-core/src/git_perms.rs"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"0db36295ea326c01bbecbb834776b9c027d606ee1b5c5590d2fc887f7a69d29f"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_dev_mcp::rg::fallback (cognitive 22): buzz_dev_mcp::rg::fallback has cognitive complexity 22 (threshold 15). Drivers by points: if/else 11 (17 pts), loops 2 (3 pts), match/switch 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/buzz-dev-mcp/src/rg.rs"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"804aa593dd6fd171c9239a18ad75fd712a0831cc1ce7478dbba0543b430eb725"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_media::validation::check_moov_before_mdat (cognitive 22): buzz_media::validation::check_moov_before_mdat has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (13 pts), match/switch 3 (7 pts), boolean chains 1, loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-media/src/validation.rs"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e693ac5d962fa8307315214157d2b88427114a0209049abf2aa7238f613aa39"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_media::validation::validate_webp_metadata_free (cognitive 22): buzz_media::validation::validate_webp_metadata_free has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (15 pts), boolean chains 3, loops 2, match/switch 1 (2 pts) (nesting depth added 7). Of this number, 14 points are the body\u0027s own statements and 8 belong to one function item inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-media/src/validation.rs"},"region":{"startLine":675}}}],"partialFingerprints":{"codehealthFindingId/v1":"e62ed78a73c9290b0a01e216afbfc6dad73f6e107204673c6c663938c96deab8"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::command_executor::handle_dm_open (cognitive 22): buzz_relay::handlers::command_executor::handle_dm_open has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (15 pts), loops 4 (6 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/buzz-relay/src/handlers/command_executor.rs"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"72b651c0ed7bb4a9674d6ac51e931cb550262462c7bb3fa9aec19d157e4298eb"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::connection::recv_loop (cognitive 22): buzz_relay::connection::recv_loop has cognitive complexity 22 (threshold 15). Drivers by points: if/else 4 (16 pts), match/switch 2 (5 pts), loops 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/connection.rs"},"region":{"startLine":765}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5eed12328ad031f9474b5d2763aee4801c5725c8d027bec71bf12cf0ac607f2"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::ingest::validate_link_preview_tags (cognitive 22): buzz_relay::handlers::ingest::validate_link_preview_tags has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (16 pts), boolean chains 3, loops 2 (3 pts) (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":368}}}],"partialFingerprints":{"codehealthFindingId/v1":"99854708d9944f20f31dc4bbc09ad83ec1e822687c45e2ec160a3eb922dd2fb0"}},{"ruleId":"D2","level":"warning","message":{"text":"AprilPocketTts::synth_chunk_streaming (cognitive 22): AprilPocketTts::synth_chunk_streaming has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (16 pts), boolean chains 3, loops 2 (3 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-voice/src/pocket_april.rs"},"region":{"startLine":476}}}],"partialFingerprints":{"codehealthFindingId/v1":"da5b4d3f8007826b32ec0cd2624e21144295562a597484f708f95131d52502c9"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_voice::imported::decode_media (cognitive 22): buzz_voice::imported::decode_media has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (14 pts), match/switch 2 (4 pts), loops 2 (3 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/buzz-voice/src/imported.rs"},"region":{"startLine":425}}}],"partialFingerprints":{"codehealthFindingId/v1":"01470770ec860bb279f903ecffa74457b68f9cf6c5f21143e8c2039b4d870f06"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::runtime::instance_reaper::reap_dead_instance_agents (cognitive 22): buzz_desktop::managed_agents::runtime::instance_reaper::reap_dead_instance_agents has cognitive complexity 22 (threshold 15). Drivers by points: if/else 10 (19 pts), loops 2, 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":"desktop/src-tauri/src/managed_agents/runtime/instance_reaper.rs"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9d6d6f11878f5712539a3218af9298319c6a620ce9c90e2b96d1553efe1d038"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::discovery::discover_acp_runtimes_from (cognitive 22): buzz_desktop::managed_agents::discovery::discover_acp_runtimes_from has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (14 pts), loops 3 (4 pts), match/switch 1 (3 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":"desktop/src-tauri/src/managed_agents/discovery.rs"},"region":{"startLine":1095}}}],"partialFingerprints":{"codehealthFindingId/v1":"706b115259c63add9121723a3d4c2be31222b59e81f513f8356654a2e437736a"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::persona_events::flush_pending_events_at (cognitive 22): buzz_desktop::managed_agents::persona_events::flush_pending_events_at has cognitive complexity 22 (threshold 15). Drivers by points: if/else 10 (20 pts), boolean chains 1, loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/persona_events.rs"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"18bcc08a51e8326a3eec3a9a23ff2fb2e67a6668c9b56ea212718fbd05a949b2"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::huddle::tts_voice_transition::retain_cancelled_text (cognitive 22): buzz_desktop::huddle::tts_voice_transition::retain_cancelled_text has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (16 pts), loops 3 (6 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":"desktop/src-tauri/src/huddle/tts_voice_transition.rs"},"region":{"startLine":413}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b6332a720d4197be6a06e875eb81c5fb418aab175be334125d9cc401e8e8ccd"}},{"ruleId":"D2","level":"warning","message":{"text":"_HuddleButton.build (cognitive 22): _HuddleButton.build has cognitive complexity 22 (threshold 15). Drivers by points: if/else 5 (8 pts), boolean chains 7, ternaries 5 (6 pts), error handling 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":"mobile/lib/features/channels/channel_detail_page/huddle_sheet.dart"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a8556efe0a5221e52ad87550c5fb08167b936fb5b30e46392f9f3fbd06c909d"}},{"ruleId":"D2","level":"warning","message":{"text":"_MobileHuddleCallPage.build (cognitive 22): _MobileHuddleCallPage.build has cognitive complexity 22 (threshold 15). Drivers by points: if/else 6 (9 pts), boolean chains 7, ternaries 3, loops 2, 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":"mobile/lib/features/channels/channel_detail_page/huddle_sheet.dart"},"region":{"startLine":539}}}],"partialFingerprints":{"codehealthFindingId/v1":"23940756cf0b70145cd60f95b99e60db42703fbd3847841b340861942d13680e"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelMessagesNotifier._pruneOffWindowReplies (cognitive 22): ChannelMessagesNotifier._pruneOffWindowReplies has cognitive complexity 22 (threshold 15). Drivers by points: loops 6 (9 pts), if/else 3 (8 pts), boolean chains 5 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_messages_provider.dart"},"region":{"startLine":610}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cec6f382518b4129f92cdc93d73d61bd3884fe1809d5822dc2ea3649a4658b8"}},{"ruleId":"D2","level":"warning","message":{"text":"MessageContent.build (cognitive 22): MessageContent.build has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (8 pts), loops 5 (7 pts), ternaries 6, boolean chains 1 (nesting depth added 3). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/message_content.dart"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d5528b26042107ff5932c457ac5c4fa0e476cc2e89c901b66eef6614a6554d3"}},{"ruleId":"D2","level":"warning","message":{"text":"PairingPage.build (cognitive 22): PairingPage.build has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (11 pts), ternaries 6, boolean chains 5 (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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/pairing/pairing_page.dart"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"f621c57211aec0647669c9b701da53c28cd1b613d3d0604ce348d16cc78d3d47"}},{"ruleId":"D2","level":"warning","message":{"text":"agentSessionToolClassifier.tokenizeShellCommand (cognitive 22): agentSessionToolClassifier.tokenizeShellCommand has cognitive complexity 22 (threshold 15). Drivers by points: if/else 10 (18 pts), boolean chains 3, loops 1 (nesting depth added 8). Of this number, 21 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/agentSessionToolClassifier.ts"},"region":{"startLine":513}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6c665d17528ce172c56326511fcaf9240b2fee37e21b0f5e0cd2ea1459937e4"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentConfigPanel.AgentConfigSurfaceRows (cognitive 22): AgentConfigPanel.AgentConfigSurfaceRows has cognitive complexity 22 (threshold 15). Drivers by points: ternaries 9 (15 pts), boolean chains 4, if/else 3 (nesting depth added 6). Of this number, 19 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentConfigPanel.tsx"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"da3cbe393bdc8aac602893560cb5db73bafb2bfc2b8dfda889ece94d91ff4cc3"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelMembersBar.ChannelMembersBar (cognitive 22): ChannelMembersBar.ChannelMembersBar has cognitive complexity 22 (threshold 15). Drivers by points: ternaries 9 (12 pts), if/else 4 (5 pts), boolean chains 3, error handling 1, loops 1 (nesting depth added 4). Of this number, 13 points are the body\u0027s own statements and 9 belong to 5 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/ChannelMembersBar.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac2944623cb30d6001f33b043d2d9b5492d38533821d44a58444e7ab22647755"}},{"ruleId":"D2","level":"warning","message":{"text":"useChannelIntro.useChannelIntro (cognitive 22): useChannelIntro.useChannelIntro has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (15 pts), ternaries 3 (5 pts), boolean chains 2 (nesting depth added 8). Most of this is not in the body itself: 0 of the 22 points are its own statements and the rest belongs to one function literal inside it that branches (line 50). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/useChannelIntro.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"f38c86c1b80140e6c3a2d619701634d78055d801be2e9ece073719bcf0ad0ccb"}},{"ruleId":"D2","level":"warning","message":{"text":"CommunityMembersCard.MemberRow (cognitive 22): CommunityMembersCard.MemberRow has cognitive complexity 22 (threshold 15). Drivers by points: ternaries 7 (14 pts), boolean chains 8 (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":"desktop/src/features/community-members/ui/CommunityMembersCard.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"020a94864026ae89517ae685a8439f9b593accbfffa16f7f53a2770e51c3fbb0"}},{"ruleId":"D2","level":"warning","message":{"text":"KlipyGifPicker.KlipyGifPicker (cognitive 22): KlipyGifPicker.KlipyGifPicker has cognitive complexity 22 (threshold 15). Drivers by points: ternaries 8 (22 pts) (nesting depth added 14). Most of this is not in the body itself: 7 of the 22 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 111, 85). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/gifs/ui/KlipyGifPicker.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d4c93a28e0a411d6bd3a161954601727e854814c0d2265b1cd810decbce3859"}},{"ruleId":"D2","level":"warning","message":{"text":"useHuddleParticipantRoster.compareLifecycleEvents (cognitive 22): useHuddleParticipantRoster.compareLifecycleEvents has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (9 pts), ternaries 3 (8 pts), boolean chains 5 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/hooks/useHuddleParticipantRoster.ts"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff7b68d824fa773ecef5707d5e695eef74e6d7dd66ac498a89f636bd5cc943fd"}},{"ruleId":"D2","level":"warning","message":{"text":"timelineItems.buildTimelineItems (cognitive 22): timelineItems.buildTimelineItems has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (17 pts), boolean chains 2, ternaries 1 (2 pts), loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/timelineItems.ts"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a6fe1388e6a4faffd53959e9ecebfc16280fa43b6ae1fc9dcd125653ae4016d"}},{"ruleId":"D2","level":"warning","message":{"text":"useEmojiAutocomplete.useEmojiAutocomplete (cognitive 22): useEmojiAutocomplete.useEmojiAutocomplete has cognitive complexity 22 (threshold 15). Drivers by points: if/else 12, ternaries 4 (6 pts), boolean chains 4 (nesting depth added 2). Most of this is not in the body itself: 1 of the 22 points is its own statement and the rest belongs to 11 function literals inside it that branch (lines 218, 156, 68, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useEmojiAutocomplete.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb021f6cf5563bd4b1665af6f1f1f827a304b8bb15cc7bb67d77e463051a57bf"}},{"ruleId":"D2","level":"warning","message":{"text":"hooks.useUsersBatchQuery (cognitive 22): hooks.useUsersBatchQuery has cognitive complexity 22 (threshold 15). Drivers by points: if/else 10 (16 pts), loops 3 (4 pts), boolean chains 2 (nesting depth added 7). Most of this is not in the body itself: 1 of the 22 points is its own statement and the rest belongs to 2 function literals inside it that branch (lines 354, 415). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/hooks.ts"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b9c0da0bfd85dd4a4e1c5c40b8c2983ba2363fa6b50d33b3bb716c3cf6e04e2"}},{"ruleId":"D2","level":"warning","message":{"text":"AvatarCustomColorPanel.AvatarCustomColorPanel (cognitive 22): AvatarCustomColorPanel.AvatarCustomColorPanel has cognitive complexity 22 (threshold 15). Drivers by points: ternaries 10, if/else 8, boolean chains 4. Most of this is not in the body itself: 9 of the 22 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 239, 184, 62, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/AvatarCustomColorPanel.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a44e1cf5029e4d3bd77045439ce2807a6b125f99d066500b1c06320e7212426"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectPullRequestFilesChangedPanel.ProjectDiffFilesPanel (cognitive 22): ProjectPullRequestFilesChangedPanel.ProjectDiffFilesPanel has cognitive complexity 22 (threshold 15). Drivers by points: ternaries 7 (11 pts), if/else 7, boolean chains 4 (nesting depth added 4). Of this number, 17 points are the body\u0027s own statements and 5 belong to 3 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectPullRequestFilesChangedPanel.tsx"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"efefb5699728b8fcc92723b8263c95375315c51f180940beafa9cc2284a38488"}},{"ruleId":"D2","level":"warning","message":{"text":"useAddProjectChannel.addProjectChannel (cognitive 22): useAddProjectChannel.addProjectChannel has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (10 pts), ternaries 3 (8 pts), error handling 2 (3 pts), boolean chains 1 (nesting depth added 9). Of this number, 20 points are the body\u0027s own statements and 2 belong to 2 function literals 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":"desktop/src/features/projects/useAddProjectChannel.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"38a5641db0e73b9a0dcdab46965240126bf219b5417b39d8f83bb58c09b945f4"}},{"ruleId":"D2","level":"warning","message":{"text":"SignOutSection.SignOutSection (cognitive 22): SignOutSection.SignOutSection has cognitive complexity 22 (threshold 15). Drivers by points: ternaries 9 (14 pts), if/else 4 (5 pts), boolean chains 2, error handling 1 (nesting depth added 6). Of this number, 19 points are the body\u0027s own statements and 3 belong to 2 function literals 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":"desktop/src/features/settings/ui/SignOutSection.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9909880ba3a864ab6afaeff4117d5c168926178b1e4e1947cb65c15ed6a7832"}},{"ruleId":"D2","level":"warning","message":{"text":"workflowDefinition.getActionCardClause (cognitive 22): workflowDefinition.getActionCardClause has cognitive complexity 22 (threshold 15). Drivers by points: ternaries 10 (17 pts), if/else 2 (3 pts), boolean chains 1, match/switch 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/workflowDefinition.ts"},"region":{"startLine":291}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba8e06c4e21e9c9d223eaaa84c5f6c430329e895583b53deadc7f21eb6c9b65b"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowTemplateTextarea.WorkflowTemplateTextarea (cognitive 22): WorkflowTemplateTextarea.WorkflowTemplateTextarea has cognitive complexity 22 (threshold 15). Drivers by points: ternaries 8 (11 pts), if/else 8, boolean chains 3 (nesting depth added 3). Most of this is not in the body itself: 5 of the 22 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 104, 140, 41, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/WorkflowTemplateTextarea.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"2aeb43e75673d924dbd947215d2f01ebfce25fff9864b1818f39c49a891f53d4"}},{"ruleId":"D2","level":"warning","message":{"text":"BloomMenu.Container (cognitive 22): BloomMenu.Container has cognitive complexity 22 (threshold 15). Drivers by points: ternaries 15 (16 pts), boolean chains 3, if/else 3 (nesting depth added 1). Of this number, 18 points are the body\u0027s own statements and 4 belong to 3 function literals inside it that branch. 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":"desktop/src/protectedFeatures/bestie/BloomMenu.tsx"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f0735d6fe085f26dcf2a686531566678c9ddbea77f4cd0198ad87ffb3bddaa6"}},{"ruleId":"D2","level":"warning","message":{"text":"BloomMenu.Content (cognitive 22): BloomMenu.Content has cognitive complexity 22 (threshold 15). Drivers by points: ternaries 11 (22 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":"desktop/src/protectedFeatures/bestie/BloomMenu.tsx"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"1014ddbc5ef3850f00aecc6ff157a99d30cdd6e9da88c7050e734eeb4f1c1b5b"}},{"ruleId":"D2","level":"warning","message":{"text":"relayReconnectReplay.replayReconnectHistoryPages (cognitive 22): relayReconnectReplay.replayReconnectHistoryPages has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (16 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":"desktop/src/shared/api/relayReconnectReplay.ts"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"6273fa171011af5ee2330027b69327081ef85ca750d54b184cfd8ef3a9afa06c"}},{"ruleId":"D2","level":"warning","message":{"text":"useWebviewScrollBoundaryLock.useWebviewScrollBoundaryLock (cognitive 22): useWebviewScrollBoundaryLock.useWebviewScrollBoundaryLock has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (11 pts), boolean chains 10, loops 1 (nesting depth added 3). Most of this is not in the body itself: 0 of the 22 points are its own statements and the rest belongs to one function literal inside it that branches (line 85). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/hooks/useWebviewScrollBoundaryLock.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"e529f31580e7a143efb0bba2f5fa045e3a5d69041368b17c0ff2bae2105353c4"}},{"ruleId":"D2","level":"warning","message":{"text":"AuxiliaryPanelHeader.AuxiliaryPanelHeader (cognitive 22): AuxiliaryPanelHeader.AuxiliaryPanelHeader has cognitive complexity 22 (threshold 15). Drivers by points: ternaries 7 (15 pts), boolean chains 6, if/else 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":"desktop/src/shared/layout/AuxiliaryPanelHeader.tsx"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"47f8be64252636ddf3063fd657ddece92587a4773af14b25d5d0f143270c3872"}},{"ruleId":"D2","level":"warning","message":{"text":"CommunityThemeSyncManager.doPublish (cognitive 22): CommunityThemeSyncManager.doPublish has cognitive complexity 22 (threshold 15). Drivers by points: if/else 10 (15 pts), boolean chains 6, error handling 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/theme/communityThemeSync.ts"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdc9b8e6ed51b76dd618c9cfa8b5ae235c72d867fb0aa01263ff61a26d971eb5"}},{"ruleId":"D2","level":"warning","message":{"text":"markdown.ImageBlock (cognitive 22): markdown.ImageBlock has cognitive complexity 22 (threshold 15). Drivers by points: ternaries 9, if/else 7, boolean chains 6. Most of this is not in the body itself: 10 of the 22 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 1089, 1008, 1057, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/markdown.tsx"},"region":{"startLine":986}}}],"partialFingerprints":{"codehealthFindingId/v1":"77a1637e93c28ea81533e2b33c0d83d308445c5705eb1845a74816a711399cfd"}},{"ruleId":"D2","level":"warning","message":{"text":"AcpClient::spawn_with_env (cognitive 21): AcpClient::spawn_with_env has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (13 pts), loops 4 (5 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/buzz-acp/src/acp.rs"},"region":{"startLine":468}}}],"partialFingerprints":{"codehealthFindingId/v1":"d16450c90b9270081e55b0b4dc4aac2c5a74bd2ea05a538ab6b55775cd3c30c6"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_agent::llm::parse_anthropic (cognitive 21): buzz_agent::llm::parse_anthropic has cognitive complexity 21 (threshold 15). Drivers by points: if/else 5 (15 pts), match/switch 2 (4 pts), loops 1 (2 pts) (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/llm.rs"},"region":{"startLine":1368}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fb9c2adaf4189381e3007b0bbc5657014780a33fe57244bc238e88e8b6caa8c"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_db::store::channel::update_channel (cognitive 21): buzz_db::store::channel::update_channel has cognitive complexity 21 (threshold 15). Drivers by points: if/else 15 (18 pts), match/switch 1 (2 pts), boolean chains 1 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/channel.rs"},"region":{"startLine":506}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8dc502759b17174f8e5556e151ddb48dbac76f54816fae139095dc312fdce33"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_media::upload::process_video_upload (cognitive 21): buzz_media::upload::process_video_upload has cognitive complexity 21 (threshold 15). Drivers by points: if/else 11 (16 pts), boolean chains 2, 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/buzz-media/src/upload.rs"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3b68adbf9f2896db6ce3d1e042b74b0e6b001f338b3f9062c5a4e8d0825c87c"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_persona::validate::advisory_check_manifest_keys (cognitive 21): buzz_persona::validate::advisory_check_manifest_keys has cognitive complexity 21 (threshold 15). Drivers by points: if/else 5 (12 pts), loops 3 (6 pts), match/switch 3 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-persona/src/validate.rs"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6f0a755035bc3eb3262fb891e4c7c33806b4572e74ac5b701bad2c2c0f69e6c"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::api::git::transport::finalize_push_inner (cognitive 21): buzz_relay::api::git::transport::finalize_push_inner has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (11 pts), match/switch 6 (10 pts) (nesting depth added 6). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/git/transport.rs"},"region":{"startLine":1903}}}],"partialFingerprints":{"codehealthFindingId/v1":"93be8bb4a95a62ece8d62d6992841b4f0dbb7db8acb6b9f39b49d1fe55d8e274"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::event::handle_ephemeral_event (cognitive 21): buzz_relay::handlers::event::handle_ephemeral_event has cognitive complexity 21 (threshold 15). Drivers by points: if/else 11 (17 pts), 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/buzz-relay/src/handlers/event.rs"},"region":{"startLine":815}}}],"partialFingerprints":{"codehealthFindingId/v1":"039c74b2288c0145878f36ba906114f7128e06d7aaa91040de947e37f437c164"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::ingest::validate_diff_event (cognitive 21): buzz_relay::handlers::ingest::validate_diff_event has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 4, 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/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":1344}}}],"partialFingerprints":{"codehealthFindingId/v1":"931833cdc06d1b72317e61adc3cd41c43965346e8ea9233d558428eef52c3f27"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::deep_link::parse_entity_deep_link (cognitive 21): buzz_desktop::deep_link::parse_entity_deep_link has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10 (13 pts), boolean chains 5, match/switch 1 (2 pts), loops 1 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/deep_link.rs"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"69aa11259d98cd1ebaca360b463edbaeb55fc4957c1db3999eb309651d5987ce"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::native_relay_client::reconcile (cognitive 21): buzz_desktop::native_relay_client::reconcile has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (17 pts), loops 3, 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":"desktop/src-tauri/src/native_relay_client.rs"},"region":{"startLine":769}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e8b6010d7cb9b4d63c9e89c81367e05c9be0f2f5a97195a6d21cf620c094214"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::huddle::pipeline::post_connect_setup (cognitive 21): buzz_desktop::huddle::pipeline::post_connect_setup has cognitive complexity 21 (threshold 15). Drivers by points: if/else 15 (19 pts), boolean chains 2 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/huddle/pipeline.rs"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c326141a379290b12901a8404742003d2fd5f08490ea7d91000e5df4cc12e9b"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::huddle::preprocessing::strip_underscore_emphasis (cognitive 21): buzz_desktop::huddle::preprocessing::strip_underscore_emphasis has cognitive complexity 21 (threshold 15). Drivers by points: if/else 4 (10 pts), loops 2 (6 pts), boolean chains 5 (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":"desktop/src-tauri/src/huddle/preprocessing.rs"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea03945224e3dc162a65bafa9cd83275f2f163664abeeeb4823ee546e31fbc40"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::media_download::fetch_blob_bytes_with_cap (cognitive 21): buzz_desktop::commands::media_download::fetch_blob_bytes_with_cap has cognitive complexity 21 (threshold 15). Drivers by points: if/else 11 (15 pts), match/switch 2 (5 pts), loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/media_download.rs"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"895863c2287a0602377934a57a487eaf0d645fbb781e7c2c2ce002e6b4ebcda5"}},{"ruleId":"D2","level":"warning","message":{"text":"delivery.explore (cognitive 21): delivery.explore has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 7 (15 pts), loops 4 (5 pts), boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/formal/nip-pl/delivery.py"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"d22cf971af15fc359e42de226916083c725ff257e5950d6e2bc0a7cd41dde0fc"}},{"ruleId":"D2","level":"warning","message":{"text":"prepare-inter.main (cognitive 21): prepare-inter.main has cognitive complexity 21 (threshold 15). Drivers by points: if/else 5 (12 pts), loops 3 (8 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":"mobile/scripts/prepare-inter.py"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa59dd22bc1ca2b140d72f928ce051d0b1667d304ea235e3ed8ab732a046ef5d"}},{"ruleId":"D2","level":"warning","message":{"text":"ThemePaginationControl.updateDots (cognitive 21): ThemePaginationControl.updateDots has cognitive complexity 21 (threshold 15). Drivers by points: boolean chains 8, if/else 5 (6 pts), ternaries 3 (6 pts), loops 1 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/ThemePaginationGlassControl.swift"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b53fb11e773814ed642338c2325629a1796e02f2542d9c49164c0cd7e2ea464"}},{"ruleId":"D2","level":"warning","message":{"text":"VoiceNotePackager.makeVoiceNoteVideoTrack (cognitive 21): VoiceNotePackager.makeVoiceNoteVideoTrack has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (15 pts), boolean chains 5, error handling 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":"mobile/ios/Runner/VoiceNotePackager.swift"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"a50e0c0b386ee05ad8a3be92331237cf04bd864da6a45d936f7f09ef699fd236"}},{"ruleId":"D2","level":"warning","message":{"text":"BuzzDevPushEnrollmentDriver.completeEnrollment (cognitive 21): BuzzDevPushEnrollmentDriver.completeEnrollment has cognitive complexity 21 (threshold 15). Drivers by points: boolean chains 11, if/else 8 (10 pts) (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":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzDevPushEnrollmentDriver.swift"},"region":{"startLine":609}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed98f0df51615374e01228f5284005ebc2ec46abd9cce89e36bd2ac6336184aa"}},{"ruleId":"D2","level":"warning","message":{"text":"BuzzPushPresentationCacheStore.encodedBoundedSnapshot (cognitive 21): BuzzPushPresentationCacheStore.encodedBoundedSnapshot has cognitive complexity 21 (threshold 15). Drivers by points: if/else 6 (14 pts), loops 3 (5 pts), boolean chains 2 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushPresentationCache.swift"},"region":{"startLine":455}}}],"partialFingerprints":{"codehealthFindingId/v1":"974c78454e82b905b6a129c7da0749cd53b90e023752dd2d4e5219374e344a7c"}},{"ruleId":"D2","level":"warning","message":{"text":"_HuddleParticipantCluster.build (cognitive 21): _HuddleParticipantCluster.build has cognitive complexity 21 (threshold 15). Drivers by points: if/else 6 (10 pts), loops 8, ternaries 1 (2 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":"mobile/lib/features/channels/channel_detail_page/huddle_participant_cluster.dart"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"94781a33f7e2f751d57793d480b16a85a49fcc66d5977e84f467d6498fada77d"}},{"ruleId":"D2","level":"warning","message":{"text":"_HuddleJoinSurface.build (cognitive 21): _HuddleJoinSurface.build has cognitive complexity 21 (threshold 15). Drivers by points: boolean chains 14, ternaries 5, if/else 1, match/switch 1. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_detail_page/huddle_sheet.dart"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"478e1433a3aa7cb5aedffde7592a6ba77a7b2563118860802675aad45a241a92"}},{"ruleId":"D2","level":"warning","message":{"text":"SendMessage._resolveMentions (cognitive 21): SendMessage._resolveMentions has cognitive complexity 21 (threshold 15). Drivers by points: if/else 5 (12 pts), loops 3 (5 pts), boolean chains 3, error handling 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":"mobile/lib/features/channels/send_message_provider.dart"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"044f60d77675cdbc7eb29049f8c7e157135c4e8489478c6048c3c87b17a81063"}},{"ruleId":"D2","level":"warning","message":{"text":"_ThreadStickyDateIndex.resolve (cognitive 21): _ThreadStickyDateIndex.resolve has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (9 pts), boolean chains 8, ternaries 3, loops 1 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/thread_detail_page/sticky_date.dart"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fa05af9c13730b1cae32e2b6f8100baeebf1dca8f669207660917d715951545"}},{"ruleId":"D2","level":"warning","message":{"text":"_PersonInviteSection.build (cognitive 21): _PersonInviteSection.build has cognitive complexity 21 (threshold 15). Drivers by points: if/else 12 (15 pts), ternaries 2 (3 pts), boolean chains 2, error handling 1 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/invites/invite_create_page/person_invite_section.dart"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef132475ed62e1f5b0eb270a8a4e9264cec355f8ed5bd0070bff503578604907"}},{"ruleId":"D2","level":"warning","message":{"text":"SearchPage.build (cognitive 21): SearchPage.build has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 13, if/else 5, boolean chains 2, loops 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":"mobile/lib/features/search/search_page.dart"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1719a006b8d4f114d1b32ce1942b04ee3eda3a008ae9505f63779036d6c9f20"}},{"ruleId":"D2","level":"warning","message":{"text":"IosGlassNavigationButton.build (cognitive 21): IosGlassNavigationButton.build has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 6 (11 pts), if/else 7 (8 pts), match/switch 1 (2 pts) (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/widgets/ios_glass_navigation_button.dart"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"08365f233d001581cad2153193c6f9ed5558dda98f0b4b9c568724df35b3f1bc"}},{"ruleId":"D2","level":"warning","message":{"text":"check-file-sizes-core.runFileSizeCheck (cognitive 21): check-file-sizes-core.runFileSizeCheck has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 5 (11 pts), if/else 4 (7 pts), loops 2, 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":"scripts/check-file-sizes-core.mjs"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9ce71915aa5660b38d432ff8cc6ed2efa59fbc75ceb716f4412ba72f403dae0"}},{"ruleId":"D2","level":"warning","message":{"text":"AdminConsoleFeedbackTab.AttachmentViewer (cognitive 21): AdminConsoleFeedbackTab.AttachmentViewer has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (10 pts), ternaries 4 (8 pts), error handling 2, boolean chains 1 (nesting depth added 5). Most of this is not in the body itself: 7 of the 21 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 216, 277, 206, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/AdminConsoleFeedbackTab.tsx"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"68e26bdfa60494de77138cc7837f9ff84e7b389198d2e7100cb830323cd3a866"}},{"ruleId":"D2","level":"warning","message":{"text":"agentAutocompleteEligibility.getMentionableAgentPubkeys (cognitive 21): agentAutocompleteEligibility.getMentionableAgentPubkeys has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 4 (14 pts), boolean chains 4, if/else 1 (2 pts), loops 1 (nesting depth added 11). 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":"desktop/src/features/agents/lib/agentAutocompleteEligibility.ts"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"1132681bbb74a64dd6aa11288d0cd460bf1d7fc7a412e7090c05cdecc00e1725"}},{"ruleId":"D2","level":"warning","message":{"text":"observerRelayStore.ingestArchivedObserverEvents (cognitive 21): observerRelayStore.ingestArchivedObserverEvents has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (15 pts), loops 2 (3 pts), error handling 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":"desktop/src/features/agents/observerRelayStore.ts"},"region":{"startLine":847}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f74ad27b7b4335d4a6aae558a4cd4fed44a630761763b2e4cb126ffcc3d795d"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentCardViewerDialog.AgentCardViewerContent (cognitive 21): AgentCardViewerDialog.AgentCardViewerContent has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 9 (13 pts), boolean chains 4, if/else 4 (nesting depth added 4). Of this number, 19 points are the body\u0027s own statements and 2 belong to 2 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentCardViewerDialog.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c8a1ff0e24ddf9c7b3c9a94a47a250dbcc84706e8d76b6c042023b1f15002d8"}},{"ruleId":"D2","level":"warning","message":{"text":"agentSessionTranscriptPresentation.getActivityHeadline (cognitive 21): agentSessionTranscriptPresentation.getActivityHeadline has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (13 pts), ternaries 2 (7 pts), boolean chains 1 (nesting depth added 11). 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":"desktop/src/features/agents/ui/agentSessionTranscriptPresentation.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"502707375a7e44ab36ef8b53ae38ab6a7855044bd350b492bc04ba6a5b63da2f"}},{"ruleId":"D2","level":"warning","message":{"text":"TeamSnapshotImportDialog.ResultBody (cognitive 21): TeamSnapshotImportDialog.ResultBody has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 10 (20 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":"desktop/src/features/agents/ui/TeamSnapshotImportDialog.tsx"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"4283e4fd05a5369bc1518c1c0b962a18e716cfc8826429d4f47a0056c0cc3ac0"}},{"ruleId":"D2","level":"warning","message":{"text":"imetaMediaMarkdown.findSpoileredImetaMediaUrls (cognitive 21): imetaMediaMarkdown.findSpoileredImetaMediaUrls has cognitive complexity 21 (threshold 15). Drivers by points: if/else 6 (13 pts), loops 3 (6 pts), boolean chains 2 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/imetaMediaMarkdown.ts"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"92743fc30beef7d7b19a6bcf26b93fa6a3eb7e74f4573844956ed19d6a7341d1"}},{"ruleId":"D2","level":"warning","message":{"text":"mentionHighlightExtension.selectionAfterMentionTrailingSpace (cognitive 21): mentionHighlightExtension.selectionAfterMentionTrailingSpace has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (12 pts), boolean chains 8, loops 1 (nesting depth added 4). Most of this is not in the body itself: 6 of the 21 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 620, 647). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/mentionHighlightExtension.ts"},"region":{"startLine":602}}}],"partialFingerprints":{"codehealthFindingId/v1":"de2f45c4d2a27b41c21813e993ac52d86da5bd5b0df8ce00418eb94fc8d90527"}},{"ruleId":"D2","level":"warning","message":{"text":"selectionBlockFormatting.isolateCaretLineForBlockFormatting (cognitive 21): selectionBlockFormatting.isolateCaretLineForBlockFormatting has cognitive complexity 21 (threshold 15). Drivers by points: if/else 12 (19 pts), boolean chains 2 (nesting depth added 7). Of this number, 18 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/selectionBlockFormatting.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf1406407a8ea62d7c2dfa4d75fd91163ca01a9d6aa15ccf3a0db76c6f60eda3"}},{"ruleId":"D2","level":"warning","message":{"text":"DraftsPanel.DraftRow (cognitive 21): DraftsPanel.DraftRow has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 10 (17 pts), boolean chains 4 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/DraftsPanel.tsx"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0e80818d3f8eb8d55cf3ba2af615df83ef098209d78a5e77113c77cc4fb5ffb"}},{"ruleId":"D2","level":"warning","message":{"text":"SystemMessageAvatars.SystemMessageAvatar (cognitive 21): SystemMessageAvatars.SystemMessageAvatar has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 10 (17 pts), if/else 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":"desktop/src/features/messages/ui/SystemMessageAvatars.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"4febf67c9ca8a4513c505fb89a9a7993816a985ca3db975301cbecd61a95274d"}},{"ruleId":"D2","level":"warning","message":{"text":"useLoadMissingAncestors.useLoadMissingAncestors (cognitive 21): useLoadMissingAncestors.useLoadMissingAncestors has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (11 pts), loops 4 (6 pts), boolean chains 3, error handling 1 (nesting depth added 6). Most of this is not in the body itself: 0 of the 21 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 30, 81, 21). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/useLoadMissingAncestors.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4ea47e9f236ce4716fec547c18d48e090dbb8282561e13bd7e78b6bb1dc3c98"}},{"ruleId":"D2","level":"warning","message":{"text":"MembershipDenied.MembershipDenied (cognitive 21): MembershipDenied.MembershipDenied has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 8 (16 pts), error handling 2, if/else 2, boolean chains 1 (nesting depth added 8). Of this number, 14 points are the body\u0027s own statements and 7 belong to 3 function literals 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":"desktop/src/features/onboarding/ui/MembershipDenied.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf091ce1cb90e07bdd962e9f56faa537f7c04010937c73fbab3fb21955b6e9c7"}},{"ruleId":"D2","level":"warning","message":{"text":"PresenceSubscriptionReconciler.reconcile (cognitive 21): PresenceSubscriptionReconciler.reconcile has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 4, error handling 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":"desktop/src/features/presence/lib/presenceSubscriptionReconciler.ts"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"83058ef0b4af30011e763a045a21b2c159a9e9dfaccc173dd4ca97bfba3cbdee"}},{"ruleId":"D2","level":"warning","message":{"text":"avatarProfileSync.createAvatarProfileSync (cognitive 21): avatarProfileSync.createAvatarProfileSync has cognitive complexity 21 (threshold 15). Drivers by points: if/else 14, boolean chains 6, loops 1. Most of this is not in the body itself: 0 of the 21 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 76, 89, 101, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/avatarProfileSync.ts"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a24a180d22ac398640e705c510a45ca7f9826e87057f35274af3046347b66a2"}},{"ruleId":"D2","level":"warning","message":{"text":"projectModels.validateProjectEventEnvelope (cognitive 21): projectModels.validateProjectEventEnvelope has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (15 pts), boolean chains 3, loops 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":"desktop/src/features/projects/projectModels.ts"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdd40cad996d846817f9f6eb851b63a0992f56b754b59156b4d877b2f4bf350b"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectRepositorySource.RepoSourceDropdown (cognitive 21): ProjectRepositorySource.RepoSourceDropdown has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 13 (17 pts), boolean chains 4 (nesting depth added 4). Of this number, 20 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. 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":"desktop/src/features/projects/ui/ProjectRepositorySource.tsx"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"f827fa3edaffb59b574337448c404ea1fa64b0b241b5b69c31e983b8440a1f37"}},{"ruleId":"D2","level":"warning","message":{"text":"EncryptedBackupCreator.EncryptedBackupCreator (cognitive 21): EncryptedBackupCreator.EncryptedBackupCreator has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 9 (16 pts), boolean chains 3, if/else 2 (nesting depth added 7). Of this number, 19 points are the body\u0027s own statements and 2 belong to 2 function literals 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":"desktop/src/features/settings/ui/EncryptedBackupCreator.tsx"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"b73f6acf9337b2b27d279b390333f1d7a760263502185e1533a664fa48d9ce26"}},{"ruleId":"D2","level":"warning","message":{"text":"SidebarSection.ChannelMenuButton (cognitive 21): SidebarSection.ChannelMenuButton has cognitive complexity 21 (threshold 15). Drivers by points: boolean chains 10, ternaries 9 (10 pts), if/else 1 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/SidebarSection.tsx"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"634690bd531472129d3db8baea8fe5338cd35b68557463933bc4f047cfafc2e7"}},{"ruleId":"D2","level":"warning","message":{"text":"rehypeSearchHighlight.rehypeSearchHighlight (cognitive 21): rehypeSearchHighlight.rehypeSearchHighlight has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (16 pts), loops 2 (4 pts), boolean chains 1 (nesting depth added 10). Most of this is not in the body itself: 0 of the 21 points are its own statements and the rest belongs to one function literal inside it that branches (line 41). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/lib/rehypeSearchHighlight.ts"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cb29123d1e8291e8325f7156389b2a1d81736700a185696b98eb247655b9c2c"}},{"ruleId":"D2","level":"warning","message":{"text":"VideoPlayer.VideoScrubber (cognitive 21): VideoPlayer.VideoScrubber has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10, ternaries 7, boolean chains 3, match/switch 1. Most of this is not in the body itself: 7 of the 21 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 442, 398, 418, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/VideoPlayer.tsx"},"region":{"startLine":353}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3aa82b8619d6c0e9a4ad7128efaaaac4d26d05e4dad5f18660aed465d45608b"}},{"ruleId":"D2","level":"warning","message":{"text":"RepoDetailPage.RepoDetailPage (cognitive 21): RepoDetailPage.RepoDetailPage has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 8, boolean chains 6, if/else 6, error handling 1. Of this number, 16 points are the body\u0027s own statements and 5 belong to 3 function literals inside it that branch. 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":"web/src/features/repos/ui/RepoDetailPage.tsx"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"58c426986dbe6afa54c17ede373cd36dd1000fcf859db0c12bd69332a71124c3"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::config::load_rules (cognitive 20): buzz_acp::config::load_rules has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (16 pts), match/switch 1 (3 pts), loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/config.rs"},"region":{"startLine":1263}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dfe11506c7780e2dda46cef37f37c1c467f6344a73e543e7480a4f7ad7023c5"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::filter::match_event (cognitive 20): buzz_acp::filter::match_event has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (14 pts), match/switch 1 (3 pts), boolean chains 2, loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/filter.rs"},"region":{"startLine":368}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3bf2093fe068ad2b8e96981683c6d3f08cdc0a92090483e880031428f8cb7cc"}},{"ruleId":"D2","level":"warning","message":{"text":"Config::validate (cognitive 20): Config::validate has cognitive complexity 20 (threshold 15). Drivers by points: if/else 17 (18 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/buzz-agent/src/config.rs"},"region":{"startLine":812}}}],"partialFingerprints":{"codehealthFindingId/v1":"892a10d288a2c88a64fc2b2bf577a79cc438517b392bd2a4a02215d052546843"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_backend_kubernetes::env::build_env (cognitive 20): buzz_backend_kubernetes::env::build_env has cognitive complexity 20 (threshold 15). Drivers by points: if/else 13 (17 pts), loops 2, match/switch 1 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-backend-kubernetes/src/env.rs"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc4511da5434c82005f2ad74ff516ffbaf4af92e6695c8b2499b434b7ffa43b7"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_core::pairing::qr::decode_qr (cognitive 20): buzz_core::pairing::qr::decode_qr has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (10 pts), match/switch 3 (6 pts), boolean chains 2, loops 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-core/src/pairing/qr.rs"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"10e7a35b917aedfba11f07644ffdd07caf6835f255a0aa0a923f1197dd1483c2"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_dev_mcp::view_image::fetch_url (cognitive 20): buzz_dev_mcp::view_image::fetch_url has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (16 pts), match/switch 1 (2 pts), boolean chains 1, loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-dev-mcp/src/view_image.rs"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d239b7e67813ccc1bfcb898b87f79d74ae78b38aa3533ac803aa41dbbda50a2"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::ingest::validate_edit_ownership (cognitive 20): buzz_relay::handlers::ingest::validate_edit_ownership has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (18 pts), boolean chains 1, match/switch 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":1211}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebcec4d5246333a79d89ddc9e2e3180f2949b8b29a9c89b602ffc84a0d361efa"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::router::nip11_or_ws_handler (cognitive 20): buzz_relay::router::nip11_or_ws_handler has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (18 pts), match/switch 2 (nesting depth added 11). 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/buzz-relay/src/router.rs"},"region":{"startLine":547}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1d5a18827b67f4f85413a5592d6b75cd903469a8f56f1e375ccca2fc8e3ace6"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::deep_link::handle_deep_link_url (cognitive 20): buzz_desktop::deep_link::handle_deep_link_url has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (16 pts), match/switch 3 (4 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":"desktop/src-tauri/src/deep_link.rs"},"region":{"startLine":606}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f2621d1d86c9cdbc80af3d9806c7596645bdb2b0fb8ff8f9359deac4b088e11"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::migration::team_membership::backfill_instance_team_ids (cognitive 20): buzz_desktop::migration::team_membership::backfill_instance_team_ids has cognitive complexity 20 (threshold 15). Drivers by points: match/switch 3 (8 pts), if/else 3 (7 pts), loops 3 (4 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":"desktop/src-tauri/src/migration/team_membership.rs"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"238fbc85d30476a5a6cb424b8f730d2addfdec77b3fbdc58cf217f7775724428"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::project_git::compare_local_remote_status (cognitive 20): buzz_desktop::commands::project_git::compare_local_remote_status has cognitive complexity 20 (threshold 15). Drivers by points: if/else 15, boolean chains 3, match/switch 2. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/project_git.rs"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"b50084e937e7286dbdddaa3c5e4c580a3cfe7d518ff5bda0effa295d6272892a"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::project_git::list_project_local_repositories (cognitive 20): buzz_desktop::commands::project_git::list_project_local_repositories has cognitive complexity 20 (threshold 15). Drivers by points: if/else 5 (15 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/project_git.rs"},"region":{"startLine":690}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d24c37082e5b6daba5375975d4a2670fb00334834defaee566f9e21617000f7"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::discovery::discover_acp_runtime_phase1 (cognitive 20): buzz_desktop::managed_agents::discovery::discover_acp_runtime_phase1 has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (14 pts), boolean chains 4, 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":"desktop/src-tauri/src/managed_agents/discovery.rs"},"region":{"startLine":937}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca73edb628ebeedcf1f656ad07638885723b795147f3fe609ba3d48c41019786"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::migration::reconcile_legacy_team_persona_runtime_files (cognitive 20): buzz_desktop::migration::reconcile_legacy_team_persona_runtime_files has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (17 pts), match/switch 1 (2 pts), loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/migration.rs"},"region":{"startLine":1159}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdbc2007d3913efe3ea81699cae416427349c91e0b19a0dd88969a328db19acf"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::huddle::agent_voice::sync_agent_voice_assignments (cognitive 20): buzz_desktop::huddle::agent_voice::sync_agent_voice_assignments has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (16 pts), boolean chains 3, loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/huddle/agent_voice.rs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6e8e3a8560e039b89e5e7b732dfa08c295a3e9f4d5ec99a24f96652b6e15943"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::workspace::apply_workspace (cognitive 20): buzz_desktop::commands::workspace::apply_workspace has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (15 pts), match/switch 4 (5 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":"desktop/src-tauri/src/commands/workspace.rs"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8e0c11222aba8e4bac2504122254202d6b37eb22cdf2eb89398be8231e5ea6c"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::archive::pipeline::plan_archive (cognitive 20): buzz_desktop::archive::pipeline::plan_archive has cognitive complexity 20 (threshold 15). Drivers by points: match/switch 4 (8 pts), if/else 4 (7 pts), loops 3, 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":"desktop/src-tauri/src/archive/pipeline.rs"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddb695d23442b8e6983410e0704206e156c04ea3d011d1ca00ac3dea0ef77e37"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::mesh_llm::mesh_start_node (cognitive 20): buzz_desktop::commands::mesh_llm::mesh_start_node has cognitive complexity 20 (threshold 15). Drivers by points: if/else 12 (15 pts), match/switch 3 (4 pts), boolean chains 1 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/mesh_llm.rs"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"5dbdafedc02191f757817feb7d07f6a27bdc6dfcd4983c8a87d0147a92fbfeee"}},{"ruleId":"D2","level":"warning","message":{"text":"exhaustive.test_concurrent_stability (cognitive 20): exhaustive.test_concurrent_stability has cognitive complexity 20 (threshold 15). Drivers by points: loops 5 (15 pts), if/else 1 (5 pts) (nesting depth added 14). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/formal/nip-rs-unread/exhaustive.py"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"c43afc1a31922f9463649ecd8916be5f77ea5eb526a463f3ff2529c96c930e35"}},{"ruleId":"D2","level":"warning","message":{"text":"AppDelegate.didInitializeImplicitFlutterEngine (cognitive 20): AppDelegate.didInitializeImplicitFlutterEngine has cognitive complexity 20 (threshold 15). Drivers by points: if/else 16 (19 pts), boolean chains 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/AppDelegate.swift"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"17b28ec1e9591a45be47bc513677dba95ef53356681b80b46563d0bea49bb92d"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelsPage.build (cognitive 20): ChannelsPage.build has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10, boolean chains 6, ternaries 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":"mobile/lib/features/channels/channels_page.dart"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"20198a5b5b5b0f1b699007f39f4fab7e7faff19fa8c66b409f863e936f38427e"}},{"ruleId":"D2","level":"warning","message":{"text":"_ComposeBarLayout._buildBar (cognitive 20): _ComposeBarLayout._buildBar has cognitive complexity 20 (threshold 15). Drivers by points: ternaries 9 (11 pts), if/else 7, 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":"mobile/lib/features/channels/compose_bar/layout.dart"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"919a8b4ed32aa42552e257a2d647ca5f5d21acda0084c222052e9a5691fc4018"}},{"ruleId":"D2","level":"warning","message":{"text":"MobileHuddleController._start (cognitive 20): MobileHuddleController._start has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (12 pts), error handling 3 (8 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":"mobile/lib/features/channels/mobile_huddle_controller.dart"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"decc00a7684544c08c2d2531df0f32103150f48c2188a05041fe6f9a1903950b"}},{"ruleId":"D2","level":"warning","message":{"text":"MobileHuddleController.end (cognitive 20): MobileHuddleController.end has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (13 pts), boolean chains 3, error handling 3, ternaries 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/mobile_huddle_controller.dart"},"region":{"startLine":431}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a55b58893607b46cbac94752b54de331832f3fb2e802e53325e118c64d172a1"}},{"ruleId":"D2","level":"warning","message":{"text":"DeviceVoiceNotePlayerController._load (cognitive 20): DeviceVoiceNotePlayerController._load has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (13 pts), boolean chains 6, error handling 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":"mobile/lib/features/channels/voice_note_recording.dart"},"region":{"startLine":708}}}],"partialFingerprints":{"codehealthFindingId/v1":"10fe53f4d9e9989715e7d5f404b70a9723c6baa7a7cb5ec7269299d523a3b957"}},{"ruleId":"D2","level":"warning","message":{"text":"_ThemePreviewExperience.build (cognitive 20): _ThemePreviewExperience.build has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (11 pts), ternaries 6, boolean chains 3 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/settings/theme_picker_page/theme_preview_sheet.dart"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"e60d8fa0e756214145be54f301a82bc94bbca3d1c130e74ee5480032b83ce549"}},{"ruleId":"D2","level":"warning","message":{"text":"ReadStateManager._publish (cognitive 20): ReadStateManager._publish has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (13 pts), boolean chains 4, loops 1 (2 pts), error handling 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":"mobile/lib/shared/read_state/read_state_manager.dart"},"region":{"startLine":381}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f881553a95354e40d30c17298ad9df6decd45580d3b87e6f337fcd570e2313e"}},{"ruleId":"D2","level":"warning","message":{"text":"RelaySessionNotifier._sendReplayBatches (cognitive 20): RelaySessionNotifier._sendReplayBatches has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (16 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/relay/relay_session.dart"},"region":{"startLine":592}}}],"partialFingerprints":{"codehealthFindingId/v1":"780b70f6297f5eb08263a3f87ad7b80d371a6151a2df56dbb02a015dfe7a3516"}},{"ruleId":"D2","level":"warning","message":{"text":"agentManagement.parseAgentManagementRequest (cognitive 20): agentManagement.parseAgentManagementRequest has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (9 pts), ternaries 6, boolean chains 5 (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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/agentManagement.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0364b4edbf44cc0bf89f284ea420ea3799601c0c6bd0279d488f166871b2e18"}},{"ruleId":"D2","level":"warning","message":{"text":"agentWorkingSignal.getWorkingChannels (cognitive 20): agentWorkingSignal.getWorkingChannels has cognitive complexity 20 (threshold 15). Drivers by points: if/else 5 (13 pts), loops 4 (7 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":"desktop/src/features/agents/agentWorkingSignal.ts"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"e17d2f9f95a4e8ce60ede8b0d95ace048e023bc539235a4bf6dc66e3854c8bdb"}},{"ruleId":"D2","level":"warning","message":{"text":"agentConfigOptions.computeLocalModeGate (cognitive 20): agentConfigOptions.computeLocalModeGate has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (14 pts), boolean chains 4, loops 1, ternaries 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":"desktop/src/features/agents/ui/agentConfigOptions.tsx"},"region":{"startLine":653}}}],"partialFingerprints":{"codehealthFindingId/v1":"619f89df4d1636aded022450f2882f935e27c803c173886bab59dbc2d62c642e"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentSessionTranscriptList.AgentSessionTranscriptList (cognitive 20): AgentSessionTranscriptList.AgentSessionTranscriptList has cognitive complexity 20 (threshold 15). Drivers by points: ternaries 11 (12 pts), boolean chains 7, if/else 1 (nesting depth added 1). Of this number, 16 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. 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":"desktop/src/features/agents/ui/AgentSessionTranscriptList.tsx"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"18b93872d4b743f33a65fc97f4bdfdb23add140a33ba211bced5c7497684007f"}},{"ruleId":"D2","level":"warning","message":{"text":"HuddleAttachment.reconstructHuddleLifecycle (cognitive 20): HuddleAttachment.reconstructHuddleLifecycle has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (16 pts), match/switch 1 (2 pts), boolean chains 1, loops 1 (nesting depth added 11). Of this number, 19 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/components/HuddleAttachment.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"15e4e35402762d313b14c67abd011bdf986db6bbc1a821fb0137f639ae5e9b8b"}},{"ruleId":"D2","level":"warning","message":{"text":"MessageReactions.ReactionPill (cognitive 20): MessageReactions.ReactionPill has cognitive complexity 20 (threshold 15). Drivers by points: ternaries 7 (10 pts), if/else 7, boolean chains 3 (nesting depth added 3). Of this number, 13 points are the body\u0027s own statements and 7 belong to 4 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/MessageReactions.tsx"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"92cdaef039ef66b496473398ea69a0e9db23f7179e96b345a36ad2c59c3ff669"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectRepositoryPanel.fileIconVisual (cognitive 20): ProjectRepositoryPanel.fileIconVisual has cognitive complexity 20 (threshold 15). Drivers by points: if/else 17, boolean chains 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":"desktop/src/features/projects/ui/ProjectRepositoryPanel.tsx"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0018a0ab061da7ff2feacae9bb0c55c20d24b3cec8a2e3e4efed6010af71776"}},{"ruleId":"D2","level":"warning","message":{"text":"RemindersPanel.ReminderRow (cognitive 20): RemindersPanel.ReminderRow has cognitive complexity 20 (threshold 15). Drivers by points: ternaries 9 (11 pts), boolean chains 7, if/else 2 (nesting depth added 2). Of this number, 18 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. 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":"desktop/src/features/reminders/ui/RemindersPanel.tsx"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"35220d11d4adc01ab03762daf25b6a23e254c4133bc3bd75e43a5f2127e969fc"}},{"ruleId":"D2","level":"warning","message":{"text":"CreateChannelFormFields.CreateChannelFormFields (cognitive 20): CreateChannelFormFields.CreateChannelFormFields has cognitive complexity 20 (threshold 15). Drivers by points: ternaries 11 (19 pts), boolean chains 1 (nesting depth added 8). Of this number, 19 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/CreateChannelFormFields.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"d197743afffac0661e6cd5d3afeaf863aee3a1cc54aa4b79aecb08ef940c4199"}},{"ruleId":"D2","level":"warning","message":{"text":"SidebarDnd.SidebarDndContext (cognitive 20): SidebarDnd.SidebarDndContext has cognitive complexity 20 (threshold 15). Drivers by points: if/else 12 (16 pts), ternaries 2 (3 pts), boolean chains 1 (nesting depth added 5). Most of this is not in the body itself: 3 of the 20 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 233, 208). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/SidebarDnd.tsx"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6beebfe5d04467c6f4a565ffda3deeea2d7d363657a6bafe643df2137d23b2a"}},{"ruleId":"D2","level":"warning","message":{"text":"workflowStepDescription.configuredStepDetail (cognitive 20): workflowStepDescription.configuredStepDetail has cognitive complexity 20 (threshold 15). Drivers by points: if/else 5 (10 pts), boolean chains 5, ternaries 2 (4 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":"desktop/src/features/workflows/ui/workflowStepDescription.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4d58a73b52626bb781305f2fd670c7795b95a46331cfc75217c8202b8086700"}},{"ruleId":"D2","level":"warning","message":{"text":"detectPrefixQuery.detectPrefixQuery (cognitive 20): detectPrefixQuery.detectPrefixQuery has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (17 pts), boolean chains 2, loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/lib/detectPrefixQuery.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"07e135fe359d5814c5c217493deec51cbcb8bb8a1d0e0ea5dafdbde30236d375"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_auth::nip_fi::startup::validate_nip_fi_config (cognitive 19): buzz_auth::nip_fi::startup::validate_nip_fi_config has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (14 pts), loops 5 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-auth/src/nip_fi/startup/mod.rs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bbc3a690050f25e676d857bff8bb19a5b6baf64b6a52bb9cf7a404396bad46a"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_backend_kubernetes::observe::decode_startup (cognitive 19): buzz_backend_kubernetes::observe::decode_startup has cognitive complexity 19 (threshold 15). Drivers by points: match/switch 4 (12 pts), if/else 4 (7 pts) (nesting depth added 11). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-backend-kubernetes/src/observe.rs"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"21a914cfe505e662015c02439219db0c9346c6923123683ad43ca826abe25039"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_backend_kubernetes::gc::plan (cognitive 19): buzz_backend_kubernetes::gc::plan has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (16 pts), loops 1 (2 pts), boolean chains 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-backend-kubernetes/src/gc.rs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"e89a6172c1dbc55b454bcb708b31cca0cb89054011b8b992ab5ca4a043030094"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_cli::commands::messages::cmd_send_message (cognitive 19): buzz_cli::commands::messages::cmd_send_message has cognitive complexity 19 (threshold 15). Drivers by points: if/else 11 (13 pts), match/switch 2 (4 pts), boolean chains 1, loops 1 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/messages.rs"},"region":{"startLine":611}}}],"partialFingerprints":{"codehealthFindingId/v1":"d51cf9bdaf61a857296d06a28d21bf8702009f35c87d5937eb6b9c398f67b44d"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_cli::commands::projects::cmd_update (cognitive 19): buzz_cli::commands::projects::cmd_update has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (11 pts), boolean chains 5, match/switch 1 (3 pts) (nesting depth added 3). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/projects.rs"},"region":{"startLine":588}}}],"partialFingerprints":{"codehealthFindingId/v1":"45ef47143451449b80c1d258ff8d08d30bff65de4c7114966209890e3f3d19d9"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_cli::commands::mem::cmd_ls (cognitive 19): buzz_cli::commands::mem::cmd_ls has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (11 pts), loops 3 (4 pts), match/switch 2 (4 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/buzz-cli/src/commands/mem.rs"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"1aefb1de829cf1c28d2e7bec074c158cd5ae76fd49e2edb5e10a3317914227ee"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_core::git_perms::parse_protection_tag_with_warnings (cognitive 19): buzz_core::git_perms::parse_protection_tag_with_warnings has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (12 pts), match/switch 2 (6 pts), loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-core/src/git_perms.rs"},"region":{"startLine":327}}}],"partialFingerprints":{"codehealthFindingId/v1":"9652ed08983e4ed0a94be45c9eefd729dbcb3d37d6972f16193c57dd11fc8486"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_media::validation::validate_png_metadata_free (cognitive 19): buzz_media::validation::validate_png_metadata_free has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (15 pts), boolean chains 3, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-media/src/validation.rs"},"region":{"startLine":608}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6c753bad92092b0a64d1c70d3de0fea131720124604636d385e0f8c8efaa6f1"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::side_effects::emit_group_discovery_events (cognitive 19): buzz_relay::handlers::side_effects::emit_group_discovery_events has cognitive complexity 19 (threshold 15). Drivers by points: if/else 12 (15 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/side_effects.rs"},"region":{"startLine":1183}}}],"partialFingerprints":{"codehealthFindingId/v1":"c675ca1a59753fc0a28cd55d39a93e4fdcebad11d42fb11d73a9190f7f3cc419"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::api::invites::claim_invite (cognitive 19): buzz_relay::api::invites::claim_invite has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (16 pts), match/switch 2 (3 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/invites.rs"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2df1f175e4eaa4ae32d625fdba07f43b69b67f011f7cfc201f4dda5a807e4c8"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::push_runtime::run_delivery_worker (cognitive 19): buzz_relay::push_runtime::run_delivery_worker has cognitive complexity 19 (threshold 15). Drivers by points: loops 3 (9 pts), match/switch 3 (7 pts), if/else 2 (3 pts) (nesting depth added 11). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/push_runtime.rs"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"19538210f16587d3072a2a3278d7c85b0eb137e718b44f79edcac551a16a1d2e"}},{"ruleId":"D2","level":"warning","message":{"text":"git_sign_nostr::enforce_conditions (cognitive 19): git_sign_nostr::enforce_conditions has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (18 pts), loops 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/git-sign-nostr/src/lib.rs"},"region":{"startLine":591}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d3c1cfc4bb805cf46319317a015484997bcff07a5cc45a07b3a43f1c75cc8c6"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::link_preview::extract_favicon_url (cognitive 19): buzz_desktop::commands::link_preview::extract_favicon_url has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (16 pts), boolean chains 2, loops 1 (nesting depth added 11). 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":"desktop/src-tauri/src/commands/link_preview.rs"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc703f6a53c8f2735135fc7d5220e263fea03710707d8b0d21734776cda46e4a"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::team_catalog::validate_member (cognitive 19): buzz_desktop::managed_agents::team_catalog::validate_member has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (15 pts), loops 2, boolean chains 1, match/switch 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/team_catalog.rs"},"region":{"startLine":496}}}],"partialFingerprints":{"codehealthFindingId/v1":"da2f54e7d8d5e578393e56bb7884b7e67d0200cf8ee71efddd30a715a680cd07"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::huddle::agents::sync_agents_for_active_huddle (cognitive 19): buzz_desktop::huddle::agents::sync_agents_for_active_huddle has cognitive complexity 19 (threshold 15). Drivers by points: if/else 11 (14 pts), loops 4, boolean chains 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/huddle/agents.rs"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"b86603db841a7881248e9bb9e08e0702da3d40951d41bf183ff53792c5dda8e2"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::backend::discover_acp_command_candidates_in (cognitive 19): buzz_desktop::managed_agents::backend::discover_acp_command_candidates_in has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (15 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/backend.rs"},"region":{"startLine":703}}}],"partialFingerprints":{"codehealthFindingId/v1":"44826a81640fd6f1f9da27286f0d1b8adcc07cc793383da593b7b17071dc9c33"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::mesh_llm::discovery::availability_from_events (cognitive 19): buzz_desktop::mesh_llm::discovery::availability_from_events has cognitive complexity 19 (threshold 15). Drivers by points: if/else 12 (17 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":"desktop/src-tauri/src/mesh_llm/discovery.rs"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cc7942cf84ccedc3a24e2d8d10b27f417392baba34636c8a905c80add0ed738"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::runtime::sweep::collect_process_snapshots (cognitive 19): buzz_desktop::managed_agents::runtime::sweep::collect_process_snapshots has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (17 pts), boolean chains 1, loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/runtime/sweep.rs"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c0ae8a7be160ad9821bb3a58134f2e1e680e50be480d7da0d23619c20693c47"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::huddle::preprocessing::expand_numeric_token (cognitive 19): buzz_desktop::huddle::preprocessing::expand_numeric_token has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (18 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":"desktop/src-tauri/src/huddle/preprocessing.rs"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"a05241c483259de3477eaf7dba13ec1bf39c58bce2d951b37c68a86869dc3b29"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::huddle::stt::stt_worker (cognitive 19): buzz_desktop::huddle::stt::stt_worker has cognitive complexity 19 (threshold 15). Drivers by points: match/switch 5 (7 pts), if/else 3 (6 pts), boolean chains 4, loops 1 (2 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/huddle/stt.rs"},"region":{"startLine":444}}}],"partialFingerprints":{"codehealthFindingId/v1":"577f3c2b284a43b8c59a8f682ccec28e942a5678c0dc854e8baf0d1071cb8fac"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::agent_discovery::install_powershell_command (cognitive 19): buzz_desktop::commands::agent_discovery::install_powershell_command has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (15 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":"desktop/src-tauri/src/commands/agent_discovery.rs"},"region":{"startLine":888}}}],"partialFingerprints":{"codehealthFindingId/v1":"4057753fe44173c9b3e034dd83ff6c099c0dc3230988b057e5f9870dde5b0d57"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::channels::get_channel_members (cognitive 19): buzz_desktop::commands::channels::get_channel_members has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (14 pts), loops 2 (4 pts), boolean chains 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/channels.rs"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d9f76f9b1f39f1773dd0497fc12936980658aa09c756bc03acd21e16d9219c7"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::util::replace_with_symlink (cognitive 19): buzz_desktop::util::replace_with_symlink has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (16 pts), match/switch 2 (3 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/util.rs"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"6630833926feca5cfe79fe6cbc0f9396952db74e34937e1d964f990dba7660de"}},{"ruleId":"D2","level":"warning","message":{"text":"exhaustive.test_merge_algebra_b (cognitive 19): exhaustive.test_merge_algebra_b has cognitive complexity 19 (threshold 15). Drivers by points: loops 6 (10 pts), if/else 3 (9 pts) (nesting depth added 10). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/formal/nip-rs-unread/exhaustive.py"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"22d119b15b58047b7b5e05abc0d762bbe6e44353b83efa81cfd6f4527c0eb02d"}},{"ruleId":"D2","level":"warning","message":{"text":"exhaustive._dead_register_points (cognitive 19): exhaustive._dead_register_points has cognitive complexity 19 (threshold 15). Drivers by points: loops 4 (10 pts), if/else 2 (8 pts), boolean chains 1 (nesting depth added 12). 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":"docs/formal/nip-rs-unread/exhaustive.py"},"region":{"startLine":645}}}],"partialFingerprints":{"codehealthFindingId/v1":"b29a7c939cf64e43fe2aead5b17d12f134faa204148263734d35a60098a5fa54"}},{"ruleId":"D2","level":"warning","message":{"text":"exhaustive.test_escaped_context_slot_grouping (cognitive 19): exhaustive.test_escaped_context_slot_grouping has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (12 pts), loops 2 (4 pts), ternaries 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":"docs/formal/nip-rs-unread/exhaustive.py"},"region":{"startLine":1188}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a4c53ed642bcf3be881eea0d23df5a2b8fbffa68abbbfc938dd3f617b0c166a"}},{"ruleId":"D2","level":"warning","message":{"text":"prepare-inter.verify (cognitive 19): prepare-inter.verify has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (14 pts), loops 3 (5 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/scripts/prepare-inter.py"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"23d44e4bdb849dd350e006bbf306e6e54814a4334669a97bfb73de96b0250e6b"}},{"ruleId":"D2","level":"warning","message":{"text":"MP4Canonicalizer.neutralizeSampleDependencyBoxes (cognitive 19): MP4Canonicalizer.neutralizeSampleDependencyBoxes has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (17 pts), boolean chains 1, loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/MP4Canonicalizer.swift"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ff4da483d75040fe49454c3145ca498533683bd28e7c55d47d14e7255ff511d"}},{"ruleId":"D2","level":"warning","message":{"text":"BuzzPushSnapshotBridge.syncCommunities (cognitive 19): BuzzPushSnapshotBridge.syncCommunities has cognitive complexity 19 (threshold 15). Drivers by points: if/else 4 (7 pts), ternaries 2 (6 pts), boolean chains 5, error handling 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":"mobile/ios/Runner/PushSnapshotBridge.swift"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6ee7d951a0de762ef1d19223f7e4e533a0b0e32f94baf8cd542c087804bc735"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelQuickActionsLauncher.build (cognitive 19): ChannelQuickActionsLauncher.build has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (9 pts), ternaries 5, boolean chains 4, match/switch 1 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channels_page/quick_actions_launcher.dart"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"f54488d61214f847a83af54a286432e463d34714d58e4fcc61ddee0c1b61374c"}},{"ruleId":"D2","level":"warning","message":{"text":"_MentionSuggestionInfo.build (cognitive 19): _MentionSuggestionInfo.build has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (12 pts), boolean chains 6, ternaries 1 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/compose_bar/suggestions.dart"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"46bdee22a4dc9e5926605fe85def1d037b1b57735ac12c26a6d0b2d164d449e1"}},{"ruleId":"D2","level":"warning","message":{"text":"_MessageLongPressRegion.build (cognitive 19): _MessageLongPressRegion.build has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (10 pts), boolean chains 3, error handling 2 (3 pts), ternaries 3 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/message_long_press_region.dart"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"85172e41efd994232dee8cb02874032d6b0c50f756db13faf911099cf56d06d2"}},{"ruleId":"D2","level":"warning","message":{"text":"PairingNotifier._pairNipAb (cognitive 19): PairingNotifier._pairNipAb has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (16 pts), error handling 2, 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":"mobile/lib/features/pairing/pairing_provider.dart"},"region":{"startLine":361}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9e723f44c92257e957f3335251ea188b632b6097b895e713b655e9d973c7f50"}},{"ruleId":"D2","level":"warning","message":{"text":"HuddleTransport._handleRoster (cognitive 19): HuddleTransport._handleRoster has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (12 pts), boolean chains 4, loops 3 (nesting depth added 3). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/huddle/huddle_transport.dart"},"region":{"startLine":628}}}],"partialFingerprints":{"codehealthFindingId/v1":"62f610b1c8bbb05c87439636fb86389d3c53d0d65bf3d2d4e94967cc0eed9881"}},{"ruleId":"D2","level":"warning","message":{"text":"useAppShellDesktopNotifications.useAppShellDesktopNotifications (cognitive 19): useAppShellDesktopNotifications.useAppShellDesktopNotifications has cognitive complexity 19 (threshold 15). Drivers by points: if/else 15, boolean chains 4. Most of this is not in the body itself: 1 of the 19 points is its own statement and the rest belongs to 8 function literals inside it that branch (lines 71, 106, 62, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/app/useAppShellDesktopNotifications.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"61591155cf87839ae2321fd7df20ed7400984d72c7dbb212d33489cc52a7f213"}},{"ruleId":"D2","level":"warning","message":{"text":"useAppShellKeyboardShortcuts.useAppShellKeyboardShortcuts (cognitive 19): useAppShellKeyboardShortcuts.useAppShellKeyboardShortcuts has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10, boolean chains 9. Most of this is not in the body itself: 0 of the 19 points are its own statements and the rest belongs to one function literal inside it that branches (line 32). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/app/useAppShellKeyboardShortcuts.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"aff0ee59544da282f407e1f5ee6445f8dafb5831c561dd31b415944dbd1711c6"}},{"ruleId":"D2","level":"warning","message":{"text":"AdminConsoleReportsTab.ResolveReportForm (cognitive 19): AdminConsoleReportsTab.ResolveReportForm has cognitive complexity 19 (threshold 15). Drivers by points: boolean chains 13, if/else 3 (4 pts), error handling 1, ternaries 1 (nesting depth added 1). Most of this is not in the body itself: 8 of the 19 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 391, 444, 389, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/AdminConsoleReportsTab.tsx"},"region":{"startLine":362}}}],"partialFingerprints":{"codehealthFindingId/v1":"1deeaffa6c560dbee3de5242ae1a33679f6b032e75d10430b4d3f416a5d6616b"}},{"ruleId":"D2","level":"warning","message":{"text":"useAutoRestartPolicy.useAutoRestartPolicy (cognitive 19): useAutoRestartPolicy.useAutoRestartPolicy has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (12 pts), error handling 1 (2 pts), loops 2, ternaries 1 (2 pts), boolean chains 1 (nesting depth added 7). Most of this is not in the body itself: 0 of the 19 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 58, 104, 48). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/lib/useAutoRestartPolicy.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"f59f2eb1edf65970f405d4dc94defd5f0ea5e9eced1e00907970f439c6e4789c"}},{"ruleId":"D2","level":"warning","message":{"text":"PersonaAdvancedFields.PersonaAdvancedFields (cognitive 19): PersonaAdvancedFields.PersonaAdvancedFields has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 9, if/else 6 (8 pts), boolean chains 2 (nesting depth added 2). Most of this is not in the body itself: 8 of the 19 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 126, 294, 312, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/PersonaAdvancedFields.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"9be4c992339c929c940ed9de1357624c1ce4deb290b4fc89d4631e2aa8f237ce"}},{"ruleId":"D2","level":"warning","message":{"text":"useManagedAgentRuntimeReconciliation.useManagedAgentRuntimeReconciliation (cognitive 19): useManagedAgentRuntimeReconciliation.useManagedAgentRuntimeReconciliation has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (10 pts), loops 6, boolean chains 3 (nesting depth added 3). Most of this is not in the body itself: 0 of the 19 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 75, 54, 118, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/useManagedAgentRuntimeReconciliation.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"15d03f52d6fe1ce300b4dbb526d0ea302671bb0eb6c38cfdae42b5e01fa9aee8"}},{"ruleId":"D2","level":"warning","message":{"text":"useRoutedMessageEdit.useRoutedMessageEdit (cognitive 19): useRoutedMessageEdit.useRoutedMessageEdit has cognitive complexity 19 (threshold 15). Drivers by points: boolean chains 9, if/else 6, ternaries 4. Most of this is not in the body itself: 3 of the 19 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 71, 58, 55, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/useRoutedMessageEdit.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bfecdc2205b8b002e9aa1ae7c291ceaf03fce45793915fb45ddc7c49feb9e55"}},{"ruleId":"D2","level":"warning","message":{"text":"EditCommunityDialog.EditCommunityDialog (cognitive 19): EditCommunityDialog.EditCommunityDialog has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8, boolean chains 7, error handling 1 (2 pts), ternaries 2 (nesting depth added 1). Most of this is not in the body itself: 6 of the 19 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 70, 55). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/communities/ui/EditCommunityDialog.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"e71e936129fc865585da086b5addd28ea9a8687631cd762a3c752fd0098842c5"}},{"ruleId":"D2","level":"warning","message":{"text":"useHuddleParticipantRoster.useHuddleParticipantRoster (cognitive 19): useHuddleParticipantRoster.useHuddleParticipantRoster has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (8 pts), ternaries 6 (7 pts), boolean chains 4 (nesting depth added 2). Most of this is not in the body itself: 5 of the 19 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 295, 310, 307, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/hooks/useHuddleParticipantRoster.ts"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"d624a8b26b72e4b4cccfdad0b322257c8d3c5dbe6e8397ae1d36bee476e08ef2"}},{"ruleId":"D2","level":"warning","message":{"text":"resolveLinkAt.resolveLinkAt (cognitive 19): resolveLinkAt.resolveLinkAt has cognitive complexity 19 (threshold 15). Drivers by points: boolean chains 7, if/else 7, ternaries 3, loops 2. Of this number, 14 points are the body\u0027s own statements and 5 belong to one function literal inside it that branches. 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":"desktop/src/features/messages/lib/resolveLinkAt.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1908f02d1618fe3cecba75c13c8c385a33ef0e2d6595291f85ad4e114c25c9d"}},{"ruleId":"D2","level":"warning","message":{"text":"useDrafts.readStore (cognitive 19): useDrafts.readStore has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (13 pts), boolean chains 2, loops 1 (2 pts), error handling 1, ternaries 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useDrafts.ts"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0b9234758e2924c35dc9cd89f90e6b11ffc9bea08ee9eca3f08965cef6079c3"}},{"ruleId":"D2","level":"warning","message":{"text":"useComposerVoiceNote.useComposerVoiceNote (cognitive 19): useComposerVoiceNote.useComposerVoiceNote has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9, boolean chains 7, ternaries 2 (3 pts) (nesting depth added 1). Most of this is not in the body itself: 3 of the 19 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 110, 71, 83, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useComposerVoiceNote.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6ce26cdff783a370baaa81a22fe09be8ac242d52a00446672dc356f13b005d5"}},{"ruleId":"D2","level":"warning","message":{"text":"useDraftPersistSnapshot.useDraftPersistLifecycle (cognitive 19): useDraftPersistSnapshot.useDraftPersistLifecycle has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (10 pts), ternaries 5 (8 pts), boolean chains 1 (nesting depth added 4). Most of this is not in the body itself: 0 of the 19 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 184, 229, 257, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useDraftPersistSnapshot.ts"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b8ec2929db88a8659785691c7ac0c601f900840f9f756f120cd2bb6c444232b"}},{"ruleId":"D2","level":"warning","message":{"text":"submitMessageEdit.submitMessageEdit (cognitive 19): submitMessageEdit.submitMessageEdit has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (10 pts), error handling 3 (4 pts), ternaries 3 (4 pts), boolean chains 1 (nesting depth added 5). Most of this is not in the body itself: 9 of the 19 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 187, 146, 139, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/submitMessageEdit.ts"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba4c3b2d31bdb1e5a615d668d0cf00ef48b54981c1c0819b3fdfa482009b4781"}},{"ruleId":"D2","level":"warning","message":{"text":"MessageThreadSummaryRow.MessageThreadSummaryRow (cognitive 19): MessageThreadSummaryRow.MessageThreadSummaryRow has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 9 (13 pts), boolean chains 4, if/else 1 (2 pts) (nesting depth added 5). Of this number, 11 points are the body\u0027s own statements and 8 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/MessageThreadSummaryRow.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"e57b3f18b9ea57629e5ea60fba072ebee0f402683defff3ae2869383804ea46c"}},{"ruleId":"D2","level":"warning","message":{"text":"useComposerHeightPadding.useComposerHeightPadding (cognitive 19): useComposerHeightPadding.useComposerHeightPadding has cognitive complexity 19 (threshold 15). Drivers by points: if/else 11 (14 pts), boolean chains 3, ternaries 2 (nesting depth added 3). Most of this is not in the body itself: 0 of the 19 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 77, 121, 34, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useComposerHeightPadding.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"8111a59d4d9b9be1a45d34152e609e04f88a0e141ae96ae85d7a5b1819365fe1"}},{"ruleId":"D2","level":"warning","message":{"text":"useChannelTyping.useChannelTyping (cognitive 19): useChannelTyping.useChannelTyping has cognitive complexity 19 (threshold 15). Drivers by points: if/else 15, boolean chains 4. Most of this is not in the body itself: 0 of the 19 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 81, 140, 179, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/useChannelTyping.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"24d06f4ada958854dc7e8069829c9dace8f95b47e10fead293e92bb372f7ef09"}},{"ruleId":"D2","level":"warning","message":{"text":"notificationFormat.formatMessageNotification (cognitive 19): notificationFormat.formatMessageNotification has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 7 (16 pts), boolean chains 2, if/else 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":"desktop/src/features/notifications/lib/notificationFormat.ts"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d58311d88b7ace17b4537ddf695d233b9d1a3c4db01bb91608dd9f367119633"}},{"ruleId":"D2","level":"warning","message":{"text":"hooks.useFirstRunOnboardingGate (cognitive 19): hooks.useFirstRunOnboardingGate has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (10 pts), boolean chains 8, ternaries 1 (nesting depth added 1). Most of this is not in the body itself: 0 of the 19 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 324, 391, 310, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/hooks.ts"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"d101694ae99e99ac4582a18ecd0fff8ff3b668cc89a4cc275c8de2e845e1b75d"}},{"ruleId":"D2","level":"warning","message":{"text":"UserProfilePanelTabs.ProfileLiveActivityEmbed (cognitive 19): UserProfilePanelTabs.ProfileLiveActivityEmbed has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 9, if/else 6, boolean chains 4. Most of this is not in the body itself: 6 of the 19 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 382, 364, 430, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/UserProfilePanelTabs.tsx"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3c4630fd697c137cb3965060307b0844f43b71ad5601981b8761555c9a0ceba"}},{"ruleId":"D2","level":"warning","message":{"text":"UserProfilePanelUtils.personaManagedAgentUpdate (cognitive 19): UserProfilePanelUtils.personaManagedAgentUpdate has cognitive complexity 19 (threshold 15). Drivers by points: if/else 11 (14 pts), boolean chains 3, ternaries 2 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/UserProfilePanelUtils.ts"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"8233fd99a61680023701c7e66cd88150d9b7e344ec15d5959b63b091fce61938"}},{"ruleId":"D2","level":"warning","message":{"text":"UserProfilePrimaryActions.ProfilePrimaryActions (cognitive 19): UserProfilePrimaryActions.ProfilePrimaryActions has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 11 (14 pts), boolean chains 4, if/else 1 (nesting depth added 3). Of this number, 18 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. 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":"desktop/src/features/profile/ui/UserProfilePrimaryActions.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"b85373aba8c50d5485b63421835eb7528906adfab776023d25263e0bc8e273b2"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectHomeContextPanel.ProjectHomeContextPanel (cognitive 19): ProjectHomeContextPanel.ProjectHomeContextPanel has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 8 (11 pts), boolean chains 6, if/else 2 (nesting depth added 3). Of this number, 11 points are the body\u0027s own statements and 8 belong to 4 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectHomeContextPanel.tsx"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a558dc17b03ae1dc2e952ae56e74d82b123f5c294b5e628980384c42959c5f1"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectPullRequestFilesChangedPanel.changedFileIconVisual (cognitive 19): ProjectPullRequestFilesChangedPanel.changedFileIconVisual has cognitive complexity 19 (threshold 15). Drivers by points: if/else 16, boolean chains 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":"desktop/src/features/projects/ui/ProjectPullRequestFilesChangedPanel.tsx"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"cab7c4fa33b216374786e3c1cf745f736d892358cd671a5cabaec4ac1ea48348"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectDetailFeedPanels.ContributorsPanel (cognitive 19): ProjectDetailFeedPanels.ContributorsPanel has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 11 (12 pts), boolean chains 6, if/else 1 (nesting depth added 1). Most of this is not in the body itself: 1 of the 19 points is its own statement and the rest belongs to 4 function literals inside it that branch (lines 72, 166, 117, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectDetailFeedPanels.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"eaa2384911839adfb0fa6baeaf4b640ffba85f3bb21fd0bd5c089f18c2249106"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectDetailFeedPanels.ActivityPanel (cognitive 19): ProjectDetailFeedPanels.ActivityPanel has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 8 (13 pts), boolean chains 4, if/else 2 (nesting depth added 5). Of this number, 10 points are the body\u0027s own statements and 9 belong to 2 function literals 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":"desktop/src/features/projects/ui/ProjectDetailFeedPanels.tsx"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"10128081d0332c55e9b09fd7f1a54019eb7bf644494179907f3a0184f94f31be"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectsSectionSearch.ProjectsSectionSearch (cognitive 19): ProjectsSectionSearch.ProjectsSectionSearch has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 11 (14 pts), if/else 3 (4 pts), boolean chains 1 (nesting depth added 4). Of this number, 15 points are the body\u0027s own statements and 4 belong to 3 function literals 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectsSectionSearch.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"2dee4ddc3b8902ef37f9b8b9b01fa096ca9279e587e191e2810ca82ab2ee7bae"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowScheduleFields.WorkflowScheduleFields (cognitive 19): WorkflowScheduleFields.WorkflowScheduleFields has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 10 (12 pts), if/else 3 (6 pts), boolean chains 1 (nesting depth added 5). Most of this is not in the body itself: 8 of the 19 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 150, 84, 100, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/WorkflowScheduleFields.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cfcfab782c8e941338494e134842cdf0ade59d20a71a9a4b8e5e221122af5d5"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::acp::build_codex_config_env (cognitive 18): buzz_acp::acp::build_codex_config_env has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (11 pts), match/switch 3 (5 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/buzz-acp/src/acp.rs"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"339b9263ca41da007852a60b9da0c298124fb795c61df10c3750fb325d072ef4"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::run_relay_observer_publisher (cognitive 18): buzz_acp::run_relay_observer_publisher has cognitive complexity 18 (threshold 15). Drivers by points: if/else 3 (10 pts), match/switch 2 (5 pts), loops 2, boolean chains 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/lib.rs"},"region":{"startLine":1136}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c4aba621f408a9facdb18b3a8888c052c812177166b765b4129947e54626ce2"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::dispatch_pending (cognitive 18): buzz_acp::dispatch_pending has cognitive complexity 18 (threshold 15). Drivers by points: if/else 3 (8 pts), match/switch 4 (8 pts), loops 2 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/lib.rs"},"region":{"startLine":4403}}}],"partialFingerprints":{"codehealthFindingId/v1":"e617b9ce9667f856ccc6ec3c7ec15246342b12ab1e53c3678a5f0e522cd0a060"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_agent::config::pricing_authority (cognitive 18): buzz_agent::config::pricing_authority has cognitive complexity 18 (threshold 15). Drivers by points: if/else 11 (15 pts), boolean chains 2, 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/buzz-agent/src/config.rs"},"region":{"startLine":1012}}}],"partialFingerprints":{"codehealthFindingId/v1":"db1927763085b45b07a8c90fbc5d02c77f6ebc34db359a76cd212ca80e12d977"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_backend_kubernetes::reconcile::try_preflight_gc (cognitive 18): buzz_backend_kubernetes::reconcile::try_preflight_gc has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (15 pts), loops 3 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-backend-kubernetes/src/reconcile.rs"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"efbba5dc34238b45dc4593a9b11d5d1c9853734c61f78856fe6ec5854890f9c7"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_cli::commands::users::search_by_name (cognitive 18): buzz_cli::commands::users::search_by_name has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (14 pts), 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/buzz-cli/src/commands/users.rs"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5fe00b336d0cd3c6776a42db8a52f9c0d60fadcbc844771b2ab094969df1178"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_cli::commands::mem::cmd_patch (cognitive 18): buzz_cli::commands::mem::cmd_patch has cognitive complexity 18 (threshold 15). Drivers by points: if/else 11 (14 pts), boolean chains 2, match/switch 2 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/mem.rs"},"region":{"startLine":538}}}],"partialFingerprints":{"codehealthFindingId/v1":"87bba5a806d5da8b6c1cda69625187bd0df5277df4ba4b745c771721bfa446a4"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_dev_mcp::paths::msys_to_windows (cognitive 18): buzz_dev_mcp::paths::msys_to_windows has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (17 pts), boolean chains 1 (nesting depth added 10). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-dev-mcp/src/paths.rs"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"609bc5d650e5a29859d97043d0764795871e7bd706586e34e79288b7f2fb9230"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_persona::pack::load_pack (cognitive 18): buzz_persona::pack::load_pack has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10 (15 pts), match/switch 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/buzz-persona/src/pack.rs"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad302facd137527648378b0dc48a7c3ad3047602a8605616ff82196635e69e81"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::command_executor::handle_dm_add_member (cognitive 18): buzz_relay::handlers::command_executor::handle_dm_add_member has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (12 pts), loops 3 (5 pts), match/switch 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/command_executor.rs"},"region":{"startLine":431}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a82c815e339b0f19a7e5d994a609cf7c69060306fcc28cca000a31e237037f7"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::command_executor::handle_workflow_trigger (cognitive 18): buzz_relay::handlers::command_executor::handle_workflow_trigger has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (8 pts), match/switch 3 (6 pts), loops 1 (3 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/buzz-relay/src/handlers/command_executor.rs"},"region":{"startLine":815}}}],"partialFingerprints":{"codehealthFindingId/v1":"83e9072f896154918923cf7d9f95ed467ec197ecc6b70d96c423a09c91be20af"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::api::bridge::workflow_webhook (cognitive 18): buzz_relay::api::bridge::workflow_webhook has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (10 pts), match/switch 3 (5 pts), loops 1 (2 pts), boolean chains 1 (nesting depth added 5). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/bridge.rs"},"region":{"startLine":2367}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0015d2c68a6350099711ada3307a787a2a8bd0d55c2886d3e5069d8dc60e28c"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::api::media::upload_blob_result (cognitive 18): buzz_relay::api::media::upload_blob_result has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10 (12 pts), match/switch 3 (5 pts), loops 1 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/media.rs"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ae861e986ff8d1cf14144864c719124468a42e83b9629fe102d4f67a21b1294"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_sdk::builders::validate_project_envelope (cognitive 18): buzz_sdk::builders::validate_project_envelope has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (14 pts), loops 3, match/switch 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-sdk/src/builders.rs"},"region":{"startLine":2292}}}],"partialFingerprints":{"codehealthFindingId/v1":"30f9c0591a28b671ad75f3ed47c09a40ffa8b9e4727c3bf1d36dc23dfc368f10"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_sdk::mentions::extract_at_mentions_with_known (cognitive 18): buzz_sdk::mentions::extract_at_mentions_with_known has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (13 pts), boolean chains 4, 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/buzz-sdk/src/mentions.rs"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"46931231c672dadc91b314b44ce3a973c328e8b423451de1b15beb133b32aa2a"}},{"ruleId":"D2","level":"warning","message":{"text":"git_sign_nostr::do_verify (cognitive 18): git_sign_nostr::do_verify has cognitive complexity 18 (threshold 15). Drivers by points: if/else 14 (18 pts) (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/git-sign-nostr/src/lib.rs"},"region":{"startLine":1099}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec1c5edbd1d853b0a08a3632adcdbb00ec31258c3df93420f6a524545ff431b4"}},{"ruleId":"D2","level":"warning","message":{"text":"DesktopMeshRuntime::start (cognitive 18): DesktopMeshRuntime::start has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (17 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":"desktop/src-tauri/src/mesh_llm/mod.rs"},"region":{"startLine":340}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6dfd711cf79700b1dad2b3254f1127c912fe004d806ffb77de6ae21ba6acff4"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::engrams::get_agent_memory (cognitive 18): buzz_desktop::commands::engrams::get_agent_memory has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (11 pts), match/switch 2 (4 pts), loops 2, 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":"desktop/src-tauri/src/commands/engrams.rs"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa987b77bdebdaa8f588ec3b026b5520a2e7688de218a5890335093447604238"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::runtime::instance_reaper::desktop_is_alive_for_instance (cognitive 18): buzz_desktop::managed_agents::runtime::instance_reaper::desktop_is_alive_for_instance has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (17 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":"desktop/src-tauri/src/managed_agents/runtime/instance_reaper.rs"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb954e11a5fbfb4dd0f2171c77f194b2b52c031f87f142f7baf5ca673f92d8ba"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::runtime::instance_reaper::reap_dead_instance_agents (cognitive 18): buzz_desktop::managed_agents::runtime::instance_reaper::reap_dead_instance_agents has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (15 pts), loops 2, 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":"desktop/src-tauri/src/managed_agents/runtime/instance_reaper.rs"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"2eaf689e1ae5e49670a939d8bc5ec7b15aa2124c06c8cfc8b02e6b262acefd85"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::discovery::login_shell::find_nvm_default_bin (cognitive 18): buzz_desktop::managed_agents::discovery::login_shell::find_nvm_default_bin has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (18 pts) (nesting depth added 12). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/discovery/login_shell.rs"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"11e0a4f49b522d307768a516fca44ee7c702f68ea1fabad9f55c236f6c685ce7"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::backend::discover_provider_candidates (cognitive 18): buzz_desktop::managed_agents::backend::discover_provider_candidates has cognitive complexity 18 (threshold 15). Drivers by points: if/else 4 (14 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/backend.rs"},"region":{"startLine":667}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ddae6db0dfdf54d3963d94b1e5c872ca37d726d78eb6109d9cabc054a888440"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::runtime::lifecycle::sync_managed_agent_processes (cognitive 18): buzz_desktop::managed_agents::runtime::lifecycle::sync_managed_agent_processes has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (13 pts), loops 3, match/switch 1 (2 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/runtime/lifecycle.rs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"30953853206470debae701af654cb79213ba55d8b1f02fa0b8b051c3fa048f29"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::config_bridge::reader::read_config_surface (cognitive 18): buzz_desktop::managed_agents::config_bridge::reader::read_config_surface has cognitive complexity 18 (threshold 15). Drivers by points: if/else 12 (15 pts), boolean chains 1, 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":"desktop/src-tauri/src/managed_agents/config_bridge/reader.rs"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d29f4c96f89f53a6d2da9a2d29666375aa611d9dec5e43e69bfe9a5ecdd053b"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::migration::fold::load_persona_runtimes (cognitive 18): buzz_desktop::migration::fold::load_persona_runtimes has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (15 pts), loops 2 (3 pts) (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/migration/fold.rs"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fa64b4523d5a7dcf554369d243e0d1bc17d740265700336bd7bafe99f501387"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::channels::ensure_starter_channels (cognitive 18): buzz_desktop::commands::channels::ensure_starter_channels has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (12 pts), loops 3 (4 pts), match/switch 1 (2 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/channels.rs"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"07a3d42ebdeda9e72127643f9150c4df53ec2d761e3276ab0c2a4cdd33335268"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::nostr_convert::agent_directory::member_agent_channel_ids_from_events (cognitive 18): buzz_desktop::nostr_convert::agent_directory::member_agent_channel_ids_from_events has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (12 pts), loops 3 (4 pts), boolean chains 2 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/nostr_convert/agent_directory.rs"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d9f27f0b984469a6b5c4110ef154bd7b3f9e114b9d3e0f18752de00a19290b0"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::personas::snapshot::import::confirm_agent_snapshot_import (cognitive 18): buzz_desktop::commands::personas::snapshot::import::confirm_agent_snapshot_import has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (9 pts), match/switch 2 (7 pts), loops 1 (2 pts) (nesting depth added 8). 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":"desktop/src-tauri/src/commands/personas/snapshot/import.rs"},"region":{"startLine":456}}}],"partialFingerprints":{"codehealthFindingId/v1":"2988c54d7c2ccaef0ea01c7273302ec0f8023f38b3eb80fcc665cb15a1fc0030"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::tray_menu::tray_bee_icon (cognitive 18): buzz_desktop::tray_menu::tray_bee_icon has cognitive complexity 18 (threshold 15). Drivers by points: loops 4 (10 pts), if/else 1 (5 pts), boolean chains 3 (nesting depth added 10). Of this number, 15 points are the body\u0027s own statements and 3 belong to one function item inside it that branches. To reduce it, 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":"desktop/src-tauri/src/tray_menu.rs"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"f62ec99228735eb3b308d7b095a53dd560fdb73947151aef41054bd033d527b5"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::huddle::leave_huddle (cognitive 18): buzz_desktop::huddle::leave_huddle has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (17 pts), boolean chains 1 (nesting depth added 10). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/huddle/mod.rs"},"region":{"startLine":597}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d4df1dbbec54b829ecbe2ebf5e595149137f09e3561ca53325aaf318570abfb"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::runtime::orphan_sweep::sweep_orphaned_agent_processes (cognitive 18): buzz_desktop::managed_agents::runtime::orphan_sweep::sweep_orphaned_agent_processes has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (12 pts), boolean chains 4, loops 2 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/runtime/orphan_sweep.rs"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"5efaa82308cbb2ccb1dd31f0421cc8924e47fd05455ebbf254e2b9a303fd8d3f"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::runtime::orphan_sweep::sweep_system_agent_processes (cognitive 18): buzz_desktop::managed_agents::runtime::orphan_sweep::sweep_system_agent_processes has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10 (16 pts), boolean chains 1, loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/runtime/orphan_sweep.rs"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6c2e8ea0654b34f2f1c47721b79adde1847d01e8237f05099c3a678e0eb651f"}},{"ruleId":"D2","level":"warning","message":{"text":"MobileInviteJoinRecovery.ensureStarterChannels (cognitive 18): MobileInviteJoinRecovery.ensureStarterChannels has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (14 pts), error handling 1 (3 pts), loops 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/app.dart"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"685c8413ad235b52cddd0129c0ff4594dad812dc1e53a56e950e542e8ea0331e"}},{"ruleId":"D2","level":"warning","message":{"text":"ObserverRelayNotifier._subscribe (cognitive 18): ObserverRelayNotifier._subscribe has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (12 pts), boolean chains 5, error handling 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/agent_activity/observer_subscription.dart"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4dfee7ed544843f3d9fbb3ea9f0edbf53f8e8459a7f83eee4b511503d8ccd55"}},{"ruleId":"D2","level":"warning","message":{"text":"_ToolItemWidget.build (cognitive 18): _ToolItemWidget.build has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 6 (12 pts), if/else 4 (6 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/agent_activity/transcript_item_widget.dart"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"523e897739ae305655b53cf43da0e8908439f7f4c044ae77fd32bb09a5d91a1f"}},{"ruleId":"D2","level":"warning","message":{"text":"_AttachmentSurfacePanel.build (cognitive 18): _AttachmentSurfacePanel.build has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 8 (9 pts), boolean chains 4, if/else 4, match/switch 1 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/compose_bar/attachments.dart"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"e74e821ab2904b05bcf35cc2d74ac53bf9ddea3569835f9d79d5348fd00e7331"}},{"ruleId":"D2","level":"warning","message":{"text":"_MarkdownEditingController._buildMarkdownSpans (cognitive 18): _MarkdownEditingController._buildMarkdownSpans has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (13 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/compose_bar/markdown_editing_controller.dart"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"eff50f6cb912f5d3c3dd60d644a6b1a4adb82b589380c81381c17c962376773e"}},{"ruleId":"D2","level":"warning","message":{"text":"_InviteLinkSection.build (cognitive 18): _InviteLinkSection.build has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (10 pts), boolean chains 3, ternaries 3, error handling 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":"mobile/lib/features/invites/invite_create_page/invite_link_section.dart"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"44d3e73d951c8f9b23d1d5e16e92b1f2fda1ea1e04d118a4ebb40f385fc157ad"}},{"ruleId":"D2","level":"warning","message":{"text":"_ProfileTextEditSheet.build (cognitive 18): _ProfileTextEditSheet.build has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (8 pts), ternaries 6, boolean chains 2, error handling 2 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/profile/profile_edit_page.dart"},"region":{"startLine":649}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9a0b3095272c58d64aebe8e03b2cd76a74062e70ef911d7586a53607838156a"}},{"ruleId":"D2","level":"warning","message":{"text":"_ProfileTextEditSheet.build (cognitive 18): _ProfileTextEditSheet.build has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (8 pts), ternaries 6, boolean chains 2, error handling 2 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/profile/profile_text_editor.dart"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b7b2f3c1ff1df974bfc710f3bad90f3877dd7d9f0879c2985d47dff166d6cac"}},{"ruleId":"D2","level":"warning","message":{"text":"SettingsProfileHeader.build (cognitive 18): SettingsProfileHeader.build has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 11 (12 pts), boolean chains 4, if/else 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":"mobile/lib/features/profile/settings_profile_header.dart"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"878f1f472644a8b064680121ebb25cf4dac9c802a3a0d1428c72df1b5123f7b3"}},{"ruleId":"D2","level":"warning","message":{"text":"buildMemoryGraph.buildMemoryGraph (cognitive 18): buildMemoryGraph.buildMemoryGraph has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (12 pts), loops 4 (5 pts), ternaries 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agent-memory/lib/buildMemoryGraph.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"a491fc142cdec0b4eea5ed4a16e87a1c4cda0ee43e6fe0e428cfa269b7e08e65"}},{"ruleId":"D2","level":"warning","message":{"text":"MemorySection.MemoryGraphView (cognitive 18): MemorySection.MemoryGraphView has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 10 (11 pts), boolean chains 6, if/else 1 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agent-memory/ui/MemorySection.tsx"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c476db3e833f42f628a0112266d1fbb0b851c02c43b4ee150ccab6ad41a57e8"}},{"ruleId":"D2","level":"warning","message":{"text":"observerRelayStore.appendAgentEvents (cognitive 18): observerRelayStore.appendAgentEvents has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (9 pts), ternaries 4, loops 2 (3 pts), boolean chains 2 (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":"desktop/src/features/agents/observerRelayStore.ts"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a5ebd29193a9f40cbaaa531d96e296ede60dec53c81495949773ab2a90cb828"}},{"ruleId":"D2","level":"warning","message":{"text":"usePersonaSync.fetchOwnerHistoryToExhaustion (cognitive 18): usePersonaSync.fetchOwnerHistoryToExhaustion has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (12 pts), loops 2 (3 pts), ternaries 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":"desktop/src/features/agents/lib/usePersonaSync.ts"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cecc4be4a1287c75cef654e66367f5f8a7d88f0fb7effa4b7bb2149ceb9b296"}},{"ruleId":"D2","level":"warning","message":{"text":"CompactToolSummaryRow.CompactToolSummaryRow (cognitive 18): CompactToolSummaryRow.CompactToolSummaryRow has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 8 (14 pts), boolean chains 3, if/else 1 (nesting depth added 6). Of this number, 16 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentSessionToolItem/CompactToolSummaryRow.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9b5bfbe3383eae56001e4abff7173374798e9dc277864cf2151975d307de2ba"}},{"ruleId":"D2","level":"warning","message":{"text":"observedUnreadStorage.readObservedUnreadFromStorage (cognitive 18): observedUnreadStorage.readObservedUnreadFromStorage has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (11 pts), loops 2 (3 pts), boolean chains 2, error handling 1, ternaries 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":"desktop/src/features/channels/observedUnreadStorage.ts"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4c678e55c70626cbe2d195a3f9a679fcc5ac55b902a0ddc50b76866a0ef62f0"}},{"ruleId":"D2","level":"warning","message":{"text":"huddlePresence.fetchHuddleLifecycleHistory (cognitive 18): huddlePresence.fetchHuddleLifecycleHistory has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 4 (8 pts), if/else 3 (6 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 8). Of this number, 16 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/lib/huddlePresence.ts"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a9f1e550a5cc8b42eb191e16f9992e8e132ebef2133f73644ec864c93cc0fc2"}},{"ruleId":"D2","level":"warning","message":{"text":"mentionPasteBinding.useMentionPasteBinding (cognitive 18): mentionPasteBinding.useMentionPasteBinding has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (11 pts), loops 5 (6 pts), error handling 1 (nesting depth added 4). Most of this is not in the body itself: 0 of the 18 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 215, 252, 194, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/mentionPasteBinding.ts"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"665c4b5ace9c11971fd62c44d314da2c754ffef7a66b9ead029e837986381b55"}},{"ruleId":"D2","level":"warning","message":{"text":"normalizeMentionClipboard.normalizeMentionClipboardContent (cognitive 18): normalizeMentionClipboard.normalizeMentionClipboardContent has cognitive complexity 18 (threshold 15). Drivers by points: if/else 3 (9 pts), ternaries 3 (6 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":"desktop/src/features/messages/lib/normalizeMentionClipboard.ts"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"07403a667b0c9d7ac8705282c0b0f93321b688f72fd4db0ffbdc0600ae304ff9"}},{"ruleId":"D2","level":"warning","message":{"text":"threadPanel.buildDescendantStatsByMessageId (cognitive 18): threadPanel.buildDescendantStatsByMessageId has cognitive complexity 18 (threshold 15). Drivers by points: if/else 4 (10 pts), boolean chains 3, loops 2 (3 pts), ternaries 1 (2 pts) (nesting depth added 8). Of this number, 17 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/threadPanel.ts"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"94d04bcc8e3c80dead5aca18aeb04c66e5fe568c58f3c93c94cea8393211f910"}},{"ruleId":"D2","level":"warning","message":{"text":"useChannelLinks.useChannelLinks (cognitive 18): useChannelLinks.useChannelLinks has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10, boolean chains 4, ternaries 2 (4 pts) (nesting depth added 2). Most of this is not in the body itself: 1 of the 18 points is its own statement and the rest belongs to 9 function literals inside it that branch (lines 157, 80, 87, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useChannelLinks.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdc62efed4dd17d62f19b5935432fbca983763a88a675e3436c722313add1ad0"}},{"ruleId":"D2","level":"warning","message":{"text":"MessageReactions.MessageReactions (cognitive 18): MessageReactions.MessageReactions has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10, boolean chains 6, ternaries 2. Most of this is not in the body itself: 2 of the 18 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 211, 182, 172, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/MessageReactions.tsx"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"de28178248f58ddace922f08df2fee310f5b3aa0156564cd3c5b94710d7ebe62"}},{"ruleId":"D2","level":"warning","message":{"text":"AvatarStep.AvatarStepActions (cognitive 18): AvatarStep.AvatarStepActions has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 7 (15 pts), boolean chains 3 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/AvatarStep.tsx"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"585be566c5cd8cce2ff84fd3e50b553fbd6036de0091f4843a385326d7b5f294"}},{"ruleId":"D2","level":"warning","message":{"text":"AnimatedAvatarBackdropPanel.AnimatedAvatarBackdropPanel (cognitive 18): AnimatedAvatarBackdropPanel.AnimatedAvatarBackdropPanel has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 10 (13 pts), boolean chains 4, if/else 1 (nesting depth added 3). Most of this is not in the body itself: 1 of the 18 points is its own statement and the rest belongs to 2 function literals inside it that branch (lines 38, 64). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/AnimatedAvatarBackdropPanel.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"a11058a3a72758de672c7377ff026b1ac253437e2345154ba707a69aad9a45b3"}},{"ruleId":"D2","level":"warning","message":{"text":"AnimatedAvatarControls.AvatarFilmstripPicker (cognitive 18): AnimatedAvatarControls.AvatarFilmstripPicker has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9, ternaries 7 (9 pts) (nesting depth added 2). Most of this is not in the body itself: 5 of the 18 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 408, 366, 387, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/AnimatedAvatarControls.tsx"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6fa932c9025539672975617c344cc9aefc30551643caa9f3b3ec03e7e5af86d"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectRepositorySource.RepositoryBranchDropdown (cognitive 18): ProjectRepositorySource.RepositoryBranchDropdown has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 8 (12 pts), boolean chains 3, if/else 3 (nesting depth added 4). Of this number, 16 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectRepositorySource.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"a378466be501b751d1eed511e43a17ba0ecaf4dc6e08419819353a59837d3394"}},{"ruleId":"D2","level":"warning","message":{"text":"reminderFilters.groupReminders (cognitive 18): reminderFilters.groupReminders has cognitive complexity 18 (threshold 15). Drivers by points: if/else 11 (17 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":"desktop/src/features/reminders/lib/reminderFilters.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"778384b858a8d52ea798b758bccbc11353521f0f93ec3d5bb87deefc90ef33cf"}},{"ruleId":"D2","level":"warning","message":{"text":"HarnessRow.RuntimeActions (cognitive 18): HarnessRow.RuntimeActions has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 6 (15 pts), boolean chains 3 (nesting depth added 9). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/HarnessRow.tsx"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a1e73ce4c8e36f59d78f420a9008ada5521d43df5fac3954f12190c2f6ca318"}},{"ruleId":"D2","level":"warning","message":{"text":"useCreateChannelForm.useCreateChannelForm (cognitive 18): useCreateChannelForm.useCreateChannelForm has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (10 pts), ternaries 3 (4 pts), boolean chains 3, error handling 1 (nesting depth added 2). Most of this is not in the body itself: 2 of the 18 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 156, 128, 102, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/lib/useCreateChannelForm.ts"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"abe423df4916fd4f23e26b25b285d7f58df905a5cb314fcd17f935f0f1254293"}},{"ruleId":"D2","level":"warning","message":{"text":"SidebarRelayConnectionCard.SidebarRelayConnectionCompactCard (cognitive 18): SidebarRelayConnectionCard.SidebarRelayConnectionCompactCard has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 13 (17 pts), boolean chains 1 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/SidebarRelayConnectionCard.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"67858fb80bbe1831d98f93bd6dff23b2042bcf78f36884b55c067a479845c4ad"}},{"ruleId":"D2","level":"warning","message":{"text":"ReadOnlyRelayClient.handleWsMessage (cognitive 18): ReadOnlyRelayClient.handleWsMessage has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8, boolean chains 7, ternaries 1 (2 pts), error handling 1 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/api/readOnlyRelayClient.ts"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"c666eb378c900336f41e9bd81053ebdce9dadbbb67ddca07ad06fdc2b0b3cc64"}},{"ruleId":"D2","level":"warning","message":{"text":"RelayReconnectController.start (cognitive 18): RelayReconnectController.start has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (12 pts), error handling 3 (4 pts), boolean chains 2 (nesting depth added 4). Of this number, 16 points are the body\u0027s own statements and 2 belong to 3 function literals 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":"desktop/src/shared/api/relayReconnectController.ts"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e04dac844445fceedc02fee241867013ab1ed32e4752c85084f22ef75d2b07d"}},{"ruleId":"D2","level":"warning","message":{"text":"useInlineTooltipPosition.useInlineTooltipPosition (cognitive 18): useInlineTooltipPosition.useInlineTooltipPosition has cognitive complexity 18 (threshold 15). Drivers by points: if/else 13, boolean chains 4, ternaries 1. Most of this is not in the body itself: 0 of the 18 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 19, 41, 95, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/markdown/useInlineTooltipPosition.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"251545639d13801853b1909cf487b7613984cc392d4bc8eaccc4937cf7aceb5a"}},{"ruleId":"D2","level":"warning","message":{"text":"sidebar-action-card.SidebarCompactActionCard (cognitive 18): sidebar-action-card.SidebarCompactActionCard has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 15 (16 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":"desktop/src/shared/ui/sidebar-action-card.tsx"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5a06ca031526e87be33a9c0a7ff370470285606bf9debc69c568751e5ae919c"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::queue::extract_slash_command (cognitive 17): buzz_acp::queue::extract_slash_command has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (7 pts), match/switch 2 (6 pts), boolean chains 3, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/queue.rs"},"region":{"startLine":1119}}}],"partialFingerprints":{"codehealthFindingId/v1":"38f845e7cc82b006fcdcb7327c308a6251bf37e75c26139cc1c917302ca07f2a"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::check_sibling_via_profile (cognitive 17): buzz_acp::check_sibling_via_profile has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 9 (12 pts), if/else 2 (4 pts), loops 1 (nesting depth added 5). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/lib.rs"},"region":{"startLine":796}}}],"partialFingerprints":{"codehealthFindingId/v1":"09de40db9b83f1294b065ffdedf459f991e19c87d905b913463c484b6657c466"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_acp::run_task::run (cognitive 17): buzz_acp::run_task::run has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 11 (14 pts), if/else 3 (nesting depth added 3). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep 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/buzz-acp/src/run_task.rs"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca2f89182a37783756d77d2c29f588771827f063dd3d63465c331d3b07fb446a"}},{"ruleId":"D2","level":"warning","message":{"text":"PkceOAuthTokenSource::acquire (cognitive 17): PkceOAuthTokenSource::acquire has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (13 pts), match/switch 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/buzz-agent/src/auth.rs"},"region":{"startLine":853}}}],"partialFingerprints":{"codehealthFindingId/v1":"afcc2e9058f02d94fdbb17c1603867fa1e45cb25b791cfe2a753b5b41579c85b"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_agent::llm::responses_body (cognitive 17): buzz_agent::llm::responses_body has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (8 pts), match/switch 2 (5 pts), loops 2 (4 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/llm.rs"},"region":{"startLine":862}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8b15f28cdaa00465432ab0f12c3055ee2786f95f85fa30c6d0dca0cda7f180d"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_auth::nip98::verify_nip98_event (cognitive 17): buzz_auth::nip98::verify_nip98_event has cognitive complexity 17 (threshold 15). Drivers by points: if/else 13 (16 pts), boolean chains 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-auth/src/nip98.rs"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"517b82401da6f66c13aa9b47a7b6061037e26c9757a337d23f624b0de41bc42b"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_cli::commands::notes::cmd_get (cognitive 17): buzz_cli::commands::notes::cmd_get has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (14 pts), match/switch 1 (3 pts) (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/notes.rs"},"region":{"startLine":612}}}],"partialFingerprints":{"codehealthFindingId/v1":"e323417366a426b5c7a3612866c267c168106afd6173791a4225ef8ce20dc727"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_cli::commands::issues::reduce_assignment_operations (cognitive 17): buzz_cli::commands::issues::reduce_assignment_operations has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (11 pts), boolean chains 4, loops 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/buzz-cli/src/commands/issues.rs"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"184b15d05e4f51913a9c2d8a040d2dfd56acaa6871e28150128f122f5a2df11b"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_db::store::push::enqueue_wakes (cognitive 17): buzz_db::store::push::enqueue_wakes has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (9 pts), loops 4 (7 pts), boolean chains 1 (nesting depth added 5). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/push.rs"},"region":{"startLine":664}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b00e0de650844a95b65af0beb8cafa9f3b273e97583df1d010111015d29aae9"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_db::store::relay_admin_actions::finalize_success (cognitive 17): buzz_db::store::relay_admin_actions::finalize_success has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10 (16 pts), match/switch 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/relay_admin_actions.rs"},"region":{"startLine":837}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6a7b08250cd42c73077511b9428efa90a919faa5b8eb825d09e9b913d29a8e1"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_dev_mcp::shell::resolve_bash (cognitive 17): buzz_dev_mcp::shell::resolve_bash has cognitive complexity 17 (threshold 15). Drivers by points: if/else 11 (16 pts), boolean chains 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-dev-mcp/src/shell.rs"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"5796d7db45ee0565a4069b5a1ddece95cfa563c9fbca731d709e4ea840dde47e"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaConfig::validate (cognitive 17): MediaConfig::validate 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-media/src/config.rs"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"939fc28d17388af0e4c62d3438eff0588ec414d59aaecddd4a2ca4834dd83a3a"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_pair_relay::validate_nip44_content (cognitive 17): buzz_pair_relay::validate_nip44_content has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (13 pts), match/switch 2 (3 pts), loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-pair-relay/src/lib.rs"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"3735dd99f0d3bfc4eb37cdae352f3c35fe52a6bcb7f386b257700bdf901dc902"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_persona::validate::check_respond_to_value (cognitive 17): buzz_persona::validate::check_respond_to_value has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (11 pts), loops 1 (3 pts), match/switch 2 (3 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-persona/src/validate.rs"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"68f8ace8695c43207bad986cf3ecd9f74d2ca61285ac0825d0634804175a45f1"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::command_executor::persist_command_event (cognitive 17): buzz_relay::handlers::command_executor::persist_command_event has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (9 pts), match/switch 3 (7 pts), boolean chains 1 (nesting depth added 6). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/command_executor.rs"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff951c540211da9b85302094d370bcafa5836746b4d45a857ca30f75cd77e2ee"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::event::filter_fanout_by_access (cognitive 17): buzz_relay::handlers::event::filter_fanout_by_access has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (11 pts), match/switch 3 (4 pts), boolean chains 1, loops 1 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/event.rs"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"862a4886ae6511005b5a61bbe11319e0ebcac2813aa33e62ffeee907f581fc20"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::event::handle_agent_observer_event (cognitive 17): buzz_relay::handlers::event::handle_agent_observer_event has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (10 pts), match/switch 4 (7 pts) (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/buzz-relay/src/handlers/event.rs"},"region":{"startLine":1005}}}],"partialFingerprints":{"codehealthFindingId/v1":"5296af232687f580155d4fecf040b75779bb5d2f40ff199dfe2f2790ef2f406d"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::connection::handle_active_connection (cognitive 17): buzz_relay::connection::handle_active_connection has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (12 pts), loops 2 (3 pts), 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/buzz-relay/src/connection.rs"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"c412b5acf3da7e1ad929785c4fe9e58628bba3727c59d28bbfdeaeb07604f74d"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::ingest::validate_engram_nip44_content (cognitive 17): buzz_relay::handlers::ingest::validate_engram_nip44_content has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (13 pts), match/switch 2 (3 pts), loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":1889}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e8a46e125907b20e4bf84ac392cc2959c7f0abf74b0976d070f0d14fcb0e77e"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::api::bridge::synthesize_presence (cognitive 17): buzz_relay::api::bridge::synthesize_presence has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (8 pts), match/switch 3 (5 pts), boolean chains 2, loops 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/buzz-relay/src/api/bridge.rs"},"region":{"startLine":2554}}}],"partialFingerprints":{"codehealthFindingId/v1":"674fc5ca86ecd9d039d8de900b5df08ea24fdae97e8f90c29e7d5edb0283685e"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay_mesh::runtime::control_stream_exchange (cognitive 17): buzz_relay_mesh::runtime::control_stream_exchange has cognitive complexity 17 (threshold 15). Drivers by points: if/else 2 (6 pts), loops 3 (6 pts), match/switch 2 (5 pts) (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay-mesh/src/runtime.rs"},"region":{"startLine":500}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a7271fbc3e00773faeba6b9005b18b4d01134da9624d06a9d5e60f32a0b0b3d"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_sdk::builders::build_diff_message (cognitive 17): buzz_sdk::builders::build_diff_message has cognitive complexity 17 (threshold 15). Drivers by points: if/else 13 (14 pts), boolean chains 2, match/switch 1 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-sdk/src/builders.rs"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"01f0e142fd799adbffdfb919707e18b3e1cc10d823cf4a890c5ae155d5380589"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_sdk::builders::build_contact_list (cognitive 17): buzz_sdk::builders::build_contact_list has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (15 pts), boolean chains 1, loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into 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/buzz-sdk/src/builders.rs"},"region":{"startLine":970}}}],"partialFingerprints":{"codehealthFindingId/v1":"c92ac765a7853568314ee214c95d6009aac794e400e7fd04f379659c0e6e0aab"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowEngine::on_event (cognitive 17): WorkflowEngine::on_event has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (9 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/buzz-workflow/src/lib.rs"},"region":{"startLine":320}}}],"partialFingerprints":{"codehealthFindingId/v1":"684ab159a87b955dcdb25328d5cdd344608229d15eebe9051b8b88f36e3b3613"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::link_preview::fetch_link_preview_metadata_for_url (cognitive 17): buzz_desktop::commands::link_preview::fetch_link_preview_metadata_for_url has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (15 pts), boolean chains 1, loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/link_preview.rs"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a7ad3be3beaf30f405a2449103a483c56d3459e3713da64ea9aba8e7461ff4a"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::ptt_shortcut::install (cognitive 17): buzz_desktop::ptt_shortcut::install has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (13 pts), match/switch 3, 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":"desktop/src-tauri/src/ptt_shortcut.rs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc18986c808ccef38a1972c51d27518fb7b5f56c477bbcc036160b5e0e4b5417"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::native_relay_client::run_session (cognitive 17): buzz_desktop::native_relay_client::run_session has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 3 (8 pts), loops 3 (5 pts), if/else 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":"desktop/src-tauri/src/native_relay_client.rs"},"region":{"startLine":468}}}],"partialFingerprints":{"codehealthFindingId/v1":"aee17d1a3da82e6cf62fa74f423f5ede59fe153806f8aec8236c5b6e036da7e3"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::personas::snapshot::import::parse_snapshot_payload_from_bytes (cognitive 17): buzz_desktop::commands::personas::snapshot::import::parse_snapshot_payload_from_bytes has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (16 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":"desktop/src-tauri/src/commands/personas/snapshot/import.rs"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"f53502686b285b482cb77ab74c380e5e838911d6c49e72e25684389b63189deb"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::huddle::emit_end_and_archive (cognitive 17): buzz_desktop::huddle::emit_end_and_archive has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (16 pts), boolean chains 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":"desktop/src-tauri/src/huddle/mod.rs"},"region":{"startLine":530}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e38901d88cccee5e4426f9cb2309ca64d563eea72a5e09e20b57497df15a95e"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::agent_env::build_env_map (cognitive 17): buzz_desktop::managed_agents::agent_env::build_env_map has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (13 pts), loops 1 (4 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":"desktop/src-tauri/src/managed_agents/agent_env.rs"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c7bf758068430609fc0f33bd5b55ac1f8a77391bc843b4fddc492a96fce08ec"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::runtime::orphan_sweep::collect_same_instance_orphans (cognitive 17): buzz_desktop::managed_agents::runtime::orphan_sweep::collect_same_instance_orphans has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (15 pts), boolean chains 1, loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/runtime/orphan_sweep.rs"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"6549cb4c0909eb1cedb3fb3b40e46a77a5fcacafd63af78ac9ab1dab54a86ec0"}},{"ruleId":"D2","level":"warning","message":{"text":"AppDelegate.generateVideoPoster (cognitive 17): AppDelegate.generateVideoPoster has cognitive complexity 17 (threshold 15). Drivers by points: if/else 3 (8 pts), error handling 2 (4 pts), loops 1 (2 pts), ternaries 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":"mobile/ios/Runner/AppDelegate.swift"},"region":{"startLine":963}}}],"partialFingerprints":{"codehealthFindingId/v1":"031e838710ed3cff91959b7fa17634e36c8471a953d867b99cf12d3499ae76da"}},{"ruleId":"D2","level":"warning","message":{"text":"ActivityNotifier._subscribeLive (cognitive 17): ActivityNotifier._subscribeLive has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (12 pts), boolean chains 2, loops 1 (2 pts), error handling 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":"mobile/lib/features/activity/activity_provider.dart"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"a602504b72b2fef12919cd2413fab61acb8a273a191185621c1ff81d7af704c1"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelMessagesNotifier._init (cognitive 17): ChannelMessagesNotifier._init has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (14 pts), error handling 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":"mobile/lib/features/channels/channel_messages_provider.dart"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"41d7456f577e04a98cc3105874bcf3ad16c37a38b7042155e1799182d8400d76"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelSectionsManager._publish (cognitive 17): ChannelSectionsManager._publish has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (11 pts), boolean chains 5, error handling 1 (nesting depth added 6). 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":"mobile/lib/features/channels/channel_sections/channel_sections_manager.dart"},"region":{"startLine":461}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecbc45f2b847e441ac1b82d23b6dadf88023e039a5199d9ecd1d8c007af743b7"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelSectionStore.fromJson (cognitive 17): ChannelSectionStore.fromJson has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (8 pts), loops 3 (5 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":"mobile/lib/features/channels/channel_sections/channel_sections_storage.dart"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"09043177673d2f9ab324f71e8f6c0ee65ae18fe551310228053b0ef3b8963fcf"}},{"ruleId":"D2","level":"warning","message":{"text":"_BrowseChannelsSheet.build (cognitive 17): _BrowseChannelsSheet.build has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (9 pts), boolean chains 7, ternaries 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":"mobile/lib/features/channels/channels_page/browse_channels_sheet.dart"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7f5190589a33c9c8e8c4edbb84287341255afc2b907e597138f45cb25ccc94d"}},{"ruleId":"D2","level":"warning","message":{"text":"MembersSheet.build (cognitive 17): MembersSheet.build has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (7 pts), loops 2 (4 pts), boolean chains 3, ternaries 1 (3 pts) (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/members_sheet.dart"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a31d873fa239adc197e939cdf1fe6d36c00483ffbe829d9383a2ad8feacfaa6"}},{"ruleId":"D2","level":"warning","message":{"text":"PairingNotifier._processPayload (cognitive 17): PairingNotifier._processPayload has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (8 pts), boolean chains 6, ternaries 1 (2 pts), error handling 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/pairing/pairing_provider.dart"},"region":{"startLine":712}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cce6ecaa0a7d49646398e5f418d80ebe5c3d94828e3e347121da42363ca231a"}},{"ruleId":"D2","level":"warning","message":{"text":"_SearchBody.build (cognitive 17): _SearchBody.build has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 9, if/else 7 (8 pts) (nesting depth added 1). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/search/search_page.dart"},"region":{"startLine":439}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d6c40eeca790cfb36e3c4f7a968c78bf6f3327c2432ac19b7bd5a4ba170aebf"}},{"ruleId":"D2","level":"warning","message":{"text":"ReadStateManager._mergeEvents (cognitive 17): ReadStateManager._mergeEvents has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (12 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/read_state/read_state_manager.dart"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"d39f8db073186dee41063170101a65d0b677ac0e5bbc65e863ad8b04eb633a21"}},{"ruleId":"D2","level":"warning","message":{"text":"RelaySessionNotifier.queryRelay (cognitive 17): RelaySessionNotifier.queryRelay has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (10 pts), boolean chains 4, loops 1 (2 pts), error handling 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":"mobile/lib/shared/relay/relay_session.dart"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"22d42a71f87889edf55610eb1e1ec58f48062d33609033ff0db9e286b180d548"}},{"ruleId":"D2","level":"warning","message":{"text":"agentSessionTranscript.upsertTool (cognitive 17): agentSessionTranscript.upsertTool has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 4 (7 pts), boolean chains 6, if/else 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":"desktop/src/features/agents/ui/agentSessionTranscript.ts"},"region":{"startLine":607}}}],"partialFingerprints":{"codehealthFindingId/v1":"12f7b89d6837c8f3f71816af1face03cfcd0a1eeda2dda92b5f8fd4649944b73"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentCardViewerDialog.AgentCardGalleryContent (cognitive 17): AgentCardViewerDialog.AgentCardGalleryContent has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 6 (17 pts) (nesting depth added 11). Of this number, 9 points are the body\u0027s own statements and 8 belong to one function literal inside it that branches. 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":"desktop/src/features/agents/ui/AgentCardViewerDialog.tsx"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"f35e0621450ddc3f0beb1943ecb41e24278b5575a9adb9cddc1cb780b8628c1d"}},{"ruleId":"D2","level":"warning","message":{"text":"personaModelDiscoveryStatus.formatModelDiscoveryErrorStatus (cognitive 17): personaModelDiscoveryStatus.formatModelDiscoveryErrorStatus has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10 (14 pts), boolean chains 3 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/personaModelDiscoveryStatus.ts"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ddc65f97dcdc7721d689173460466aed78ff40fb6ffbb53d22ae9c1c6a80d06"}},{"ruleId":"D2","level":"warning","message":{"text":"agentDefinitionSubmitPayload.buildRuntimeModelProviderPayload (cognitive 17): agentDefinitionSubmitPayload.buildRuntimeModelProviderPayload has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 10, ternaries 5 (7 pts) (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":"desktop/src/features/agents/ui/agentDefinitionSubmitPayload.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"965bdbd12d7ce8b98dd143faf978c2caa40dfda3ed58b85f6226289ab598ef20"}},{"ruleId":"D2","level":"warning","message":{"text":"agentSessionTranscriptGrouping.flattenDisplayBlocks (cognitive 17): agentSessionTranscriptGrouping.flattenDisplayBlocks has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (14 pts), loops 2 (3 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/agentSessionTranscriptGrouping.ts"},"region":{"startLine":710}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9bedeb75556620c3493f418cd34fe82af8cfc8af8a59abdbd0f495cb361bd22"}},{"ruleId":"D2","level":"warning","message":{"text":"imetaMediaMarkdown.imetaMediaFromTags (cognitive 17): imetaMediaMarkdown.imetaMediaFromTags has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 6 (12 pts), if/else 2 (3 pts), boolean chains 1, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/imetaMediaMarkdown.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8942e68f69eb74fdf12e5f6c07fdfc798516ae3bb9138e27b2f02ac8b0ed8ca"}},{"ruleId":"D2","level":"warning","message":{"text":"extractMentionPubkeys.extractMentionPubkeys (cognitive 17): extractMentionPubkeys.extractMentionPubkeys has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (9 pts), loops 4 (5 pts), ternaries 1 (2 pts), boolean chains 1 (nesting depth added 7). Of this number, 15 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/extractMentionPubkeys.ts"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ccc31ef73d8e8420ea3e1505dcdfffd98998870a33df8df57ffa396ac524406"}},{"ruleId":"D2","level":"warning","message":{"text":"mentionTokenSpans.findMentionTokenSpans (cognitive 17): mentionTokenSpans.findMentionTokenSpans has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (13 pts), loops 2 (3 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":"desktop/src/features/messages/lib/mentionTokenSpans.ts"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"a07d71c47fde95d5847b3be3fb6dcc72e472e9ba7e40d806e29e717a8299d1fc"}},{"ruleId":"D2","level":"warning","message":{"text":"threadPanel.buildThreadSummaryFromVisibleEntries (cognitive 17): threadPanel.buildThreadSummaryFromVisibleEntries has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (12 pts), loops 3 (5 pts) (nesting depth added 8). Of this number, 15 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/threadPanel.ts"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2e4c771f267eb29ba93602471a0dd52f2f7dad0f7bd6f3288ae2f781eb0823b"}},{"ruleId":"D2","level":"warning","message":{"text":"DiffViewer.DiffViewer (cognitive 17): DiffViewer.DiffViewer has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 7 (10 pts), boolean chains 5, if/else 2 (nesting depth added 3). Most of this is not in the body itself: 4 of the 17 points are its own statements and the rest belongs to one function literal inside it that branches (line 92). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/DiffViewer.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f30675314b749160eb93fd309a4b6a2b87b8c12bdc0ae3c27394427566c846c"}},{"ruleId":"D2","level":"warning","message":{"text":"useComposerLinkPreviews.ComposerLinkPreviewCard (cognitive 17): useComposerLinkPreviews.ComposerLinkPreviewCard has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 9 (13 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":"desktop/src/features/messages/ui/useComposerLinkPreviews.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1495035754a07530bf4ce5c81a0a2b673a07d78ee3a2fc063de5efaecdd09ed"}},{"ruleId":"D2","level":"warning","message":{"text":"UserProfilePanelSections.ProfileHero (cognitive 17): UserProfilePanelSections.ProfileHero has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 12 (15 pts), boolean chains 2 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/UserProfilePanelSections.tsx"},"region":{"startLine":606}}}],"partialFingerprints":{"codehealthFindingId/v1":"496441c539c036831be8454e9e6d27a34c1317c80cb6ca23c0387db915de616e"}},{"ruleId":"D2","level":"warning","message":{"text":"useNoteActions.usePulseNoteActions (cognitive 17): useNoteActions.usePulseNoteActions has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (7 pts), ternaries 3 (6 pts), error handling 4 (nesting depth added 6). Most of this is not in the body itself: 0 of the 17 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 57, 119, 156, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/pulse/lib/useNoteActions.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"980f05a00030c25cb13df8488b5dd16408d87f35e65e125ab64a3a7de35e126e"}},{"ruleId":"D2","level":"warning","message":{"text":"NoteCard.NoteCard (cognitive 17): NoteCard.NoteCard has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 15 (16 pts), if/else 1 (nesting depth added 1). Of this number, 16 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. 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":"desktop/src/features/pulse/ui/NoteCard.tsx"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"27baf122650313c1acd717f2088b1f7e5c998ea06155f5b50d85cc00c4cb65ef"}},{"ruleId":"D2","level":"warning","message":{"text":"parseSearchOperators.parseSearchOperators (cognitive 17): parseSearchOperators.parseSearchOperators has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (16 pts), loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/search/lib/parseSearchOperators.ts"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb079aa8be8299c04ea320fbf6522c2903bb5ec91464c84631899cbc5e5597a0"}},{"ruleId":"D2","level":"warning","message":{"text":"CustomHarnessForm.CustomHarnessForm (cognitive 17): CustomHarnessForm.CustomHarnessForm has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 7 (9 pts), boolean chains 5, if/else 2, error handling 1 (nesting depth added 2). Of this number, 14 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. 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":"desktop/src/features/settings/ui/CustomHarnessForm.tsx"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"9237b2099ccba7a0b5f8d53d1a13f14ae20d84cbaf3b2472646272eadf5d2ce8"}},{"ruleId":"D2","level":"warning","message":{"text":"channelSectionsStorage.parseChannelSectionPayload (cognitive 17): channelSectionsStorage.parseChannelSectionPayload has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 6, ternaries 4 (6 pts), if/else 3 (5 pts) (nesting depth added 4). Most of this is not in the body itself: 5 of the 17 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 43, 74). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/lib/channelSectionsStorage.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"49abeb70b9b7cacc10ac7b45ecae5ffeca48248b13badf28e82b9045e3baf2f3"}},{"ruleId":"D2","level":"warning","message":{"text":"terminalRenderer.resolvePackedColor (cognitive 17): terminalRenderer.resolvePackedColor has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (15 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":"desktop/src/features/terminal/terminalRenderer.ts"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3683f78c36e5bb590c55a42bdd92bb278cc6db9dace1fca0e9fd80ed8ff3505"}},{"ruleId":"D2","level":"warning","message":{"text":"CronExpressionInput.CronExpressionInput (cognitive 17): CronExpressionInput.CronExpressionInput has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 9, if/else 7, ternaries 1. Most of this is not in the body itself: 3 of the 17 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 104, 132, 33, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/CronExpressionInput.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"5500568195309794f090fffe1223b6ce69a6492003d8977918c61e0103f0b131"}},{"ruleId":"D2","level":"warning","message":{"text":"RelayClient.resetConnection (cognitive 17): RelayClient.resetConnection has cognitive complexity 17 (threshold 15). Drivers by points: if/else 11 (12 pts), boolean chains 3, loops 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":"desktop/src/shared/api/relayClientSession.ts"},"region":{"startLine":1124}}}],"partialFingerprints":{"codehealthFindingId/v1":"879a102f8a675069da51b1d8c61637b56ad44ebe5f90b39440e4914259aeb21c"}},{"ruleId":"D2","level":"warning","message":{"text":"deep-link.listenForEntityDeepLinks (cognitive 17): deep-link.listenForEntityDeepLinks has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (13 pts), loops 2 (3 pts), error handling 1 (nesting depth added 7). Most of this is not in the body itself: 0 of the 17 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 293, 319, 289). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/deep-link.ts"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff12f96e0db4f0ab7f742fe5110d405a32d629e3727a6eafe1f09906891d84f2"}},{"ruleId":"D2","level":"warning","message":{"text":"useResolvedLinkPreviews.fetchBuzzEntityMetadata (cognitive 17): useResolvedLinkPreviews.fetchBuzzEntityMetadata has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (7 pts), ternaries 4 (7 pts), boolean chains 3 (nesting depth added 4). Of this number, 16 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/lib/useResolvedLinkPreviews.ts"},"region":{"startLine":436}}}],"partialFingerprints":{"codehealthFindingId/v1":"29bafee00c91c6c316b496bc2ee59f0fbc9dfe477995681c8b0c207a54a2a136"}},{"ruleId":"D2","level":"warning","message":{"text":"remarkSpoilers.groupSpoilers (cognitive 17): remarkSpoilers.groupSpoilers has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (15 pts), boolean chains 1, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/lib/remarkSpoilers.ts"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e05ab86d8533e2748039e3f5693a86846c336fa028d5ddac392832fb8fb20d5"}},{"ruleId":"D2","level":"warning","message":{"text":"segmented-control.SegmentedControl (cognitive 17): segmented-control.SegmentedControl has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8, boolean chains 7, ternaries 2. Most of this is not in the body itself: 2 of the 17 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 121, 83, 105, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/segmented-control.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6568fcd720a13ecfedf806acffba30d815bb6a5f44a5801eedcbe94777793b2"}},{"ruleId":"D2","level":"warning","message":{"text":"ObserverPublishQueue::next_frame (cognitive 16): ObserverPublishQueue::next_frame has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (10 pts), boolean chains 4, loops 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/buzz-acp/src/lib.rs"},"region":{"startLine":1038}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b07ff3a9730b511478b4a720461b86b563da990c53488e5081827701fe09d7f"}},{"ruleId":"D2","level":"warning","message":{"text":"RunCtx::build_handoff_prompt (cognitive 16): RunCtx::build_handoff_prompt has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (13 pts), loops 2, 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/buzz-agent/src/handoff.rs"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9318b4ab24ec35a77ec698ccbe6bacc2768c931e80ebda0d42aad9fb60a8b07"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_agent::llm::openai_body (cognitive 16): buzz_agent::llm::openai_body has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (9 pts), loops 2 (5 pts), match/switch 1 (2 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/llm.rs"},"region":{"startLine":727}}}],"partialFingerprints":{"codehealthFindingId/v1":"63f149084a457b07c5cb322ac52db332065ffb573265e6498ee8fc2c49f9e537"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_agent::llm::parse_openai (cognitive 16): buzz_agent::llm::parse_openai has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (10 pts), loops 1 (3 pts), match/switch 1 (3 pts) (nesting depth added 6). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/llm.rs"},"region":{"startLine":1456}}}],"partialFingerprints":{"codehealthFindingId/v1":"17742693034aafdd4dfcee1928526b7542f84b3d530cec2213f67c05280baee9"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_agent::session_new (cognitive 16): buzz_agent::session_new has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8, match/switch 6 (7 pts), boolean chains 1 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/lib.rs"},"region":{"startLine":432}}}],"partialFingerprints":{"codehealthFindingId/v1":"b709d8ade30ec059033143ced7d2a8146380efc8e4783c0cd0b1f6a389ebfc9c"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_agent::wire::read_bounded_line (cognitive 16): buzz_agent::wire::read_bounded_line 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/buzz-agent/src/wire.rs"},"region":{"startLine":387}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fa74764a9c9b0780d30e137a28dba93ad18ca203a6bdfc8907f056e49ce8fa8"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_cli::commands::projects::cmd_create (cognitive 16): buzz_cli::commands::projects::cmd_create has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10 (13 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/projects.rs"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec46657a1a369d9413b216eccce082a874a220c6a649a49ec1fca7040b5a7f57"}},{"ruleId":"D2","level":"warning","message":{"text":"EffectiveRules::for_ref (cognitive 16): EffectiveRules::for_ref has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (9 pts), boolean chains 3, match/switch 1 (3 pts), loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-core/src/git_perms.rs"},"region":{"startLine":471}}}],"partialFingerprints":{"codehealthFindingId/v1":"442b1f0c10b84d8a1c184a27a326adb2d32095d9dd66b78fa403d309426d7e8d"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_core::private_managed_agent::validate_envelope (cognitive 16): buzz_core::private_managed_agent::validate_envelope 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-core/src/private_managed_agent.rs"},"region":{"startLine":262}}}],"partialFingerprints":{"codehealthFindingId/v1":"b599abfcf9778fbceba9aee72d3835b98f7a399bb9a371027bf3d0649ab9344b"}},{"ruleId":"D2","level":"warning","message":{"text":"Db::route_read (cognitive 16): Db::route_read has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (9 pts), match/switch 5 (7 pts) (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/buzz-db/src/runtime/mod.rs"},"region":{"startLine":1273}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2031119505ff6d70fed9926b3d5aa641f4a8aef948ed6c5e9c2a1f4c1c0c5f9"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_dev_mcp::shell::read_capped (cognitive 16): buzz_dev_mcp::shell::read_capped has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (13 pts), match/switch 1 (2 pts), loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-dev-mcp/src/shell.rs"},"region":{"startLine":863}}}],"partialFingerprints":{"codehealthFindingId/v1":"c845d4b529adc0079517ed4f74b0f5823cdb98f574d56f4f26d65e035d8dab98"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_media::bucket_index::sweep_bucket_taxonomy (cognitive 16): buzz_media::bucket_index::sweep_bucket_taxonomy has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (11 pts), loops 2 (3 pts), match/switch 1 (2 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-media/src/bucket_index.rs"},"region":{"startLine":837}}}],"partialFingerprints":{"codehealthFindingId/v1":"fce072eb7450c7289322009f74db5f8585ba063eea9cc32416fb31bef9a9ab8f"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_pairing_cli::cmd_target (cognitive 16): buzz_pairing_cli::cmd_target has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (9 pts), match/switch 3 (5 pts), loops 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/buzz-pairing-cli/src/main.rs"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"96f42c1bafda8f2ffda188769f52a594dcb21a20e66f7f0b7270c154be11de5c"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_pairing_cli::wait_for_eose (cognitive 16): buzz_pairing_cli::wait_for_eose has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (14 pts), boolean chains 1, loops 1 (nesting depth added 10). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-pairing-cli/src/main.rs"},"region":{"startLine":529}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed8ef4f86c3a3c09a6e7172b00367a7988baa579c7fa339f6b1ef96bedb4ef30"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_persona::pack::resolve_skills (cognitive 16): buzz_persona::pack::resolve_skills has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (10 pts), loops 4 (6 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-persona/src/pack.rs"},"region":{"startLine":249}}}],"partialFingerprints":{"codehealthFindingId/v1":"48843bc6ce06b0ac48238df52aa79e4a939a3ce8ad7d7cde05a2438416cac306"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_persona::resolve::merge_mcp_servers (cognitive 16): buzz_persona::resolve::merge_mcp_servers has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (12 pts), loops 2 (4 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-persona/src/resolve.rs"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c498d4d8e4aaba401c4754dff2926deb3d71b4c5231b3e1b421dcc3e248a661"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::command_executor::handle_workflow_def (cognitive 16): buzz_relay::handlers::command_executor::handle_workflow_def has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (12 pts), match/switch 3, boolean chains 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/buzz-relay/src/handlers/command_executor.rs"},"region":{"startLine":641}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e0d2c91ef8c596c26f75c728a86459e5533ed3779fcca5680265196d8763870"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::api::git::cas_publish::capture_compacted_packs (cognitive 16): buzz_relay::api::git::cas_publish::capture_compacted_packs has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (13 pts), loops 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/buzz-relay/src/api/git/cas_publish.rs"},"region":{"startLine":666}}}],"partialFingerprints":{"codehealthFindingId/v1":"c774a4ec307b129356cfe144a350dcdf8de5e3d0436906a9b550d33908b2c08b"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_relay::handlers::req::handle_huddle_liveness_req (cognitive 16): buzz_relay::handlers::req::handle_huddle_liveness_req has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 4 (8 pts), if/else 5 (7 pts), loops 1 (nesting depth added 6). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/req.rs"},"region":{"startLine":1180}}}],"partialFingerprints":{"codehealthFindingId/v1":"e959d711c985a93ff379db8f9cc63c4f97ea802f97a2d03e5a9b82a00464f4f1"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_sdk::builders::build_git_status (cognitive 16): buzz_sdk::builders::build_git_status has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6, loops 4 (6 pts), boolean chains 2, match/switch 1 (2 pts) (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/buzz-sdk/src/builders.rs"},"region":{"startLine":1553}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d15404bc310807a36c6df8c83a114c9d73a21446b64edb1d0abd2c0c42e9bf5"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_search::query::search (cognitive 16): buzz_search::query::search has cognitive complexity 16 (threshold 15). Drivers by points: if/else 11 (13 pts), boolean chains 1, loops 1, match/switch 1 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-search/src/query.rs"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d7f6bfd4ddb9ff212345c2a1907bfb118e72624c4df7c576460626d03231604"}},{"ruleId":"D2","level":"warning","message":{"text":"NostrWsConnection::wait_for_auth_challenge (cognitive 16): NostrWsConnection::wait_for_auth_challenge has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (8 pts), match/switch 3 (7 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/buzz-ws-client/src/connection.rs"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"c96d2908c4387eadc454563493bf2f4877bba1687c676f038a7bfaff9f867b8a"}},{"ruleId":"D2","level":"warning","message":{"text":"git_sign_nostr::do_sign (cognitive 16): git_sign_nostr::do_sign has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (13 pts), match/switch 2 (3 pts) (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/git-sign-nostr/src/lib.rs"},"region":{"startLine":943}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3ad0fd290f392afb7fa696694b790e19ea1398e91e552f4aea13757cedcc079"}},{"ruleId":"D2","level":"warning","message":{"text":"VadEndpoint::process_frame (cognitive 16): VadEndpoint::process_frame has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10 (13 pts), loops 1 (2 pts), boolean chains 1 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/huddle/stt.rs"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"211cb7f892c523fa69a63dd103be42322e0fa9453b23ca16dc554e31e3bd6bbd"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::mesh_llm::recovery::rearm_relay_mesh_for_running_agents (cognitive 16): buzz_desktop::mesh_llm::recovery::rearm_relay_mesh_for_running_agents has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (12 pts), match/switch 2 (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":"desktop/src-tauri/src/mesh_llm/recovery.rs"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"133336e834754079c56bea45399880ce1f11f269b7957b3aed745140fe8208fc"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::runtime::instance_reaper::extract_buzz_marker_value (cognitive 16): buzz_desktop::managed_agents::runtime::instance_reaper::extract_buzz_marker_value has cognitive complexity 16 (threshold 15). Drivers by points: loops 6 (8 pts), boolean chains 5, if/else 2 (3 pts) (nesting depth added 3). 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":"desktop/src-tauri/src/managed_agents/runtime/instance_reaper.rs"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcef3c8e2e1542e53912b7bbbf14148a3b39f4abf76f2286bc0342abe0372377"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::runtime::instance_reaper::desktop_is_alive_for_instance (cognitive 16): buzz_desktop::managed_agents::runtime::instance_reaper::desktop_is_alive_for_instance has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (15 pts), loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/runtime/instance_reaper.rs"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8374621fa5563c51e95fcb1402e84a5e56169c77ce58e290f42c7cc4d21f4fc"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::media_animated::animated_webp_uses_exif_orientation (cognitive 16): buzz_desktop::commands::media_animated::animated_webp_uses_exif_orientation 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":"desktop/src-tauri/src/commands/media_animated.rs"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c3e1a45d6aca691c495096864cd67e72d7e179d81e4e0c24c7807e123db0667"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::managed_agents::backend::split_config_key (cognitive 16): buzz_desktop::managed_agents::backend::split_config_key has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (11 pts), boolean chains 4, 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":"desktop/src-tauri/src/managed_agents/backend.rs"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec667047fa50f425fc34396adb431d6cbe3821754220946d5c237ac40d2e40c6"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::pairing::wait_for_eose (cognitive 16): buzz_desktop::commands::pairing::wait_for_eose has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (14 pts), boolean chains 1, loops 1 (nesting depth added 10). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/pairing.rs"},"region":{"startLine":758}}}],"partialFingerprints":{"codehealthFindingId/v1":"55ff71e6f8f7043aaec73f9712487b219e80abba9aabfa088ae892b2c727fd68"}},{"ruleId":"D2","level":"warning","message":{"text":"buzz_desktop::commands::agent_auth::terminal_auth_meta_command (cognitive 16): buzz_desktop::commands::agent_auth::terminal_auth_meta_command has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (12 pts), loops 2 (4 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":"desktop/src-tauri/src/commands/agent_auth.rs"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"50730c214784d226f6acf83a6433f956d310912aeec1d2e95d3e70aef7f2f127"}},{"ruleId":"D2","level":"warning","message":{"text":"MainActivity.handleTranscodeVideoToMp4 (cognitive 16): MainActivity.handleTranscodeVideoToMp4 has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 6, if/else 3 (6 pts), error handling 2, loops 2 (nesting depth added 3). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/android/app/src/main/kotlin/xyz/block/buzz/mobile/MainActivity.kt"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a9ee21e5beef1344d78a3dc12d27df00a3d66cd1a2ec527fbfa483a6b7108bb"}},{"ruleId":"D2","level":"warning","message":{"text":"exhaustive.check_convergence (cognitive 16): exhaustive.check_convergence has cognitive complexity 16 (threshold 15). Drivers by points: loops 5 (9 pts), if/else 4 (7 pts) (nesting depth added 7). 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":"docs/formal/nip-rs-unread/exhaustive.py"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd010e7bf77a80f522cd3da844bcf79281854f98936622c94dff4abc3a02a64f"}},{"ruleId":"D2","level":"warning","message":{"text":"BuzzPushPresentationCacheStore.normalizedAvatarURL (cognitive 16): BuzzPushPresentationCacheStore.normalizedAvatarURL has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 8, if/else 6 (8 pts) (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":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushPresentationCache.swift"},"region":{"startLine":563}}}],"partialFingerprints":{"codehealthFindingId/v1":"021b95212100597a7f987e4e4f0132b5227c089aa5131d82a38c1f06b09d1dde"}},{"ruleId":"D2","level":"warning","message":{"text":"ActivityNotifier._drainRefreshQueue (cognitive 16): ActivityNotifier._drainRefreshQueue has cognitive complexity 16 (threshold 15). Drivers by points: if/else 3 (10 pts), error handling 1 (3 pts), loops 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":"mobile/lib/features/activity/activity_provider.dart"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"710996f47789d3bbdb7c23d9b55a8355f1d88c95ef976adaa5d781b3678bb3fb"}},{"ruleId":"D2","level":"warning","message":{"text":"_MobileHuddleDrawer.build (cognitive 16): _MobileHuddleDrawer.build has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 8, boolean chains 4, if/else 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":"mobile/lib/features/channels/channel_detail_page/huddle_drawer.dart"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"3156a13be51a5dd6965aee280c8cb3bb742498a3c4c83463e49ca248e16556fe"}},{"ruleId":"D2","level":"warning","message":{"text":"MobileHuddleController._finishLeaveLifecycle (cognitive 16): MobileHuddleController._finishLeaveLifecycle has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (8 pts), error handling 3 (5 pts), boolean chains 3 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/mobile_huddle_controller.dart"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ca65de1ba9038a6904834939753cc6733a2709d016d06e6ea7899c13607e63e"}},{"ruleId":"D2","level":"warning","message":{"text":"_DynamicIslandQrScannerPortal.build (cognitive 16): _DynamicIslandQrScannerPortal.build has cognitive complexity 16 (threshold 15). Drivers by points: if/else 11, boolean chains 3, ternaries 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":"mobile/lib/features/pairing/pairing_qr_scanner/dynamic_island_portal.dart"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"9140ec01c57ecbaf3d50343ffac1ced0ecc8567f50f5c97909d15e99215ef65b"}},{"ruleId":"D2","level":"warning","message":{"text":"_FigmaHomeScreen.build (cognitive 16): _FigmaHomeScreen.build has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 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":"mobile/lib/features/settings/theme_picker_page/theme_home_preview.dart"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e587d3aeb590538bd74b289e2adf1056c017dbe07b9633cf75d5d8cf77eab05"}},{"ruleId":"D2","level":"warning","message":{"text":"check-px-text-core.runPxTextCheck (cognitive 16): check-px-text-core.runPxTextCheck 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). Of this number, 11 points are the body\u0027s own statements and 5 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/check-px-text-core.mjs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b9cf8d6a62e611004d8a9c9020b12e09ac665505209cbbfdfe192424b6f0625"}},{"ruleId":"D2","level":"warning","message":{"text":"useBackForwardControls.useBackForwardControls (cognitive 16): useBackForwardControls.useBackForwardControls has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10 (12 pts), boolean chains 2, loops 1 (2 pts) (nesting depth added 3). Most of this is not in the body itself: 0 of the 16 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 33, 47, 74, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/app/navigation/useBackForwardControls.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"02ac66215c98dbabd52aa42b8fd2036a415aba1347c3d966556e3d47117eeb56"}},{"ruleId":"D2","level":"warning","message":{"text":"AdminConsolePanelHelpers.parseImetaAttachments (cognitive 16): AdminConsolePanelHelpers.parseImetaAttachments has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (8 pts), loops 2 (3 pts), ternaries 1 (3 pts), boolean chains 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/AdminConsolePanelHelpers.tsx"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f0100d6624b23c919086281a0fa9ff1ffe2e683fbe7f7fe7448555ef609770d"}},{"ruleId":"D2","level":"warning","message":{"text":"MemorySection.MemoryEntryAccordion (cognitive 16): MemorySection.MemoryEntryAccordion has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 7, ternaries 6 (7 pts), if/else 2 (nesting depth added 1). Of this number, 12 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. 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":"desktop/src/features/agent-memory/ui/MemorySection.tsx"},"region":{"startLine":526}}}],"partialFingerprints":{"codehealthFindingId/v1":"853c429cb9b911975841f3897771b858fb6348d48ba780df40e3fd9054e66d7b"}},{"ruleId":"D2","level":"warning","message":{"text":"agentSessionToolClassifier.classifyDeveloperHarnessTool (cognitive 16): agentSessionToolClassifier.classifyDeveloperHarnessTool has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (10 pts), ternaries 3 (6 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":"desktop/src/features/agents/ui/agentSessionToolClassifier.ts"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"67c0bf8fa4c2377a65601b2c5d2f70ba6905b51786725e4a8f3325023cb72bab"}},{"ruleId":"D2","level":"warning","message":{"text":"observerRelayStore.handleRelayObserverEvent (cognitive 16): observerRelayStore.handleRelayObserverEvent has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (11 pts), boolean chains 2, ternaries 1 (2 pts), error handling 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/observerRelayStore.ts"},"region":{"startLine":545}}}],"partialFingerprints":{"codehealthFindingId/v1":"24a2aee37fccb78f82573bbd8bf7a4c55a28f4430a2b2213fc4ff4d51c934e6b"}},{"ruleId":"D2","level":"warning","message":{"text":"ManagedAgentRow.AgentSummary (cognitive 16): ManagedAgentRow.AgentSummary has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 13 (16 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/ManagedAgentRow.tsx"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"909adaaef5d7c49413e097ff66f2fcd6f1c91f37b1220a5563c3276c89da4e29"}},{"ruleId":"D2","level":"warning","message":{"text":"teamSnapshotImport.lib.deriveImportToast (cognitive 16): teamSnapshotImport.lib.deriveImportToast has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 4 (10 pts), if/else 3 (5 pts), boolean chains 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/teamSnapshotImport.lib.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8a79d0ca90bb0eb869d3c1734dd33ab078cc3efbb8485f96615b2118f85d7e8"}},{"ruleId":"D2","level":"warning","message":{"text":"ManagedAgentSessionPanel.SessionBody (cognitive 16): ManagedAgentSessionPanel.SessionBody has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 6 (12 pts), boolean chains 3, if/else 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":"desktop/src/features/agents/ui/ManagedAgentSessionPanel.tsx"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"341f3114b195030b0ccb7560c4ccac31d1281f5d35e1245cbed5aabf590c860c"}},{"ruleId":"D2","level":"warning","message":{"text":"useHuddleReadMarker.useHuddleReadMarker (cognitive 16): useHuddleReadMarker.useHuddleReadMarker has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 5 (6 pts), if/else 4 (5 pts), boolean chains 4, loops 1 (nesting depth added 2). Most of this is not in the body itself: 2 of the 16 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 67, 29, 45, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/useHuddleReadMarker.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"59c212c228f931022fd5f3ab4576642837b70d2bc9ec3814d644d11f7295d2af"}},{"ruleId":"D2","level":"warning","message":{"text":"AddCommunityDialog.AddCommunityDialog (cognitive 16): AddCommunityDialog.AddCommunityDialog has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 8 (11 pts), if/else 4, boolean chains 1 (nesting depth added 3). Of this number, 11 points are the body\u0027s own statements and 5 belong to 3 function literals 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":"desktop/src/features/communities/ui/AddCommunityDialog.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"cee87e33ca41c5dcd4d7af58330e3de1c12994a70a2ab8a6f7dd5b4fc4ad88d0"}},{"ruleId":"D2","level":"warning","message":{"text":"useCommunities.resolveCommunityUpdateResult (cognitive 16): useCommunities.resolveCommunityUpdateResult has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 13, if/else 3. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/communities/useCommunities.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4b4624ced3e665652fdf4d902c13b89b4d3dcd1bc9c136a3cc2850049e8dd29"}},{"ruleId":"D2","level":"warning","message":{"text":"inbox.buildInboxItems (cognitive 16): inbox.buildInboxItems has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 6 (9 pts), boolean chains 3, if/else 2 (3 pts), loops 1 (nesting depth added 4). Most of this is not in the body itself: 4 of the 16 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 538, 543). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/lib/inbox.ts"},"region":{"startLine":462}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0eb64dabf3093b5f17287b24e6e93868ddfa7656df3c6b53e3e45b4d3ea9a65"}},{"ruleId":"D2","level":"warning","message":{"text":"rowHeightEstimate.estimateRowHeight (cognitive 16): rowHeightEstimate.estimateRowHeight has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (8 pts), boolean chains 3, loops 2 (3 pts), ternaries 2 (nesting depth added 4). Of this number, 15 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/rowHeightEstimate.ts"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ee55ac7bf3f9c2870f424ea77390c36e4ffd64fce1b366bfa038387aa3c3f13"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelIntroBlock.ChannelIntroBlock (cognitive 16): ChannelIntroBlock.ChannelIntroBlock has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 9 (16 pts) (nesting depth added 7). Most of this is not in the body itself: 3 of the 16 points are its own statements and the rest belongs to one function literal inside it that branches (line 70). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/ChannelIntroBlock.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"828a41e04ea499460cf5406502e7656ac5bcbc147f735f3d492405770b50a0e4"}},{"ruleId":"D2","level":"warning","message":{"text":"NonMemberMentionDialog.NonMemberMentionDialog (cognitive 16): NonMemberMentionDialog.NonMemberMentionDialog has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 9 (13 pts), if/else 2, boolean chains 1 (nesting depth added 4). Of this number, 14 points are the body\u0027s own statements and 2 belong to 2 function literals 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":"desktop/src/features/messages/ui/NonMemberMentionDialog.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"100397c84640b32c63ad13b0b1b9975a88d33f2def53c4db63c57f4beaee363c"}},{"ruleId":"D2","level":"warning","message":{"text":"SelectionFormattingTray.SelectionFormattingTray (cognitive 16): SelectionFormattingTray.SelectionFormattingTray has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10, boolean chains 4, ternaries 2. Most of this is not in the body itself: 3 of the 16 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 224, 129, 189, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/SelectionFormattingTray.tsx"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"c267f98540d934821d7dd926ff79054c24bbfe47d9e495e3813b7028f3694024"}},{"ruleId":"D2","level":"warning","message":{"text":"SystemMessageRow.describeGroupedArrivals (cognitive 16): SystemMessageRow.describeGroupedArrivals has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (11 pts), boolean chains 5 (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":"desktop/src/features/messages/ui/SystemMessageRow.tsx"},"region":{"startLine":361}}}],"partialFingerprints":{"codehealthFindingId/v1":"82eb3b779443897e5fe3fad0c1364977825efa48e65130ffdc0f348c1927fdc1"}},{"ruleId":"D2","level":"warning","message":{"text":"TimelineMessageRow.MessageRowItem (cognitive 16): TimelineMessageRow.MessageRowItem has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 7 (10 pts), boolean chains 5, if/else 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":"desktop/src/features/messages/ui/TimelineMessageRow.tsx"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b9702e7ef8d2c68a51d4e86161bc27fb33228947d7a094c94a74c18b41fd262"}},{"ruleId":"D2","level":"warning","message":{"text":"UserProfilePanelFocusedViews.ChannelsFocusedView (cognitive 16): UserProfilePanelFocusedViews.ChannelsFocusedView has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 8 (16 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":"desktop/src/features/profile/ui/UserProfilePanelFocusedViews.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"e35c569d776f917179fa9ae1e746ad5ec5f4899fc2714c3c8c6df7492aa29be9"}},{"ruleId":"D2","level":"warning","message":{"text":"CreateProjectFormSettings.CreateProjectFormSettings (cognitive 16): CreateProjectFormSettings.CreateProjectFormSettings has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 11, ternaries 5. Of this number, 12 points are the body\u0027s own statements and 4 belong to 4 function literals inside it that branch. 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":"desktop/src/features/projects/ui/CreateProjectFormSettings.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dd4a8873bed891a025d4946201e0620be95d238ccefc73d5627f5bce6152478"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectBrowserDialog.ProjectBrowserDialog (cognitive 16): ProjectBrowserDialog.ProjectBrowserDialog has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 5 (11 pts), if/else 3, boolean chains 2 (nesting depth added 6). Of this number, 8 points are the body\u0027s own statements and 8 belong to 4 function literals 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":"desktop/src/features/projects/ui/ProjectBrowserDialog.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f076a1e0db15b6b7f208e31507c1f19ddcc1524fd988f8009b4160c93df813f"}},{"ruleId":"D2","level":"warning","message":{"text":"SettingsPanels.useThemeCategories (cognitive 16): SettingsPanels.useThemeCategories has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (14 pts), loops 2 (nesting depth added 7). Most of this is not in the body itself: 0 of the 16 points are its own statements and the rest belongs to one function literal inside it that branches (line 278). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/SettingsPanels.tsx"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"f18a83fa90c4e87a26705ea84c96a341d7d89970181247d6cd4cbe618a0f4640"}},{"ruleId":"D2","level":"warning","message":{"text":"SettingsView.SettingsView (cognitive 16): SettingsView.SettingsView has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (8 pts), ternaries 5, boolean chains 3 (nesting depth added 1). Most of this is not in the body itself: 5 of the 16 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 134, 181, 187, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/SettingsView.tsx"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2d03ffabd7fd7df7ee24474f6ecd17ee58a145d148091e20cf57c886e3926f8"}},{"ruleId":"D2","level":"warning","message":{"text":"useStaleReaderRecovery.useStaleReaderRecovery (cognitive 16): useStaleReaderRecovery.useStaleReaderRecovery has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10 (13 pts), boolean chains 2, ternaries 1 (nesting depth added 3). Most of this is not in the body itself: 0 of the 16 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 89, 106, 127, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/lib/useStaleReaderRecovery.ts"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"a75890f30c86c9973ba0da8b039193849ac84f0d49ccecd26a93bddf854575f9"}},{"ruleId":"D2","level":"warning","message":{"text":"CustomChannelSection.SectionActionsMenu (cognitive 16): CustomChannelSection.SectionActionsMenu has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 10 (13 pts), boolean chains 3 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/CustomChannelSection.tsx"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"67397456749fcd59c626a8b598f097be2f8a566cb30c0d1bdb85e16522c12683"}},{"ruleId":"D2","level":"warning","message":{"text":"deep-link.drainPendingNavigationDeepLinks (cognitive 16): deep-link.drainPendingNavigationDeepLinks has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (7 pts), ternaries 2 (5 pts), boolean chains 3, 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":"desktop/src/shared/deep-link.ts"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb95b78d34d723ef47787038d2f8576d567ac24e6405a41bf2934d7b0026d84b"}},{"ruleId":"D2","level":"warning","message":{"text":"resolveMentionNames.resolveMentionProps (cognitive 16): resolveMentionNames.resolveMentionProps has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (8 pts), loops 4 (5 pts), ternaries 2, 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":"desktop/src/shared/lib/resolveMentionNames.ts"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"3687794a1f6ea2de60d4b3d3890a084fc2fcc0bd808bf90df3161f6d5d7b5315"}},{"ruleId":"D2","level":"warning","message":{"text":"adaptive-theme.findColorWithLuminance (cognitive 16): adaptive-theme.findColorWithLuminance has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (14 pts), loops 1, ternaries 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/theme/adaptive-theme.ts"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb0ad2043793933fb0e47a6d9ce389d22384b8a618e9553cb1ee0bba6c19a411"}},{"ruleId":"D2","level":"warning","message":{"text":"EmojiBurstProvider.EmojiBurstProvider (cognitive 16): EmojiBurstProvider.EmojiBurstProvider has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (10 pts), boolean chains 4, loops 2 (nesting depth added 1). Most of this is not in the body itself: 0 of the 16 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 567, 671, 686, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/EmojiBurstProvider.tsx"},"region":{"startLine":556}}}],"partialFingerprints":{"codehealthFindingId/v1":"777b5840a8f3db26167c316ea6ae404779446680a044e5c98b96519b05552525"}},{"ruleId":"D2","level":"warning","message":{"text":"SpoilerParticles.mountSpoilerParticleCanvas (cognitive 16): SpoilerParticles.mountSpoilerParticleCanvas has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10, boolean chains 5, ternaries 1. Most of this is not in the body itself: 1 of the 16 points is its own statement and the rest belongs to 6 function literals inside it that branch (lines 91, 138, 116, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/SpoilerParticles.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b2d4ab32d3bc84fbd20aa35a3c2dd18540289a6818339a0747c7a3ee061e16b"}},{"ruleId":"D2","level":"warning","message":{"text":"rich-link-preview-attachment.RichLinkPreviewAttachment (cognitive 16): rich-link-preview-attachment.RichLinkPreviewAttachment has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 8 (10 pts), boolean chains 5, if/else 1 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/rich-link-preview-attachment.tsx"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1ec51a8b4ce1f9db3d1358443149690ce0ecb0b52eae20256d2c9cfeca3130b"}},{"ruleId":"D2","level":"warning","message":{"text":"styled-qr-code.StyledQrCode (cognitive 16): styled-qr-code.StyledQrCode has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 4 (8 pts), if/else 1 (3 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/styled-qr-code.tsx"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"62c4aae7a2cbc055ab7171006ff0b90e4382b17874cf9fb5344431da95a5c3bc"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Db: TooManyMethods \u2014 320 methods, declared across 33 files: store/workflow.rs (28), store/event.rs (27), runtime/mod.rs (26), store/relay_admin_actions.rs (23), \u002B29 more file(s). The bar is 30 methods; this is 290 over it, 10.67\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/buzz-db/src/runtime/mod.rs"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"fef02c2418bb84214df6e95b1701745e810810e8b03395e002b975235a9fea52"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_acp::run_harness: FunctionTooLong \u2014 buzz_acp::run_harness runs 903 significant 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 803 over it, 9.03\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/lib.rs"},"region":{"startLine":2575}}}],"partialFingerprints":{"codehealthFindingId/v1":"71097582a3aa19bd98678272024df4c46ddf23f47dd5e4285ef34094152d7ee4"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AgentInstanceEditDialog.AgentInstanceEditDialog: FunctionTooLong \u2014 AgentInstanceEditDialog runs 838 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 738 over it, 8.38\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentInstanceEditDialog.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"caad0eaa8ba30843fab13f8e5bf2b5b8f986fbcee3be8dbaa4d30efc10cc4efe"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ChannelScreen.ChannelScreen: FunctionTooLong \u2014 ChannelScreen runs 817 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 717 over it, 8.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":"desktop/src/features/channels/ui/ChannelScreen.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"2254d0e2c10f16eda9093f0000902ee7dd6d9180c85fc12ebe85adecbaf9905f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProfileAvatarEditor.ProfileAvatarEditor: FunctionTooLong \u2014 ProfileAvatarEditor runs 817 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 717 over it, 8.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":"desktop/src/features/profile/ui/ProfileAvatarEditor.tsx"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7f11dc8c218211f4264098298bd71cd6c1e1497e1065ef045d91834ba5415a9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_acp::pool::run_prompt_task: FunctionTooLong \u2014 buzz_acp::pool::run_prompt_task runs 813 significant 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 713 over it, 8.13\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/pool.rs"},"region":{"startLine":2323}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac4253067b93d43ee409b824607c5314f6df0df96219ad2fcfbdbe759c17478b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MessageComposer.MessageComposerImpl: FunctionTooLong \u2014 MessageComposerImpl runs 813 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 713 over it, 8.13\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/MessageComposer.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"067f7b977c2547229c493310ee866b979669955f3e571947ea7bc2e6db737092"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AgentCreationPreview.AgentCreationPreview: FunctionTooLong \u2014 AgentCreationPreview runs 810 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 710 over it, 8.10\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentCreationPreview.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c74de682c184b82f822396f61a55f1166183fcf176f010ccb033fff5d27f477"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectDetailScreen.ProjectDetailScreen: FunctionTooLong \u2014 ProjectDetailScreen runs 774 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 674 over it, 7.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":"desktop/src/features/projects/ui/ProjectDetailScreen.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cb275367535cb27e64d40cd1280419eae599a2559e617f3fcb8fdaff259eb26"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AnimatedAvatarCapture.AnimatedAvatarCapture: FunctionTooLong \u2014 AnimatedAvatarCapture runs 761 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 661 over it, 7.61\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/AnimatedAvatarCapture.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"96f8a637e8b40724dbbab70c0e44330398eba571e1ac7f092aedf0a88dfceb2a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: HomeView.HomeView: FunctionTooLong \u2014 HomeView runs 751 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 651 over it, 7.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":"desktop/src/features/home/ui/HomeView.tsx"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8fd963a2f7856ba2da7688b2a43cb0f8633b18450fb707a6a07a628d9485a31"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ComposeBar.build: MethodTooLong \u2014 build runs 747 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 647 over it, 7.47\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/compose_bar/compose_bar_widget.dart"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad515238ffa6176a4f9dcdcda08ad6092e860f7424eb0b335ed4854b9d1b359e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useMentionSendFlow.useMentionSendFlow: FunctionTooLong \u2014 useMentionSendFlow runs 746 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 646 over it, 7.46\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":"desktop/src/features/messages/ui/useMentionSendFlow.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa7e6fa86f6cd048c13f39fe19bced7c830b37c4d16635a9df2bd17c1f9ff04b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AppShell.AppShell: FunctionTooLong \u2014 AppShell runs 740 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 640 over it, 7.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":"desktop/src/app/AppShell.tsx"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a135306375ce7524af7fdeb62566197a2a8263aa577bca8f5109890121fcd54"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AgentDefinitionDialog.AgentDefinitionDialog: FunctionTooLong \u2014 AgentDefinitionDialog runs 737 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 637 over it, 7.37\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentDefinitionDialog.tsx"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"69bb2301443f4104ed2307b536eb8573d7488e3ef63e579e456eeafd395818e5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: UserProfilePanel.UserProfilePanel: FunctionTooLong \u2014 UserProfilePanel runs 730 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 630 over it, 7.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":"desktop/src/features/profile/ui/UserProfilePanel.tsx"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbf244e694e2043c240236a8edd4972a4a223e9adf21ae41a1003c6e5431b86d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AppSidebar.AppSidebar: FunctionTooLong \u2014 AppSidebar runs 728 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 628 over it, 7.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":"desktop/src/features/sidebar/ui/AppSidebar.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b0b234a72d7026392d22ec7724006db069ababeebdf69a398440f9b8071a22e"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: NativeAttachmentPopoverViewController.makeMenuView: MethodTooLong \u2014 makeMenuView runs 723 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 623 over it, 7.23\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/NativeAttachmentPopover.swift"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"c01256e313c2dff566fd6fda590ddae8a03c58f29d5541384d9e5fe29cabdf57"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: VideoPlayer.VideoReviewDialog: FunctionTooLong \u2014 VideoReviewDialog runs 717 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 617 over it, 7.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":"desktop/src/shared/ui/VideoPlayer.tsx"},"region":{"startLine":1198}}}],"partialFingerprints":{"codehealthFindingId/v1":"52c1759177ef38368dba4913e69dc476df3cacfb08d9c1b9d4d66cbabbe89d44"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useMentions.useMentions: FunctionTooLong \u2014 useMentions runs 699 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 599 over it, 6.99\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useMentions.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fed27db0d2fbe7fd40633ccca1e9baab4d9628277eed43e93db8d14bc4ad5e0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::handlers::ingest::ingest_event_inner: FunctionTooLong \u2014 buzz_relay::handlers::ingest::ingest_event_inner runs 697 significant 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 597 over it, 6.97\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/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":2252}}}],"partialFingerprints":{"codehealthFindingId/v1":"6729221a893ead17d07168de1ed33ae6a8d9c83685547a0977fbce129146b7fe"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::run_relay_main: FunctionTooLong \u2014 buzz_relay::run_relay_main runs 694 significant 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 594 over it, 6.94\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/buzz-relay/src/main.rs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"af25ea569644d9f655c8f12f85011761057352fe323f8183f939afbd1f057e8d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectsView.ProjectsView: FunctionTooLong \u2014 ProjectsView runs 690 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 590 over it, 6.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":"desktop/src/features/projects/ui/ProjectsView.tsx"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b451cdbe1dc8ceee99d2b21ee13c7efe7094204fc90e98cf48a434a9bbbab65"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _MessageList.build: MethodTooLong \u2014 build runs 688 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 588 over it, 6.88\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":"mobile/lib/features/channels/channel_detail_page/message_list.dart"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ffd13931932e6d7c657f2610cf4dc1dd0ce7e9cfd2b394c658076e270ba4be2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AgentConfigFields.AgentConfigFields: FunctionTooLong \u2014 AgentConfigFields runs 683 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 583 over it, 6.83\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentConfigFields.tsx"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"f18c381c4064ca4809a811c734ef9ce8d99284f776fe74dbbaef4852305eaa52"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ThreadDetailPage.build: MethodTooLong \u2014 build runs 658 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 558 over it, 6.58\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/thread_detail_page.dart"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca0da184423809a4c18c4c7ff60c637337e238f75b9e1e5ed17491da0247a130"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MessageThreadPanel.MessageThreadPanel: FunctionTooLong \u2014 MessageThreadPanel runs 654 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 554 over it, 6.54\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/MessageThreadPanel.tsx"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd4bd32b9e07c511088481f302ca7178b1e376ada209e401092195e09d010061"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/lib.rs: FileTooLong \u2014 3236 significant 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 69 free functions. The bar is 500 significant lines; this is 2736 over it, 6.47\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/lib.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cc67abfdba0772c4450fc8eda6e9b3f40edc9e0af9df3048e06edb96684282e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::run: FunctionTooLong \u2014 buzz_desktop::run runs 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) in one body. The bar is 100 significant lines; this is 544 over it, 6.44\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":"desktop/src-tauri/src/lib.rs"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"d215fafae616deca3e03e6caf013761822c9817ba03aab81ee72488745eacde3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkflowDialog.WorkflowDialog: FunctionTooLong \u2014 WorkflowDialog runs 639 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 539 over it, 6.39\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/WorkflowDialog.tsx"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"8abade08b27d7a68bf979b364cf9ea1ed12a62e9f9c54969f89c8879689f6dc0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: markdown.ImageZoomOverlay: FunctionTooLong \u2014 ImageZoomOverlay runs 639 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 539 over it, 6.39\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/markdown.tsx"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef6408b4988612a2f28350155bf2b980fafc334f53976ff16798433e9ea1ccf1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: HuddleContext.HuddleProvider: FunctionTooLong \u2014 HuddleProvider runs 622 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 522 over it, 6.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":"desktop/src/features/huddle/HuddleContext.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"97666f37bee74d39cc37ec1a44a8f1687df38ad55c03260226c90b69e6da16fa"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProfileSettingsCard.ProfileSettingsCard: FunctionTooLong \u2014 ProfileSettingsCard runs 616 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 516 over it, 6.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":"desktop/src/features/settings/ui/ProfileSettingsCard.tsx"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef710c23dd4c75146d16355eebacdac57ae4f11341da4c88382c9fa6f6327a54"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MembersSidebar.MembersSidebar: FunctionTooLong \u2014 MembersSidebar runs 608 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 508 over it, 6.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":"desktop/src/features/channels/ui/MembersSidebar.tsx"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"37244c8116d5ea1e6072a2927b584b0bddbf914ab19afc668283c7c813714132"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/pool.rs: FileTooLong \u2014 3033 significant 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 65 free functions. The bar is 500 significant lines; this is 2533 over it, 6.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/buzz-acp/src/pool.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"556dbdc65a360f039dd9fb217c6de17fe86856c646f6fca5d5afc6ffd1bb69c2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: InboxDetailPane.InboxMessageDetailPane: FunctionTooLong \u2014 InboxMessageDetailPane runs 593 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 493 over it, 5.93\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/ui/InboxDetailPane.tsx"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e68d77ed73326d15ecb7a866290cfb96dfd8e0c03326563f53d4ecdae73ac0a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: HostedCommunityOnboarding.HostedCommunityOnboarding: FunctionTooLong \u2014 HostedCommunityOnboarding runs 590 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 490 over it, 5.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":"desktop/src/features/communities/ui/HostedCommunityOnboarding.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"370579cfb9be0e203aeeabfcd9c8c1339d26fb39a98a8ce98687e5f4a1ecb2cf"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: TerminalSubstrate.TerminalSubstrate: FunctionTooLong \u2014 TerminalSubstrate runs 590 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 490 over it, 5.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":"desktop/src/features/terminal/TerminalSubstrate.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c2f339a746756423564bb8785068a2b9e4f834ae29404057b30675370ab5026"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: HuddleBar.HuddleBar: FunctionTooLong \u2014 HuddleBar runs 587 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 487 over it, 5.87\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":"desktop/src/features/huddle/components/HuddleBar.tsx"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"0befd14db9c0ebc755afb6240e017926f8e508714f4fc3cac0f42bd2e628ad36"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: NostrBindConsentDialog.NostrBindConsentDialog: FunctionTooLong \u2014 NostrBindConsentDialog runs 577 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 477 over it, 5.77\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":"desktop/src/features/profile/ui/NostrBindConsentDialog.tsx"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"1068fbc310b905aa1d8dc82a0f841a8a789547a98e948d95d89b3bf21d0044ec"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ForumComposer.ForumComposerVisit: FunctionTooLong \u2014 ForumComposerVisit runs 573 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 473 over it, 5.73\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/forum/ui/ForumComposer.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"2af4d0ff1ef62d85133fcc9276a6fdf1294c319361aba1da2955e82ae98dee67"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CommunityOnboardingFlow.CommunityOnboardingFlow: FunctionTooLong \u2014 CommunityOnboardingFlow runs 565 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 465 over it, 5.65\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/CommunityOnboardingFlow.tsx"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"1483e81ec7f6596ce58beb296ef922e01b5a3fc4b90b38aa725ce202336dd60c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::audio::handler::handle_active_audio_connection: FunctionTooLong \u2014 buzz_relay::audio::handler::handle_active_audio_connection runs 552 significant 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 452 over it, 5.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/buzz-relay/src/audio/handler.rs"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"985463c1aeb740786f201f65293d58df10fa0e0cd6bdc9b08a8fe2de1d46fc96"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Config.from_env: MethodTooLong \u2014 from_env runs 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) in one body. The bar is 100 significant lines; this is 446 over it, 5.46\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/buzz-relay/src/config.rs"},"region":{"startLine":605}}}],"partialFingerprints":{"codehealthFindingId/v1":"219b9e4c4bab80d24e317bdeef7bf2d117b96fc3c5400b88f3a6225141b68cf7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AgentsView.AgentsView: FunctionTooLong \u2014 AgentsView runs 533 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 433 over it, 5.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":"desktop/src/features/agents/ui/AgentsView.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"3594acf1fbcf6001621bf3d8908fac2445e69bf7276e5984fc29d69915d7f829"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: NostrKeyImportForm.NostrKeyImportForm: FunctionTooLong \u2014 NostrKeyImportForm runs 533 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 433 over it, 5.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":"desktop/src/features/onboarding/ui/NostrKeyImportForm.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"15da0708291d27d5dec13aa171e0211a139bae5ed398f26884fabbb75f99e94e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useAnchoredScroll.useAnchoredScroll: FunctionTooLong \u2014 useAnchoredScroll runs 528 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 428 over it, 5.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":"desktop/src/features/messages/ui/useAnchoredScroll.ts"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"4308aa6c5ad8361536a9ff2917f2e6a3c3bf36c85655370ab3e56bcaa492b8e1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: TopbarSearch.TopbarSearch: FunctionTooLong \u2014 TopbarSearch runs 519 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 419 over it, 5.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":"desktop/src/features/search/ui/TopbarSearch.tsx"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"02e2b05fa7fca5ce34faff7fd2bf3b00b4a467be635e4999412276665ee6a924"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MachineOnboardingFlow.MachineOnboardingFlow: FunctionTooLong \u2014 MachineOnboardingFlow runs 518 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 418 over it, 5.18\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/MachineOnboardingFlow.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6726ecaafddb76fa5ead72ea1eddde0118d4ee65e87ced7708a4a27e8ecd612"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: HostedCommunitiesSettingsCard.HostedCommunitiesSettingsCard: FunctionTooLong \u2014 HostedCommunitiesSettingsCard runs 511 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 411 over it, 5.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":"desktop/src/features/settings/ui/HostedCommunitiesSettingsCard.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"d769426c352f6393bce59a736fddd978f9bafdb53db1484553ec6d9d9ebff2d0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useMediaUpload.useMediaUpload: FunctionTooLong \u2014 useMediaUpload runs 500 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 400 over it, 5.00\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useMediaUpload.ts"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"05496658e0d3035635a05b9ed705a9dfa59295ef8e296a4b582708096519f2ab"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectWorkspaceTabs.WorkspaceTabs: FunctionTooLong \u2014 WorkspaceTabs runs 495 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 395 over it, 4.95\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectWorkspaceTabs.tsx"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"15530228fdcf2f038d8f1922eb110245879ed65a9825f75cd2efa0b7fc330ba2"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: store/deletion.rs: FileTooLong \u2014 2427 significant 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 67% of them inside a single declaration: DeletionStore (2 blocks, 678-2862). The bar is 500 significant lines; this is 1927 over it, 4.85\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/buzz-db/src/store/deletion.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"99512ec259216865a5f92f9ce49ef92266325d19d2ef54c8872d9aab29155d9f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/relay.rs: FileTooLong \u2014 2425 significant 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 45 free functions. The bar is 500 significant lines; this is 1925 over it, 4.85\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/buzz-acp/src/relay.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d2ef4ed4b457678b9f4683a760174695c47ce3c905eb41119cd1942705c32b1"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnimatedAvatarCapture.build: MethodTooLong \u2014 build runs 475 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 375 over it, 4.75\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":"mobile/lib/features/profile/animated_avatar_capture.dart"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a3c1f1aba70484a1dcec63e9bbb84e888dd37106461d0f677cceacd44931c72"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ChannelDetailPage.build: MethodTooLong \u2014 build runs 474 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 374 over it, 4.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":"mobile/lib/features/channels/channel_detail_page.dart"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"28d90802d2b2c1687f8748018e786ca2106495ff975207f010ad364d8339dc58"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: InboxListPane.InboxListPane: FunctionTooLong \u2014 InboxListPane runs 472 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 372 over it, 4.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":"desktop/src/features/home/ui/InboxListPane.tsx"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"467ee4770e8aaba5f507f55515d79eeb46c838082882e5263db50193557dab49"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: NewMessageScreen.NewMessageScreen: FunctionTooLong \u2014 NewMessageScreen runs 462 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 362 over it, 4.62\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/NewMessageScreen.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"18d3f70963cfe855142a96dcda418808d3d8f9a7705d6a57f1eba96fd3a79b31"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: handlers/side_effects.rs: FileTooLong \u2014 2289 significant 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 65 free functions. The bar is 500 significant lines; this is 1789 over it, 4.58\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/buzz-relay/src/handlers/side_effects.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aedd4fcc024cf7ba70a15aa34e497e667e96dfcde21040f8699254e74cd04235"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ImageAvatarCapture.build: MethodTooLong \u2014 build runs 443 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 343 over it, 4.43\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/profile/image_avatar_capture.dart"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab38c76e222efc5d587b9482b8ecce5f05a1b647cdc7c0dcdcb4accdba360b8a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ChannelManagementSheet.ChannelManagementSheet: FunctionTooLong \u2014 ChannelManagementSheet runs 439 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 339 over it, 4.39\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/ChannelManagementSheet.tsx"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"c415fe3811fd118222e1d53992f4883fbca790cde2f2b9a57be648cf8fd2368a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ChannelDetailsPage.build: MethodTooLong \u2014 build runs 431 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 331 over it, 4.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":"mobile/lib/features/channels/channel_details_page.dart"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"646037e816cf014bb172e34a91904f100dd88b5bf775330b83dbb49e4c5a79bb"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: VideoPlayer.VideoPlayer: FunctionTooLong \u2014 VideoPlayer runs 420 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 320 over it, 4.20\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/VideoPlayer.tsx"},"region":{"startLine":674}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0ac73c70bf082872575875c110dbe0b7859a4b47bc4e4c3634ba9e618937d47"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ChannelBrowserDialog.ChannelBrowserDialog: FunctionTooLong \u2014 ChannelBrowserDialog runs 418 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 318 over it, 4.18\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/ChannelBrowserDialog.tsx"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fb9603411f8bb25471bf4e0b5e54366c8f5c9d0b2e3ba3b17dfb059ec4c4da8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectRepositoryActionsPanel.ProjectRepositoryActionsPanel: FunctionTooLong \u2014 ProjectRepositoryActionsPanel runs 418 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 318 over it, 4.18\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectRepositoryActionsPanel.tsx"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"14d6e5aaddb83ef5cd4859ceb572efa5caaea4eab90f149c95c8c1ea809a354c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useRichTextEditor.useRichTextEditor: FunctionTooLong \u2014 useRichTextEditor runs 417 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 317 over it, 4.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":"desktop/src/features/messages/lib/useRichTextEditor.ts"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"62b7241b4179d19aa80cc6521b7a1041f2bfe2768369ccaa85a3cfec81f2951a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: usePersonaActions.usePersonaActions: FunctionTooLong \u2014 usePersonaActions runs 414 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 314 over it, 4.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":"desktop/src/features/agents/ui/usePersonaActions.ts"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"89dcd83709a000c716cafbcd34da7fcd4c485068804788a5f82af0486311f8f7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: huddlePresenceRuntime.startHuddlePresenceRuntime: FunctionTooLong \u2014 startHuddlePresenceRuntime runs 412 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 312 over it, 4.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/lib/huddlePresenceRuntime.ts"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"d57a397508689df95f00f1e9dd01a5c18904063694d83ade31bf276986f46723"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CommunityCatalogDialog.CommunityCatalogDialog: FunctionTooLong \u2014 CommunityCatalogDialog runs 411 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 311 over it, 4.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":"desktop/src/features/agents/ui/CommunityCatalogDialog.tsx"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fe648035ec8857b3eead9e203672d2ac395c7e81e8a919e8f8495639aa6b3bf"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectPullRequestsPanel.ProjectPullRequestDetail: FunctionTooLong \u2014 ProjectPullRequestDetail runs 408 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 308 over it, 4.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":"desktop/src/features/projects/ui/ProjectPullRequestsPanel.tsx"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"5476b05cda6d714db94634e2913a6f17834a9b0c8f1c4ee8c31d119402badd0d"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: DeletionStore: ClassTooLong \u2014 1628 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), 54 methods, 2 blocks, lines 678-2862. The bar is 400 significant lines; this is 1228 over it, 4.07\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/deletion.rs"},"region":{"startLine":678}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f62876302dea8ef6a0e32498d0e0196936b692e9c58cfcaff88d356c473ff35"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: UserProfilePanelSections.ProfileSummaryView: FunctionTooLong \u2014 ProfileSummaryView runs 407 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 307 over it, 4.07\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/UserProfilePanelSections.tsx"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d44b78bfaaa27d24b800a49c2612f739effe51240316a4aaff8d6bacd0573bf"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AudioMessageAttachment.AudioMessageAttachment: FunctionTooLong \u2014 AudioMessageAttachment runs 404 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 304 over it, 4.04\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/AudioMessageAttachment.tsx"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d7f61e1a4dbfce27973dc40c41020463232f780e96028aae0e9441bec452101"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: InviteRedeemForm.InviteRedeemForm: FunctionTooLong \u2014 InviteRedeemForm runs 400 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 300 over it, 4.00\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/InviteRedeemForm.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ad7b75c028632aeadb8bb818a3cedcaca32b338232c15d943d12871f6d20c77"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: handlers/ingest.rs: FileTooLong \u2014 1996 significant 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 44 free functions. The bar is 500 significant lines; this is 1496 over it, 3.99\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/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7d1969682262315ca1419380a2e77160b585eeea79229c6ecf520aa5b2d6c63"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: PersonaShareDialog.SnapshotShareDialog: FunctionTooLong \u2014 SnapshotShareDialog runs 385 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 285 over it, 3.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":"desktop/src/features/agents/ui/PersonaShareDialog.tsx"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"20c87cb9bd99ed5be036f8ac9f8803be860ce66ade7662b673ff5a0a6a573189"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: EncryptedBackupCreator.EncryptedBackupCreator: FunctionTooLong \u2014 EncryptedBackupCreator runs 379 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 279 over it, 3.79\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/EncryptedBackupCreator.tsx"},"region":{"startLine":361}}}],"partialFingerprints":{"codehealthFindingId/v1":"15a315ce371d5a6221a1a0ca475cc841a9e99dc826192afeaecb4ee56665dc49"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: OnboardingFlow.OnboardingFlow: FunctionTooLong \u2014 OnboardingFlow runs 378 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 278 over it, 3.78\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/OnboardingFlow.tsx"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcf445787e362dc08e621f35cd0a20a63bad70df5a116538a164edca91faf0a7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: agentSessionTranscript.processTranscriptEvent: FunctionTooLong \u2014 processTranscriptEvent runs 377 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 277 over it, 3.77\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":"desktop/src/features/agents/ui/agentSessionTranscript.ts"},"region":{"startLine":700}}}],"partialFingerprints":{"codehealthFindingId/v1":"a62a7e4778c1d73d0ab5558adc7fecfd11890ae26eceb856c99138752c68de68"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectsAgentPromptPage.ProjectsAgentPromptPage: FunctionTooLong \u2014 ProjectsAgentPromptPage runs 371 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 271 over it, 3.71\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectsAgentPromptPage.tsx"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b8689b94e9328413dd510df6042e95afd7f0b8b78f90fd77168041316f741c1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AgentSessionThreadPanel.AgentSessionThreadPanel: FunctionTooLong \u2014 AgentSessionThreadPanel runs 369 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 269 over it, 3.69\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":"desktop/src/features/channels/ui/AgentSessionThreadPanel.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"81ddb210cf516abbc3fe719f39ec127e04760e875883457086aaf44fef6931b6"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ProfileEditPage.build: MethodTooLong \u2014 build runs 369 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 269 over it, 3.69\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":"mobile/lib/features/profile/profile_edit_page.dart"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c39d7cb158b13e7fd02250e3859a814f79060941d62fa58f3df88b151005a8b"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ProfileAvatarEditor.build: MethodTooLong \u2014 build runs 363 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 263 over it, 3.63\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/profile/profile_avatar_editor.dart"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"19a4e716f784919c1a129f557179c46e47d4943c37d639308018a09390e6ee16"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/VideoPlayer.tsx: FileTooLong \u2014 1789 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1289 over it, 3.58\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":"desktop/src/shared/ui/VideoPlayer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"af2d6d22898e2580e8cf3e6585c0af62fbd0366867667fecbcfaf0e53f00722f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: api/bridge.rs: FileTooLong \u2014 1763 significant 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 47 free functions. The bar is 500 significant lines; this is 1263 over it, 3.53\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/bridge.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"11009e2a6e23ac62342266458dd0ce0c0655a58e12ad91a1b11e0fd465f3c031"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: HostedCommunityCreateFlow.HostedCommunityCreateFlow: FunctionTooLong \u2014 HostedCommunityCreateFlow runs 347 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 247 over it, 3.47\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/communities/ui/HostedCommunityCreateFlow.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"022b14a7cfe526e9364ff8e605b0b56a4767d6d512e8446487ef1a0963bb2583"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkflowTriggerConditions.WorkflowTriggerConditions: FunctionTooLong \u2014 WorkflowTriggerConditions runs 343 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 243 over it, 3.43\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/WorkflowTriggerConditions.tsx"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2ef346681344168ed41d4aaf87c98001d094a66767bc5be54e3593a1befdab7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useAgentAddressLockPicker.useAgentAddressLockPicker: FunctionTooLong \u2014 useAgentAddressLockPicker runs 340 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 240 over it, 3.40\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useAgentAddressLockPicker.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"521f232c3f9f4642d0fb0d10974f4843356fc638a6f3783cdb59b313064aaf0c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: BackupStep.BackupStep: FunctionTooLong \u2014 BackupStep runs 339 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 239 over it, 3.39\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/BackupStep.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"5dfcf641a90768670f2aab267d0dab557e907f1cccb91edd2c46676238ffa4db"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: MediaImageViewerPage.build: MethodTooLong \u2014 build runs 339 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 239 over it, 3.39\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/media_viewer_page.dart"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"773b70428b7265cae2755e8c498ccdba1b658586b4ed8e4fbcec7ec43292bcb1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::commands::agents::create_managed_agent: FunctionTooLong \u2014 buzz_desktop::commands::agents::create_managed_agent runs 338 significant 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 238 over it, 3.38\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/agents.rs"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"2870c4ec1f0f5ff3f4216205604da36fedaad4e3468ae8ee800b081abb417ed3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: EnvVarsEditor.EnvVarsEditor: FunctionTooLong \u2014 EnvVarsEditor runs 338 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 238 over it, 3.38\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/EnvVarsEditor.tsx"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"57a713c8786eee251459dc1e45acef2722cef85dec3a185c1136d50d62a77d39"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: UserProfilePopover.UserProfilePopoverBody: FunctionTooLong \u2014 UserProfilePopoverBody runs 329 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 229 over it, 3.29\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/UserProfilePopover.tsx"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b2a6c215bdb2ddba4eeb7cb56d75c87824b526a554b2cbdc9286142a59ee366"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SetStatusDialog.SetStatusDialog: FunctionTooLong \u2014 SetStatusDialog runs 329 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 229 over it, 3.29\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/user-status/ui/SetStatusDialog.tsx"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d6692048ca8914b55d1dc670cd475cbbf3c78bec098539d942ae94a54ebf703"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::api::bridge::query_events_authed: FunctionTooLong \u2014 buzz_relay::api::bridge::query_events_authed runs 327 significant 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 227 over it, 3.27\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/bridge.rs"},"region":{"startLine":1306}}}],"partialFingerprints":{"codehealthFindingId/v1":"41c1bd2a3a0ed86f39bf88940116ee9823b399a7a93a06b3c826962b09687fa9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectRepositoryPanel.RepositoryFilesPanel: FunctionTooLong \u2014 RepositoryFilesPanel runs 327 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 227 over it, 3.27\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectRepositoryPanel.tsx"},"region":{"startLine":614}}}],"partialFingerprints":{"codehealthFindingId/v1":"55c10c1334ac2e98976820c06737e4208b34a090c54c5f0f8366b22335a87f26"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useHuddlePresentation.useHuddlePresentation: FunctionTooLong \u2014 useHuddlePresentation runs 324 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 224 over it, 3.24\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/app/useHuddlePresentation.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"349f539d49dade2c5d1ead2dc399a736e2b4b24e2db4c186182820d2d1000901"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectHomeWorkspaceSheet.ProjectHomeWorkspaceSheet: FunctionTooLong \u2014 ProjectHomeWorkspaceSheet runs 317 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 217 over it, 3.17\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectHomeWorkspaceSheet.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"392ab6e6f3e06d6a0e0c318c2dc45a68c490413e47fe6eaf40b1ed0d4fbad692"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: markdown.createMarkdownComponents: FunctionTooLong \u2014 createMarkdownComponents runs 317 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 217 over it, 3.17\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/markdown.tsx"},"region":{"startLine":1212}}}],"partialFingerprints":{"codehealthFindingId/v1":"8977c9a8af81861f1e37e4db4890abc5a81e948d900a33846595fd547385d41c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useManagedAgentActions.useManagedAgentActions: FunctionTooLong \u2014 useManagedAgentActions runs 316 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 216 over it, 3.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":"desktop/src/features/agents/ui/useManagedAgentActions.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fe1d30d5c1e676f7688f6b0225c8b1fbd2bd157490f3201a6776a86bf9c7071"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_acp::relay::run_background_task: FunctionTooLong \u2014 buzz_acp::relay::run_background_task runs 315 significant 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 215 over it, 3.15\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/buzz-acp/src/relay.rs"},"region":{"startLine":1736}}}],"partialFingerprints":{"codehealthFindingId/v1":"821e726ba0fcf54143e098120a5d055d0fcbae73375d2f8c3704893f86185fea"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CommunitySwitcher.CommunitySwitcher: FunctionTooLong \u2014 CommunitySwitcher runs 315 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 215 over it, 3.15\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":"desktop/src/features/communities/ui/CommunitySwitcher.tsx"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"9adadb6b8aaaad5bc5280e3cbf3cc030e79636eaaeaffefb27c749d2164a27e4"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AddMemberDialog.DirectAddMemberForm: FunctionTooLong \u2014 DirectAddMemberForm runs 314 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 214 over it, 3.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":"desktop/src/features/community-members/ui/AddMemberDialog.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"9553dc7f7730c86d9c77c4be6fbea5b9b0df5729e85c7bd24d22eb01031695f7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectChannelHome.ProjectChannelHome: FunctionTooLong \u2014 ProjectChannelHome runs 313 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 213 over it, 3.13\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectChannelHome.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"aaae4f73a8873bc53b473122be58a3e12acfdd6b17015488e4949ad430d5db68"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ThemePreviewFrame.SystemPreferencePreviewSvg: FunctionTooLong \u2014 SystemPreferencePreviewSvg runs 312 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 212 over it, 3.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/theme/ThemePreviewFrame.tsx"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"73b39019faeaec89b748d246098b48eda8417c31a14f9ebd2f080a85c7f54577"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SettingsPanels.ThemeSettingsCard: FunctionTooLong \u2014 ThemeSettingsCard runs 311 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 211 over it, 3.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":"desktop/src/features/settings/ui/SettingsPanels.tsx"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee454f4e444a70b9c9cb094b17254c359169b70b75dfce383c35abc93b20d9e5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: InvitePage.InvitePage: FunctionTooLong \u2014 InvitePage runs 310 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 210 over it, 3.10\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/features/invite/ui/InvitePage.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"28a5687ccd8c64455707bcd51da1cfa5c6d831f0eccdc0bfd089612fae99e7c0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: TimelineMessageList.VirtualizedTimelineRows: FunctionTooLong \u2014 VirtualizedTimelineRows runs 309 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 209 over it, 3.09\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/TimelineMessageList.tsx"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5e087a34a5cf1e509ec63fce40fb80a63fd5a39eb206a23c314128c7eff5329"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: TerminalBootstrap.TerminalBootstrap: FunctionTooLong \u2014 TerminalBootstrap runs 303 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 203 over it, 3.03\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/terminal/TerminalBootstrap.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"51ca7ea9be3089ae82d520a5e3185de880978e6693125f55de759337de67d2b7"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BeeRefreshIndicator.build: MethodTooLong \u2014 build runs 303 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 203 over it, 3.03\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/widgets/bee_refresh_indicator.dart"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fdc9110679b00645a9ec85744d56435aebd796d03146ee2401c68fd010a2ee8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AgentCardMintDialog.AgentCardMintDialog: FunctionTooLong \u2014 AgentCardMintDialog runs 302 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 202 over it, 3.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":"desktop/src/features/agents/ui/AgentCardMintDialog.tsx"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d9a01e945baba3fc6a1e6de08549c8416fbd6db0b046d1183342e1835885191"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ChannelMemberInviteCard.ChannelMemberInviteCard: FunctionTooLong \u2014 ChannelMemberInviteCard runs 300 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 200 over it, 3.00\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/ChannelMemberInviteCard.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"f01e13fd2603a69563ac55b15fc0beecd2e0df69623c45ad850b30f879a69062"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/llm.rs: FileTooLong \u2014 1491 significant 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 991 over it, 2.98\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/buzz-agent/src/llm.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"24c43b457d4f56dcca22ff0ca6444b7fb8e79503b0389e73a62fd19753265c68"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: store/event.rs: FileTooLong \u2014 1485 significant 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 32 free functions. The bar is 500 significant lines; this is 985 over it, 2.97\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/buzz-db/src/store/event.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"724f9877ac4699b34b75db5b13ea8853d2fa3122a0c3e0da6e3d0a7e523b17d1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useAppNavigation.useAppNavigation: FunctionTooLong \u2014 useAppNavigation runs 297 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 197 over it, 2.97\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":"desktop/src/app/navigation/useAppNavigation.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ba8bb59c306fb3dd1676172bb021a0ce773d9a876a986516a2bc2d1e49f85b1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ChannelManagementSheet.ChannelManagementPanelContent: FunctionTooLong \u2014 ChannelManagementPanelContent runs 297 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 197 over it, 2.97\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":"desktop/src/features/channels/ui/ChannelManagementSheet.tsx"},"region":{"startLine":673}}}],"partialFingerprints":{"codehealthFindingId/v1":"2474ed96b9370ac5431fef39999597b2de5ad6a867513c46a6d41e272ac76bdf"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkflowMessagePicker.WorkflowMessagePicker: FunctionTooLong \u2014 WorkflowMessagePicker runs 296 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 196 over it, 2.96\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":"desktop/src/features/workflows/ui/WorkflowMessagePicker.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"7113e9f4c8c0ffb4f02fbb1138c96e1b38771be1e0b6fd2da0cf763aa9b6ff97"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useChannelPaneHandlers.useChannelPaneHandlers: FunctionTooLong \u2014 useChannelPaneHandlers runs 294 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 194 over it, 2.94\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":"desktop/src/features/channels/useChannelPaneHandlers.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"02d67f931137c80e460416fc9061fdfa9166b08602e3ac0b490fc7b8bb7da341"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: PulseView.PulseView: FunctionTooLong \u2014 PulseView runs 293 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 193 over it, 2.93\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/pulse/ui/PulseView.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe7e00a9a014355bf40e9a832b1dfd76731e5b43da7b1287fc601c13d2a30a69"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useTeamActions.useTeamActions: FunctionTooLong \u2014 useTeamActions runs 292 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 192 over it, 2.92\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/useTeamActions.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"e48fd59d59e721b27d34184f5af0cd2ac4fae99bb0346a02df8cdff3088b9920"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useSearchResults.useSearchResults: FunctionTooLong \u2014 useSearchResults runs 292 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 192 over it, 2.92\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/search/useSearchResults.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5f2ca277aeb3975990d4aa259be7b3db57caccf91dcbe5833e960c959e4fce5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: EditAgentAdvancedFields.EditAgentAdvancedFields: FunctionTooLong \u2014 EditAgentAdvancedFields runs 290 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 190 over it, 2.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":"desktop/src/features/agents/ui/EditAgentAdvancedFields.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b7938b819ba6dc31c662d710f850816db1eac7f27eaf22a1c79a2795984cfc6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/markdown.tsx: FileTooLong \u2014 1440 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 940 over it, 2.88\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/markdown.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"86fa5128784674faf34bb8519f1146048ebec8ef9f250dba0cee76839c1a6987"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkflowDetailPanel.WorkflowDetailPanel: FunctionTooLong \u2014 WorkflowDetailPanel runs 287 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 187 over it, 2.87\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":"desktop/src/features/workflows/ui/WorkflowDetailPanel.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"a42dead9497caf8db6e0f26a1e8e3aa94780663081d910a855549be80464d027"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useLinkEditor.useLinkEditor: FunctionTooLong \u2014 useLinkEditor runs 286 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 186 over it, 2.86\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":"desktop/src/features/messages/lib/useLinkEditor.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"82cb2de61e29e65ca399818967b47868590a3def263c7a71d6e5e469aec9289d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: store/relay_admin_actions.rs: FileTooLong \u2014 1417 significant 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 917 over it, 2.83\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/relay_admin_actions.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4413fce8c6d3dce697f871d7095b93ae751d572cb987980bd39023a30f377bdb"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ActivityPage.build: MethodTooLong \u2014 build runs 283 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 183 over it, 2.83\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/activity/activity_page.dart"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"57b6bd8d1db9d2550fbe1afe385a045c1f467d07db9ef4020e262506f70c22ea"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: VoiceSettingsCard.VoiceSettingsCard: FunctionTooLong \u2014 VoiceSettingsCard runs 278 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 178 over it, 2.78\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/VoiceSettingsCard.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b6da1757a49b74ffb8045dc22cf2a87f255e31c474368a1873392ac172283e5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CustomEmojiSettingsCard.CustomEmojiSettingsCard: FunctionTooLong \u2014 CustomEmojiSettingsCard runs 276 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 176 over it, 2.76\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/custom-emoji/ui/CustomEmojiSettingsCard.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"45c6956a44918c95708bf618bece34eee98df6f4f4f4137ebc38b7bf2a098aa7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: PullRequestReviewersRow.PullRequestReviewersRow: FunctionTooLong \u2014 PullRequestReviewersRow runs 276 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 176 over it, 2.76\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/PullRequestReviewersRow.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc59d47b86f762f3ad2bcc5ecd7995830b4082ba5258126e137dc50d80cfef19"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/builders.rs: FileTooLong \u2014 1379 significant 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 85 free functions. The bar is 500 significant lines; this is 879 over it, 2.76\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/buzz-sdk/src/builders.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae6fe3e6882b652eee5933656328884fd1f59c8bbc6fe3c6ffca0faf00a01983"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ComposerImageEditor.ComposerImageEditor: FunctionTooLong \u2014 ComposerImageEditor runs 272 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 172 over it, 2.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":"desktop/src/features/messages/ui/ComposerImageEditor.tsx"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d28ec8281f05123a35132649e3bb15ecc3b7bff7efacf9b4821c4ce51bfe9b4"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: welcomeKickoff.useWelcomeKickoff: FunctionTooLong \u2014 useWelcomeKickoff runs 269 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 169 over it, 2.69\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":"desktop/src/features/onboarding/welcomeKickoff.ts"},"region":{"startLine":494}}}],"partialFingerprints":{"codehealthFindingId/v1":"841fe307d451ee78bd1393207c1868cb104571c8195ea27b7b1bfad3069f2ca2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectAgentChatPanel.ProjectAgentChatPanel: FunctionTooLong \u2014 ProjectAgentChatPanel runs 269 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 169 over it, 2.69\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":"desktop/src/features/projects/ui/ProjectAgentChatPanel.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"76b63c6e4979e5274a7eedca3fa7f74fc5eac15fda1e724bf8e62d523461c486"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_acp::handle_prompt_result: FunctionTooLong \u2014 buzz_acp::handle_prompt_result runs 268 significant 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 168 over it, 2.68\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/buzz-acp/src/lib.rs"},"region":{"startLine":4655}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a2000ed21077a48a3206171833210d62490c42bfc75b155d6dc171f1cb557f1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WelcomeSetup.WelcomeSetup: FunctionTooLong \u2014 WelcomeSetup runs 268 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 168 over it, 2.68\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":"desktop/src/features/communities/ui/WelcomeSetup.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"4734f549bd4d545bc74f931a3317341fe0236dceef8a752900736ea96e3e8d08"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CommunityEditForm.CommunityEditForm: FunctionTooLong \u2014 CommunityEditForm runs 267 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 167 over it, 2.67\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":"desktop/src/features/communities/ui/CommunityEditForm.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd3c7d1b909b4c1ce6570f0d22b0386de1e68a1d279f3e9b2d6721b9474faf7d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SidebarProjectsSection.SidebarProjectsSectionContent: FunctionTooLong \u2014 SidebarProjectsSectionContent runs 267 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 167 over it, 2.67\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":"desktop/src/features/sidebar/ui/SidebarProjectsSection.tsx"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"05d0c4377c27da7c80ea0a5afb39eadd282e2b05609df5d056d3e907f0e20284"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SendFeedbackDialog.SendFeedbackDialog: FunctionTooLong \u2014 SendFeedbackDialog runs 266 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 166 over it, 2.66\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/SendFeedbackDialog.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7a4b7a75449b749e30deeca2f93ab90a34fc142380e7ff48dc2ed647ee87f12"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _NewDirectMessageSheet.build: MethodTooLong \u2014 build runs 264 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 164 over it, 2.64\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channels_page/sheets.dart"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfe2f6e192e5519606513480b8d8428970bed44fbc87ddd7dd783e11cc3424f0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::handlers::req::handle_req: FunctionTooLong \u2014 buzz_relay::handlers::req::handle_req runs 263 significant 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 163 over it, 2.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/buzz-relay/src/handlers/req.rs"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"99e08f5d7b6f15a00e3de6b81bfbd2b26aabff8911c9a6fb11bb957b58b60f60"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: IssueAssigneesRow.IssueAssigneesRow: FunctionTooLong \u2014 IssueAssigneesRow runs 261 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 161 over it, 2.61\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/IssueAssigneesRow.tsx"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c810f6a9d160cc227fca4e04b701b452dc1792c7f8791a7895cf73013915f46"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AdminConsoleStaffingTab.RestrictionsSection: FunctionTooLong \u2014 RestrictionsSection runs 260 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 160 over it, 2.60\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/AdminConsoleStaffingTab.tsx"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"31c28f0c66fe11d4d930949c7daf89f5dd7129b6a18cb88240a4810a69858f89"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/main.rs: FileTooLong \u2014 1290 significant 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 790 over it, 2.58\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/buzz-relay/src/main.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a9ca49106dcd4a2cb9ad67e8dcae0db47b92146e337d3f8ebfc8d4d55198c27"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MobilePairingCard.MobilePairingCard: FunctionTooLong \u2014 MobilePairingCard runs 257 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 157 over it, 2.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":"desktop/src/features/settings/ui/MobilePairingCard.tsx"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bbe16428c4bf326542d62572b7bb6ab05aecd2d6833cbafdb830d9b00bb034a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectEntityListRow.ProjectEntityListRow: FunctionTooLong \u2014 ProjectEntityListRow runs 256 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 156 over it, 2.56\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":"desktop/src/features/projects/ui/ProjectEntityListRow.tsx"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"5876603e513d7ba36dac05831d9700c8e388245688c1b53116526a51615faea3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ChannelTemplatesSettingsCard.TemplateFormDialog: FunctionTooLong \u2014 TemplateFormDialog runs 256 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 156 over it, 2.56\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":"desktop/src/features/settings/ui/ChannelTemplatesSettingsCard.tsx"},"region":{"startLine":291}}}],"partialFingerprints":{"codehealthFindingId/v1":"825760ebf3a9feeaf0bcd5a42de67f332c8d9a0e7ee4d68dc0b0526f65fc625a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AdminConsoleStaffingTab.StaffingTab: FunctionTooLong \u2014 StaffingTab runs 255 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 155 over it, 2.55\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":"desktop/src/features/admin-console/AdminConsoleStaffingTab.tsx"},"region":{"startLine":471}}}],"partialFingerprints":{"codehealthFindingId/v1":"d77deb7fbe994c90392e32730ef0f5ca8eacb886e176385fca22063505a89f14"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: TeamDialog.TeamDialog: FunctionTooLong \u2014 TeamDialog runs 255 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 155 over it, 2.55\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":"desktop/src/features/agents/ui/TeamDialog.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d7e0c5fecfc0f8dfd75d72f29ce1872cad07338d7e94cacf710ec0d5c947f17"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkflowStepCard.StepConfigFields: FunctionTooLong \u2014 StepConfigFields runs 255 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 155 over it, 2.55\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":"desktop/src/features/workflows/ui/WorkflowStepCard.tsx"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d45978fa71d7c72da354bc8d98bf598c2e79204cd634d6c6efc68222a9c2fb6"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ProfileAvatarCropPage.build: MethodTooLong \u2014 build runs 255 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 155 over it, 2.55\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":"mobile/lib/features/profile/profile_avatar_crop_page.dart"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"051d4a1c758421cf489d7483e73daa75c28a46bcc914688f948fbf0f9cdef4ff"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/lib.rs: FileTooLong \u2014 1273 significant 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 773 over it, 2.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/buzz-cli/src/lib.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd09e8985e39dfcd5fb773c19b6c0e81ee98885a675ad85ad5166146c644efd3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_acp::relay::handle_ws_message: FunctionTooLong \u2014 buzz_acp::relay::handle_ws_message runs 254 significant 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 154 over it, 2.54\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/relay.rs"},"region":{"startLine":2173}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1abf922130d0cf12f7573fef7bc291090f05a7c0b4954f3f39aaf943a8ffc5d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::huddle::playout::run_playout_recv_loop: FunctionTooLong \u2014 buzz_desktop::huddle::playout::run_playout_recv_loop runs 254 significant 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 154 over it, 2.54\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/huddle/playout.rs"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"3dd320edea3df0ed9145209c89ec46bdea06a2b2d6f491916a16f44f81895181"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useChannelUnreadState.useChannelUnreadState: FunctionTooLong \u2014 useChannelUnreadState runs 254 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 154 over it, 2.54\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/useChannelUnreadState.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1c50109eee27f0ce19ac3c1bffb451e2c6b469c5e315d86371d09430a6f12fd"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectConversationPanel.ProjectConversationPanel: FunctionTooLong \u2014 ProjectConversationPanel runs 254 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 154 over it, 2.54\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectConversationPanel.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5f633acf888b639eab8e1da301325e7ef9ee7ee29548c6a0152fb06af1f726d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ChannelCombobox.ChannelCombobox: FunctionTooLong \u2014 ChannelCombobox runs 254 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 154 over it, 2.54\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/ChannelCombobox.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"d364345b1bd6bb5dd92caa7f828ebeb197e2059819060eb23696c10c154c7fa6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: PullRequestReviewCard.PullRequestReviewCard: FunctionTooLong \u2014 PullRequestReviewCard runs 252 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 152 over it, 2.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":"desktop/src/features/projects/ui/PullRequestReviewCard.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cf17c25913fd67f23e7cb6d427bd3e18fe38646177c595f86208db0301a0209"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: BestiePopover.BestiePopover: FunctionTooLong \u2014 BestiePopover runs 252 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 152 over it, 2.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":"desktop/src/protectedFeatures/bestie/BestiePopover.tsx"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"25dd833ade669e1df3f7527887a2142e5dd07439a7e3496aec70a9be07fd4b9a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ParticipantList.HuddleParticipantsControl: FunctionTooLong \u2014 HuddleParticipantsControl runs 250 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 150 over it, 2.50\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/components/ParticipantList.tsx"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cc5dc236d30d07bd86a40a964d8b6c11ac542d88172023731ec6d2d31db89f6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MeshComputeSettingsCard.MeshComputeSettingsCard: FunctionTooLong \u2014 MeshComputeSettingsCard runs 250 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 150 over it, 2.50\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/mesh-compute/ui/MeshComputeSettingsCard.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f05ff6b47b37fb04fd7a8cfcc385d6a54010b9fcd5e493f81c2d094005b49d2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: NotificationSettingsCard.NotificationSettingsCard: FunctionTooLong \u2014 NotificationSettingsCard runs 249 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 149 over it, 2.49\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":"desktop/src/features/settings/ui/NotificationSettingsCard.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"afe2e21eef7afc2f6f4d5011b0c2bed19b4b18884c46b1517ecc8e6b05fecf29"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::commands::team_snapshot::confirm_team_snapshot_import: FunctionTooLong \u2014 buzz_desktop::commands::team_snapshot::confirm_team_snapshot_import runs 247 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 147 over it, 2.47\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/team_snapshot.rs"},"region":{"startLine":511}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b3c5319231535b0d76de740bb21ca7b4888a1e0a871f57c34d07890e74372b5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::managed_agents::restore::restore_managed_agents_on_launch: FunctionTooLong \u2014 buzz_desktop::managed_agents::restore::restore_managed_agents_on_launch runs 245 significant 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 145 over it, 2.45\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":"desktop/src-tauri/src/managed_agents/restore.rs"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"94ba520b571c297ead6f2d99c9dd291b0d186c999d9043ba594708a2c2758f95"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: RespondToField.AllowlistPicker: FunctionTooLong \u2014 AllowlistPicker runs 244 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 144 over it, 2.44\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":"desktop/src/features/agents/ui/RespondToField.tsx"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"46dda1d3fbaf5d3768376ea41825ca472a09ea216c877d6e44ec1e9425fd6b60"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: commands/channels.rs: FileTooLong \u2014 1209 significant 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 709 over it, 2.42\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/buzz-cli/src/commands/channels.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"159a50c3283f5cff74728f6584215502a3bad8e58ece1e985091b34af4d8cf4c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MembershipDenied.MembershipDenied: FunctionTooLong \u2014 MembershipDenied runs 240 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 140 over it, 2.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":"desktop/src/features/onboarding/ui/MembershipDenied.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"374677b52db9a3870fdb496b21552bd618470ccc6253aa6ebf54b304cc96fe71"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: formatTimelineMessages.formatTimelineMessages: FunctionTooLong \u2014 formatTimelineMessages runs 236 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/messages/lib/formatTimelineMessages.ts"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"e55c007071723f2db7394f777c6187701c1dd305308bccd8f64f8708ec8f337d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: App.CommunityApp: FunctionTooLong \u2014 CommunityApp runs 235 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/app/App.tsx"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c68fb2767dc9a65ae99c074c6fd9c833c548c235baf77698a8b0010d67fdc5f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CustomChannelSection.CustomChannelSection: FunctionTooLong \u2014 CustomChannelSection runs 235 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/sidebar/ui/CustomChannelSection.tsx"},"region":{"startLine":539}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f2b11e0f036aa61d5da288a43976f23fba0d6110735bfed112d6635d0e314ed"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AgentDefaultsEditor.AgentDefaultsEditor: FunctionTooLong \u2014 AgentDefaultsEditor runs 234 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 134 over it, 2.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":"desktop/src/features/agents/ui/AgentDefaultsEditor.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee46fe8ea9f5c0613fc5ac42dd3f42b7e70e15da6e043a73527829956c6247c1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: HarnessRow.HarnessRow: FunctionTooLong \u2014 HarnessRow runs 234 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 134 over it, 2.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":"desktop/src/features/settings/ui/HarnessRow.tsx"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d51185c09e08787dd0fae0d63c753876b162c03183e1c2690be6b00bb0ae14b"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SearchPage.build: MethodTooLong \u2014 build runs 234 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 134 over it, 2.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":"mobile/lib/features/search/search_page.dart"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"a294033ce2dba3ab69c74cc679006cf07c9e1589b69d97abae16d6400273d9b1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::managed_agents::runtime::spawn_agent_child: FunctionTooLong \u2014 buzz_desktop::managed_agents::runtime::spawn_agent_child runs 233 significant 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 133 over it, 2.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":"desktop/src-tauri/src/managed_agents/runtime.rs"},"region":{"startLine":484}}}],"partialFingerprints":{"codehealthFindingId/v1":"901eadb7d91e414d3293278a28928e2bfd93e1f920d777e6da1f0ede72e83c83"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/acp.rs: FileTooLong \u2014 1160 significant 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 76% of them inside a single declaration: AcpClient (3 blocks, 144-2370). The bar is 500 significant lines; this is 660 over it, 2.32\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/buzz-acp/src/acp.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3e3d8a535bf62d6792f41c3486a20b3bac6ccc44f2feeeb6be7f1081e16ad4a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkflowsView.WorkflowsView: FunctionTooLong \u2014 WorkflowsView runs 232 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 132 over it, 2.32\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/WorkflowsView.tsx"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"334ede78c68ec9bc8b05e9a70e688b171c9215184c1734cd0eb4bdc29d08d5ad"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: PersonaShareRecipients.PersonaShareRecipients: FunctionTooLong \u2014 PersonaShareRecipients runs 231 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 131 over it, 2.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":"desktop/src/features/agents/ui/PersonaShareRecipients.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"79084355c6e2d912a208149996dbc9a91ad3b9839a820034e49707b8a05071f1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/lib.rs: FileTooLong \u2014 1154 significant 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 56 free functions. The bar is 500 significant lines; this is 654 over it, 2.31\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-deletion/src/lib.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ac1048c5b7178f6464afb8480fc2e59333db54ff522e0cb7312029a104bc145"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: MediaVideoViewerPage.build: MethodTooLong \u2014 build runs 230 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 130 over it, 2.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":"mobile/lib/features/channels/media_viewer_page/video_viewer.dart"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"9613659b6e60ff98a9f98e629fd72626c9ada5c75bfc763979793a5f10a910d2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: HuddleIndicator.HuddleIndicator: FunctionTooLong \u2014 HuddleIndicator runs 229 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 129 over it, 2.29\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/components/HuddleIndicator.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"81f23412954d3b7141e584138023a082d5879aa2cd7b51016db18873fe1f21ec"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/queue.rs: FileTooLong \u2014 1144 significant 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 644 over it, 2.29\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/buzz-acp/src/queue.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b9197d0d3606a96b5fad72214a8e88fc2f6370453ecff8617327795ba4239eb"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ChannelActionsSheet.build: MethodTooLong \u2014 build runs 227 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 127 over it, 2.27\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_actions_sheet.dart"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a20b6fef68283bf231f87b852f9d48553c05424b1a4802044fc9d73d456c9b3"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: store/workflow.rs: FileTooLong \u2014 1133 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), declaring 33 free functions. The bar is 500 significant lines; this is 633 over it, 2.27\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/workflow.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"41bb167c7a0bd3f107256c6a1897aabf887cf03c628ec03e0a46e67d3040f3c6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: git/transport.rs: FileTooLong \u2014 1127 significant 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 627 over it, 2.25\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/git/transport.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d223b8e668b68a471f72e4504775a8d97c0ad78bedff7ef33ae528fa9aaac537"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: PersonaAdvancedFields.PersonaAdvancedFields: FunctionTooLong \u2014 PersonaAdvancedFields runs 225 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 125 over it, 2.25\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/PersonaAdvancedFields.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3c77ae4849955609b2abd8df0ed5005b7d114fc52f37f25f8a44e8ec8fa5d25"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkflowAuthorPicker.WorkflowAuthorPicker: FunctionTooLong \u2014 WorkflowAuthorPicker runs 225 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 125 over it, 2.25\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/WorkflowAuthorPicker.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"e240ea8493ad21ffd06376aea6cf972c177d43b04daa4f6d75ea8e8e703f1cec"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CustomHarnessForm.CustomHarnessForm: FunctionTooLong \u2014 CustomHarnessForm runs 223 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 123 over it, 2.23\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/CustomHarnessForm.tsx"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"52160144c9c1bfa89e2ef8d383b16420f527be65dc5bf0c15b26110a6cd829ec"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::commands::personas::snapshot::import::confirm_agent_snapshot_import: FunctionTooLong \u2014 buzz_desktop::commands::personas::snapshot::import::confirm_agent_snapshot_import runs 222 significant 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 122 over it, 2.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":"desktop/src-tauri/src/commands/personas/snapshot/import.rs"},"region":{"startLine":456}}}],"partialFingerprints":{"codehealthFindingId/v1":"14bb56a4a1505c235004ff01f85d1592471095507fe79e8dd8498f84dbc137ff"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: DefaultConfigStep.AgentDefaultsSection: FunctionTooLong \u2014 AgentDefaultsSection runs 222 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 122 over it, 2.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":"desktop/src/features/onboarding/ui/DefaultConfigStep.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5e07491a59fc8b1e5bb62506bf1a56b7f720f610e5ed0941cc5cc70e239228a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: HarnessCatalogDialog.HarnessCatalogDialog: FunctionTooLong \u2014 HarnessCatalogDialog runs 222 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 122 over it, 2.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":"desktop/src/features/settings/ui/HarnessCatalogDialog.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5ab250a51ee08423e797b812be9d1809c7aee227274460f9a36ba9f992c2563"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AddTeamToChannelDialog.AddTeamToChannelDialog: FunctionTooLong \u2014 AddTeamToChannelDialog runs 221 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 121 over it, 2.21\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AddTeamToChannelDialog.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"6370c9ad11c2d84bfff43da125be2b2a4e24eacd37ca9fc9d00f2259b4b60d1c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CreateProjectFormSettings.CreateProjectFormSettings: FunctionTooLong \u2014 CreateProjectFormSettings runs 221 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 121 over it, 2.21\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/CreateProjectFormSettings.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7f3e4ba5321acb1a14ae7c04ce3680069ad266de9c75e9c1c51408c09fd4abd"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MergePullRequestButton.MergePullRequestButton: FunctionTooLong \u2014 MergePullRequestButton runs 221 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 121 over it, 2.21\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/MergePullRequestButton.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef4f338751386eb8a461dc99225d9f06c36bf56d17b0251ae07689d9a4fff27c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ChannelContextMenu.ChannelContextMenuItems: FunctionTooLong \u2014 ChannelContextMenuItems runs 221 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 121 over it, 2.21\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/ChannelContextMenu.tsx"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"affb011cda5ef8b119356f6f98a1be4ab57045ddcdee3cdee1ca30bbda4603ca"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: store/channel_members.rs: FileTooLong \u2014 1101 significant 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 601 over it, 2.20\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/channel_members.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e05595b6f002d3de953c0dadae33eb8c8677aa34ad1604d46dbb016d1dddeec5"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AcpClient: ClassTooLong \u2014 880 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), 40 methods, 3 blocks, lines 144-2370. The bar is 400 significant lines; this is 480 over it, 2.20\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/acp.rs"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"f46863ebad6e26a7168bb9da1a0fcf1393ebedafe36ceb1d4c288e1f6b5d0bc4"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProfilePopover.ProfilePopover: FunctionTooLong \u2014 ProfilePopover runs 220 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 120 over it, 2.20\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/ProfilePopover.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a2210b91ed4401b07fd05b0afb1cd5a53f2555126b79922a44c406f400643b7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: store/push.rs: FileTooLong \u2014 1095 significant 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 595 over it, 2.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/buzz-db/src/store/push.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"17ddbb66dddb1d6992a6188328701c2df59633f2ec3296a641303efbf4e74fa5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SettingsView.SettingsView: FunctionTooLong \u2014 SettingsView runs 219 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 119 over it, 2.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":"desktop/src/features/settings/ui/SettingsView.tsx"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"60c2287dc08f2fb67a8b9e3e167428a016c714abe4e9f6b8bca8731b38a74f27"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkflowMessageTextConditionEditor.WorkflowMessageTextCondition: FunctionTooLong \u2014 WorkflowMessageTextCondition runs 219 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 119 over it, 2.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":"desktop/src/features/workflows/ui/WorkflowMessageTextConditionEditor.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"2abacb132708f6661500424cfc8f5300245f9012e0cf643059a20cfb1c748597"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::commands::personas::card::mint_agent_card: FunctionTooLong \u2014 buzz_desktop::commands::personas::card::mint_agent_card runs 218 significant 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 118 over it, 2.18\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/personas/card.rs"},"region":{"startLine":534}}}],"partialFingerprints":{"codehealthFindingId/v1":"89081907d2da5bddbd3fdb14eb94bc022fa9d15ffe5c904bb70ddf9e15c34c94"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: InboxMessageRow.InboxMessageRow: FunctionTooLong \u2014 InboxMessageRow runs 218 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 118 over it, 2.18\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/ui/InboxMessageRow.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"98ab22387b098da0a1434ad1d6c187dc71b65a546a7058b047f91f94e788cb09"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _SliverChannelsList.build: MethodTooLong \u2014 build runs 218 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 118 over it, 2.18\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channels_page/body.dart"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"939c21b9cafd00ab6464a91e6d1d1a328cf0a118a8c66d2f609e8b2c224a99ca"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AcpClient.read_until_response_with_idle_timeout: MethodTooLong \u2014 read_until_response_with_idle_timeout runs 215 significant 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 115 over it, 2.15\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/buzz-acp/src/acp.rs"},"region":{"startLine":1371}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7652f353696af22b24b33a66258d48393702f64f7cdf5520911982dc2120154"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MessageActionBar.MoreActionsMenu: FunctionTooLong \u2014 MoreActionsMenu runs 215 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 115 over it, 2.15\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":"desktop/src/features/messages/ui/MessageActionBar.tsx"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"31724261c593da2542b1cce509ca423a44fc33c0cb19b797bdd407b14d078272"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AddProjectRepositoryDialog.AddProjectRepositoryDialog: FunctionTooLong \u2014 AddProjectRepositoryDialog runs 215 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 115 over it, 2.15\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":"desktop/src/features/projects/ui/AddProjectRepositoryDialog.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"a135a724bed44e76e4fbe78ee7306a44b369a1b73a802887a6b0334407ed9d42"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _InboxRow.build: MethodTooLong \u2014 build runs 215 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 115 over it, 2.15\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":"mobile/lib/features/activity/activity_page/inbox_row.dart"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1a1be0f8016c1b025db4b90bb3efb315d59ee12133ff5b1459bedef6ffc2a68"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CanvasHistoryPanel.CanvasHistoryPanel: FunctionTooLong \u2014 CanvasHistoryPanel runs 214 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 114 over it, 2.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":"desktop/src/features/channels/ui/CanvasHistoryPanel.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9c5dd8cd5afa356991f0bf0e3a81723c500ec20e06c67da4a67397aa8ecc987"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MicControls.MicControls: FunctionTooLong \u2014 MicControls runs 213 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 113 over it, 2.13\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/components/MicControls.tsx"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"833010b97285226abc9dabdf5b6c56e776eed9e3862a5c3cf7c13fb55c6f002b"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _MessageBubble.build: MethodTooLong \u2014 build runs 212 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 112 over it, 2.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_detail_page/message_bubble.dart"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"9070c49dcd347b698f515a53cf363057fbb412bf0b3d640d0747a0204b3d294a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _ThreadMessage.build: MethodTooLong \u2014 build runs 212 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 112 over it, 2.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/thread_detail_page/thread_message.dart"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"d16615f4bfdad4a7cebc3b920c20fac63b7bf1829ecf879b857b9eac4cd2b705"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: UserProfilePanelTabs.ProfileLiveActivityEmbed: FunctionTooLong \u2014 ProfileLiveActivityEmbed runs 210 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 110 over it, 2.10\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/UserProfilePanelTabs.tsx"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"9aa5e6773f9bc621de2090455ca235f727efa53032ce4d3dfe862303549f3993"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AgentInstanceEditDialog: ClassTooLong \u2014 838 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 438 over it, 2.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":"desktop/src/features/agents/ui/AgentInstanceEditDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6b5eafb566b0778b7b4c95488e4efeb5cc125c2b4a93e73f2eff62c51c73210"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: GitStore.run_conformance_probe: MethodTooLong \u2014 run_conformance_probe runs 209 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 109 over it, 2.09\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/git/store.rs"},"region":{"startLine":576}}}],"partialFingerprints":{"codehealthFindingId/v1":"02a9066a157f0afec35ff31048c948c9959419a126af9f57016a50b52fc315ac"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useComposerLinkPreviews.useComposerLinkPreviews: FunctionTooLong \u2014 useComposerLinkPreviews runs 209 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 109 over it, 2.09\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useComposerLinkPreviews.tsx"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"734ed94a0d0754ecf61050f76d781440008ccaf936ef4a80b491dfac31f79d19"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ChannelPane: ClassTooLong \u2014 835 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 435 over it, 2.09\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/ChannelPane.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c14b2e9ae2dc26483ef39438c548fed865c9e33d1afc523bd6e7993232cb38b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useMembersSidebarActions.useMembersSidebarActions: FunctionTooLong \u2014 useMembersSidebarActions runs 208 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 108 over it, 2.08\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/useMembersSidebarActions.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa4842ec3f75ca00704db17dd47a274f4f45b5978147b044cefbcf52e40b4756"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: hooks.useSendMessageMutation: FunctionTooLong \u2014 useSendMessageMutation runs 208 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 108 over it, 2.08\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/hooks.ts"},"region":{"startLine":476}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6b7ce9da11e889bda929f75049f365d0e51f9c64e9c00159a7da210a9f4ece0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_db::store::replaceable::replace_parameterized_event_in_transaction_impl: FunctionTooLong \u2014 buzz_db::store::replaceable::replace_parameterized_event_in_transaction_impl runs 207 significant 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 107 over it, 2.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/buzz-db/src/store/replaceable.rs"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"571a0aa4a4de2c07b98b9f872cb0197577a796b14a42a3c1844acbde4f2964b4"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::emit_db_usage_metrics: FunctionTooLong \u2014 buzz_relay::emit_db_usage_metrics runs 207 significant 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 107 over it, 2.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/buzz-relay/src/main.rs"},"region":{"startLine":1949}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff4ca8981334f43d26677ff9e4dd0404c7937fe5cfbb073d0c324b2c05fc12e3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ModelPicker.ModelPicker: FunctionTooLong \u2014 ModelPicker runs 207 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 107 over it, 2.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":"desktop/src/features/agents/ui/ModelPicker.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"0196f01ffa4b6fed423e6efc79443094c7801fbe3f50e30a0c7183b5104c6877"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: InviteLinkSection.InviteLinkSection: FunctionTooLong \u2014 InviteLinkSection runs 207 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 107 over it, 2.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":"desktop/src/features/community-members/ui/InviteLinkSection.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ca23b5ff7f549120440eb91e0d7039085b9f0d09af1cb63ab507e0e425790b6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectReadmePanel.ReadmePanel: FunctionTooLong \u2014 ReadmePanel runs 207 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 107 over it, 2.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":"desktop/src/features/projects/ui/ProjectReadmePanel.tsx"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"7927a8fa04d86068bf4888fece73e93bb610e86d4001e5a85cdea3595db78667"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _MessageActionsPopover.build: MethodTooLong \u2014 build runs 207 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 107 over it, 2.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":"mobile/lib/features/channels/message_actions/message_action_popover.dart"},"region":{"startLine":523}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e182f027cc129ba03c6616f67be26e66c02d34ffa4c20c50a71ca329debfb7d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MembersSidebarMemberCard.MemberActionsMenu: FunctionTooLong \u2014 MemberActionsMenu runs 206 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 106 over it, 2.06\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/MembersSidebarMemberCard.tsx"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fa2b691fcd6c947d8a0ae8eecf467b4454a052a43e991a2143f4c0c37d7f9ba"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: IdentityRecoveryPairing.IdentityRecoveryPairing: FunctionTooLong \u2014 IdentityRecoveryPairing runs 206 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 106 over it, 2.06\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/IdentityRecoveryPairing.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"f29f2aa016936bfaee4e5d3294a4e591438b3e96661289928ea7384f38f136a8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AdminConsoleSettingsCard.AdminConsoleSettingsSession: FunctionTooLong \u2014 AdminConsoleSettingsSession runs 205 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 105 over it, 2.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":"desktop/src/features/admin-console/AdminConsoleSettingsCard.tsx"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc8d86b0d409c5c450eb28dd1f39db82f904bc3d959678693990d8a328ca4f85"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: agentConfigControls.AgentModelField: FunctionTooLong \u2014 AgentModelField runs 205 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 105 over it, 2.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":"desktop/src/features/agents/ui/agentConfigControls.tsx"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"df99a556fbfb25b54e3779ea1b81d86ed0d599c176809933b463ccea1110fd72"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ProfileAvatarEditor: ClassTooLong \u2014 817 significant lines (blank, comment-only and punctuation-only lines excluded), 3 methods. The bar is 400 significant lines; this is 417 over it, 2.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":"desktop/src/features/profile/ui/ProfileAvatarEditor.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec46bb913712df186edb51a65afa729df40b98dc1fe544db1b7f4ebdf9f7e213"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ChannelScreen: ClassTooLong \u2014 817 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 417 over it, 2.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":"desktop/src/features/channels/ui/ChannelScreen.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"710a15f7ce7c653a07cd0b906e9f41c29e578c2b794347c0494f000b636f3462"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: RunCtx.run: MethodTooLong \u2014 run runs 204 significant 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 104 over it, 2.04\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/agent.rs"},"region":{"startLine":318}}}],"partialFingerprints":{"codehealthFindingId/v1":"5099ae83459d1594eb95aff1c49ba3e8664072e57efc5fff0f1dd044dcca37e3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ChannelMembersBar.ChannelMembersBar: FunctionTooLong \u2014 ChannelMembersBar runs 203 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 103 over it, 2.03\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/ChannelMembersBar.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"d67a571f21c50e3d065eaf0bac83d616d136bd4e9127135d2924662c46c1d923"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: LocalArchiveSettingsCard.LocalArchiveSettingsCard: FunctionTooLong \u2014 LocalArchiveSettingsCard runs 203 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 103 over it, 2.03\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/local-archive/ui/LocalArchiveSettingsCard.tsx"},"region":{"startLine":391}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc1f95e04032eb3344b21a3531c0413aa665c792fd8599cc829105287a33e784"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AgentCreationPreview: ClassTooLong \u2014 810 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 410 over it, 2.03\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentCreationPreview.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbaef772bcf665dad7b3827e72b722fb453d1df54e6374209137996f48b4029f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useTtsSubscription.useTtsSubscription: FunctionTooLong \u2014 useTtsSubscription runs 202 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/huddle/lib/useTtsSubscription.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff99091c6e5eefdeeab40ab9468e6a665b5210cb071533469be94cbae2aa0ff5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::commands::agent_models_update::update_managed_agent: FunctionTooLong \u2014 buzz_desktop::commands::agent_models_update::update_managed_agent runs 201 significant 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 101 over it, 2.01\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/agent_models_update.rs"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"5456c73a1e736ff3610ba77a223c32fd96e4658b68feffba027acd82784204a7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectRepositoryManagement.ProjectRepositoryManagement: FunctionTooLong \u2014 ProjectRepositoryManagement runs 200 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 100 over it, 2.00\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectRepositoryManagement.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2f61fe9ff5cd6350d1db2230338e756a555e3152a02c073e35da1944b4d92f8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: workflowFormTypes.yamlToFormState: FunctionTooLong \u2014 yamlToFormState runs 200 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 100 over it, 2.00\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/workflowFormTypes.ts"},"region":{"startLine":408}}}],"partialFingerprints":{"codehealthFindingId/v1":"5345c9c99584e6578fc988b7638498970c3010db2a080fd8b68c76cb6f9b9ca7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/pocket_april.rs: FileTooLong \u2014 996 significant 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 496 over it, 1.99\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/buzz-voice/src/pocket_april.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2f281fa1b92f6a152e89f62ba42a2219bfe84ba69d94c9b3be1af9532c17b1a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: admin/mod.rs: FileTooLong \u2014 995 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), declaring 33 free functions. The bar is 500 significant lines; this is 495 over it, 1.99\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/buzz-relay/src/api/admin/mod.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bb17218b4d708e9b08ccadb436e15d33af7192513060ff34b3b69c815241a0d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AddChannelBotDialog.AddChannelBotDialog: FunctionTooLong \u2014 AddChannelBotDialog runs 199 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 99 over it, 1.99\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/AddChannelBotDialog.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d42e5cbf0f8ce78ae0dc1852d68bf19cf44691dd9d300ad960fda3e041ccaa8"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: Config: TooManyFields \u2014 59 stored fields beside 1 method. The bar is 30 stored fields; this is 29 over it, 1.97\u00D7 the bar. This is width in DATA, not behaviour: every reader that takes the whole type couples to all of its fields, so a change to any one of them is a change every reader has to be checked against. To reduce it, group the fields that are read together by the same callers into a smaller type of their own, and have this one hold that type as a single member \u2014 each reader then names only the group it uses."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/config.rs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"d234677b10305a859e647fb7ca121144405453752a866cee6b2eb26d51120a19"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::handlers::report_resolution::drive_enforcement: FunctionTooLong \u2014 buzz_relay::handlers::report_resolution::drive_enforcement runs 196 significant 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 96 over it, 1.96\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/buzz-relay/src/handlers/report_resolution.rs"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3a28be4f140a9918cdbea1535ae087d19f3013f83a997064179b5c6d38dff8e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: BotActivityBar.BotActivityComposerAction: FunctionTooLong \u2014 BotActivityComposerAction runs 196 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 96 over it, 1.96\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":"desktop/src/features/channels/ui/BotActivityBar.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea633187f0f609e604273bb14b25b5e39fa8a4c78058457b9541a8134a56a770"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AvatarCustomColorPanel.AvatarCustomColorPanel: FunctionTooLong \u2014 AvatarCustomColorPanel runs 196 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 96 over it, 1.96\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":"desktop/src/features/profile/ui/AvatarCustomColorPanel.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"53d762de5a4987c785d80ea24d6293e60dc5a06bb149aff27642b870218535a3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CreatePullRequestDialog.CreatePullRequestDialog: FunctionTooLong \u2014 CreatePullRequestDialog runs 196 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 96 over it, 1.96\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":"desktop/src/features/projects/ui/CreatePullRequestDialog.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"62a69c9cde94b2139d03cf727a6c0eb1c03a0c23f8ec4022c364d3620d2fd7e2"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/SetupStep.tsx: FileTooLong \u2014 973 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 473 over it, 1.95\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":"desktop/src/features/onboarding/ui/SetupStep.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"178afdfb159f90ea042b360b45b7af35302cfad1a88560c5b4c3dd20b88aca81"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SetupStep.RuntimeCard: FunctionTooLong \u2014 RuntimeCard runs 194 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 94 over it, 1.94\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":"desktop/src/features/onboarding/ui/SetupStep.tsx"},"region":{"startLine":420}}}],"partialFingerprints":{"codehealthFindingId/v1":"c30a40b92f564f66345381d6bd33c442f56d3060205385a1258a6daa9c53665e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectHomeContextPanel.ProjectHomeContextPanel: FunctionTooLong \u2014 ProjectHomeContextPanel runs 194 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 94 over it, 1.94\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":"desktop/src/features/projects/ui/ProjectHomeContextPanel.tsx"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"553793cf59dcffc19dc390132a2708329f478de3c83d8fc9f3c1069352a48530"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: RepoDetailPage.RepoDetailPage: FunctionTooLong \u2014 RepoDetailPage runs 194 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 94 over it, 1.94\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":"web/src/features/repos/ui/RepoDetailPage.tsx"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2cbc864cb3dbd9be1635bd3d8c09721e1e4acc98fdbcd3a0993b425ae1c4bdc"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ProjectDetailScreen: ClassTooLong \u2014 774 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 374 over it, 1.94\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":"desktop/src/features/projects/ui/ProjectDetailScreen.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b6ece3653693e7a4f51c76ea984f5a6360ded15fd570c7219ee3c2aab38a602"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: RelaySessionNotifier: TooManyMethods \u2014 58 methods. The bar is 30 methods; this is 28 over it, 1.93\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":"mobile/lib/shared/relay/relay_session.dart"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"757f4527ffe84e7a7175bd73f830251c7632d7d65f8cb1f8ed7f12f23dadae74"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: ManagedAgentRecord: TooManyFields \u2014 58 stored fields beside 1 method. The bar is 30 stored fields; this is 28 over it, 1.93\u00D7 the bar. This is width in DATA, not behaviour: every reader that takes the whole type couples to all of its fields, so a change to any one of them is a change every reader has to be checked against. To reduce it, group the fields that are read together by the same callers into a smaller type of their own, and have this one hold that type as a single member \u2014 each reader then names only the group it uses."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/types.rs"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2782feeca3e02d998000710f33c52a48759df3f1c358e24ab55d24e270a5db1"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Config.from_args: MethodTooLong \u2014 from_args runs 193 significant 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 93 over it, 1.93\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/config.rs"},"region":{"startLine":933}}}],"partialFingerprints":{"codehealthFindingId/v1":"c63b0c834d53b0bd54eae09200cdc6f49cd23939c5d454f876a3f64fc483996f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MessageThreadSummaryRow.MessageThreadSummaryRow: FunctionTooLong \u2014 MessageThreadSummaryRow runs 193 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 93 over it, 1.93\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/MessageThreadSummaryRow.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"b05d7ee82998c7baaf72daf2791ce2de4c0a1bfad90a288b8833d6900cfc4f34"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ComposeBar: ClassTooLong \u2014 768 significant lines (blank, comment-only and punctuation-only lines excluded), 2 methods. The bar is 400 significant lines; this is 368 over it, 1.92\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":"mobile/lib/features/channels/compose_bar/compose_bar_widget.dart"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f671b8bcb55c58f887c54d2ee40621300e08a710398c172eaf43890d78401db"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ChannelActivityPopover.ChannelActivityPopover: FunctionTooLong \u2014 ChannelActivityPopover runs 191 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 91 over it, 1.91\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/ChannelActivityPopover.tsx"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c336cd4d181cb6ba3cd21c91dddf37ea541ab0125ef862d1b82c3142fb49e3b"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AnimatedAvatarCapture: ClassTooLong \u2014 761 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 361 over it, 1.90\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/AnimatedAvatarCapture.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e0d94de9cb87ad6cf93b63a0c0ba06e0cfd6ec5d7c427cdba04beb2567215c9"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AddChannelMembersSheet.build: MethodTooLong \u2014 build runs 190 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"mobile/lib/features/channels/add_members_sheet.dart"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b0bf09eace1371418e683aafa1dd92a0495a49010699fafda96c1bc26bf41d6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: audio/handler.rs: FileTooLong \u2014 949 significant 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 449 over it, 1.90\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/buzz-relay/src/audio/handler.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d56191c37b18bb347cb364ce65d77c28ce505d03c0009b1434377989d899d4d6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useNewMessageRecipients.useNewMessageRecipients: FunctionTooLong \u2014 useNewMessageRecipients runs 189 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 89 over it, 1.89\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useNewMessageRecipients.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b5f8ba50e6a1ceedbca410ee445464ec33d0eea3f82e54ec3de2ca16e91bdc9"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: RelayClient: ClassTooLong \u2014 755 significant lines (blank, comment-only and punctuation-only lines excluded), 50 methods. The bar is 400 significant lines; this is 355 over it, 1.89\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":"desktop/src/shared/api/relayClientSession.ts"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"78594ec378372f264f1912caf9c476c9a396f056234cfd8690b73006ca956970"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::handlers::count::handle_count: FunctionTooLong \u2014 buzz_relay::handlers::count::handle_count runs 188 significant 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 88 over it, 1.88\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/buzz-relay/src/handlers/count.rs"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc0a07ec9a867c0a89588af57cbc01e19646d91a01d9cde7392f1e42b73d1f80"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: HomeView: ClassTooLong \u2014 751 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 351 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":"desktop/src/features/home/ui/HomeView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a601d6cb74f348c4af184cb3dcfaaf53a3f75d76fa46709da2c29f9924cea389"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/AgentInstanceEditDialog.tsx: FileTooLong \u2014 935 significant lines (blank, comment-only and punctuation-only lines excluded), about 90% of them inside a single declaration: AgentInstanceEditDialog (100-1225). The bar is 500 significant lines; this is 435 over it, 1.87\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":"desktop/src/features/agents/ui/AgentInstanceEditDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7aad26261b2356773fab58b7b7b363fffda2baf10cfac7975e5f92b659293edf"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useAgentManagement.useAgentManagement: FunctionTooLong \u2014 useAgentManagement runs 187 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 87 over it, 1.87\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":"desktop/src/features/agents/useAgentManagement.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"4eeb487590819401235084f8c73a0a8c6ad4a00120df888e8860caf929bbaa97"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: useMentionSendFlow: ClassTooLong \u2014 746 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 346 over it, 1.87\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":"desktop/src/features/messages/ui/useMentionSendFlow.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5900225b5970ce7a3fcd153f2f115ea787a224e2ff27e14578006f2ffc11bce8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/agentSessionTranscript.ts: FileTooLong \u2014 932 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 432 over it, 1.86\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":"desktop/src/features/agents/ui/agentSessionTranscript.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"918fe37afaaa0be2d3a0df26924b307e1c6cd15633ce304b09db0a628cb57fbe"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: usePersonaModelDiscovery.usePersonaModelDiscovery: FunctionTooLong \u2014 usePersonaModelDiscovery runs 186 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 86 over it, 1.86\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":"desktop/src/features/agents/ui/usePersonaModelDiscovery.ts"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"7baf47bf158252a61f90d86ec8480b734642cb88d5a88ce53c5fb5f482a0f303"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CreateProjectWorkItemDialog.CreateProjectWorkItemDialog: FunctionTooLong \u2014 CreateProjectWorkItemDialog runs 186 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 86 over it, 1.86\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":"desktop/src/features/projects/ui/CreateProjectWorkItemDialog.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"3284e734b6330a144fab35fa01ea2f5f9818c2128be5ac1799cee0c7119455fa"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: NoteCard.NoteCard: FunctionTooLong \u2014 NoteCard runs 186 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 86 over it, 1.86\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":"desktop/src/features/pulse/ui/NoteCard.tsx"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"3da160f8c6aa6142e08db312f151344eb9f81ebe91ce07fba957e9264ab7b925"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AppShell: ClassTooLong \u2014 740 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 340 over it, 1.85\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":"desktop/src/app/AppShell.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"231f4f75b24636331c383af67cd250d12f51148ddc301745344d602de5729589"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AgentDefinitionDialog: ClassTooLong \u2014 737 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 337 over it, 1.84\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":"desktop/src/features/agents/ui/AgentDefinitionDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d944583d80460e0c79fdbb704d4f902a40b8f3aad5795853fa77cc9c898e11f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CustomChannelSection.ChannelGroupSection: FunctionTooLong \u2014 ChannelGroupSection runs 184 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 84 over it, 1.84\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":"desktop/src/features/sidebar/ui/CustomChannelSection.tsx"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"568078897ea8c0eadc8126be91439c0eb34014e1dc26d28a1ea6716536545631"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/lib.rs: FileTooLong \u2014 915 significant 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 31 free functions. The bar is 500 significant lines; this is 415 over it, 1.83\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/git-sign-nostr/src/lib.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa1885981c139fdf28b9152b985575c11e8c0c51e69c9cce02772c4afa0d96af"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_pair_relay::handle_conn: FunctionTooLong \u2014 buzz_pair_relay::handle_conn runs 183 significant 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 83 over it, 1.83\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-pair-relay/src/lib.rs"},"region":{"startLine":620}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebd47e40e127459f64670420ca140dad437b2080486520dfe6e1aecc04b23f56"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProfileStep.ProfileStep: FunctionTooLong \u2014 ProfileStep runs 183 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 83 over it, 1.83\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/ProfileStep.tsx"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff5043904e159a26c90359b7ce540db82923a0031ced93ffb43bef57ce0ac980"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _ThemePreviewExperience.build: MethodTooLong \u2014 build runs 183 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 83 over it, 1.83\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/settings/theme_picker_page/theme_preview_sheet.dart"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"507b1d3585d4cecb60799586c0c15f5990f3629b100a00fdd6e1426b553ffd0e"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: UserProfilePanel: ClassTooLong \u2014 730 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 330 over it, 1.83\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/UserProfilePanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6acfa09c808e9c9a3dc5492b9b1e24645b005a037fa5fb604668aa63314db101"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/ChannelPane.tsx: FileTooLong \u2014 912 significant lines (blank, comment-only and punctuation-only lines excluded), about 92% of them inside a single declaration: ChannelPane (78-994). The bar is 500 significant lines; this is 412 over it, 1.82\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":"desktop/src/features/channels/ui/ChannelPane.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"11b7b49d3f4e12121c30a4dadd85f2c9feaa4c6680613b7927ca9a4f1d5d6921"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AppSidebar: ClassTooLong \u2014 728 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 328 over it, 1.82\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/AppSidebar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d06c673f6498fb54a6810fc701975af4f133b085b5510e8a3c330a769f5a5474"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ThemePreviewFrame.ThemePreviewSvg: FunctionTooLong \u2014 ThemePreviewSvg runs 182 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 82 over it, 1.82\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/theme/ThemePreviewFrame.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"70eba5931c827fbf16fffb57ad92a6e79c55a5ae5e217a1e1ed37f65cb796d1a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _ComposeBarLayout._buildBar: MethodTooLong \u2014 _buildBar runs 182 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 82 over it, 1.82\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/compose_bar/layout.dart"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd62803c67117a28fa7719553b2639db5ccd73118a5fd4276f35a68159fe8e41"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: audio/join.rs: FileTooLong \u2014 908 significant 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 408 over it, 1.82\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/audio/join.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"54eafdb06e6b74359c2cdfb7ce2cbdc85c3b985fcb33ccc380a2768514c56358"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: _MessageList: ClassTooLong \u2014 724 significant lines (blank, comment-only and punctuation-only lines excluded), 2 methods. The bar is 400 significant lines; this is 324 over it, 1.81\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":"mobile/lib/features/channels/channel_detail_page/message_list.dart"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d7d55a3dd45a23cd5cce9ec1b94ae878873bf1b42fe56134195e59648b9488d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/ChannelScreen.tsx: FileTooLong \u2014 905 significant lines (blank, comment-only and punctuation-only lines excluded), about 90% of them inside a single declaration: ChannelScreen (90-996). The bar is 500 significant lines; this is 405 over it, 1.81\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":"desktop/src/features/channels/ui/ChannelScreen.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e14ce1baae6911e3103bd1adf49f19397abba30ab8517431bd4c942061d1b4b5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::terminal_runtime::terminal_attach: FunctionTooLong \u2014 buzz_desktop::terminal_runtime::terminal_attach runs 181 significant 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 81 over it, 1.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":"desktop/src-tauri/src/terminal_runtime.rs"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"b32ebfe04e9fc856c323f395eb40338ea0da224e3df2ec23887982ddbec13ea6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ChannelCanvas.ChannelCanvas: FunctionTooLong \u2014 ChannelCanvas runs 181 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 81 over it, 1.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":"desktop/src/features/channels/ui/ChannelCanvas.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"06a45ad34d01afabd37bab1366dbe783b6c921d28b4a112307f524dcbb7bd1a9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useInboxSelectionAnchor.useInboxSelectionAnchor: FunctionTooLong \u2014 useInboxSelectionAnchor runs 181 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 81 over it, 1.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":"desktop/src/features/home/useInboxSelectionAnchor.ts"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ef94fba5294fbed165634d48fdf83fc31aef606c3cb687876736e8129394bba"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AnimatedAvatarControls.AvatarFramingSlider: FunctionTooLong \u2014 AvatarFramingSlider runs 181 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 81 over it, 1.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":"desktop/src/features/profile/ui/AnimatedAvatarControls.tsx"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b6db13619bf531feee948bb9f2f8dc73ccb388e105e583c74d9cecdf4d3d19d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SidebarProfileCard.SidebarProfileCard: FunctionTooLong \u2014 SidebarProfileCard runs 181 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 81 over it, 1.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":"desktop/src/features/sidebar/ui/SidebarProfileCard.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e96e3875423d2025c3528f146ca3c4b63a9d1396c6c96367fa631a51ca8abdf"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkflowScheduleFields.WorkflowScheduleFields: FunctionTooLong \u2014 WorkflowScheduleFields runs 181 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 81 over it, 1.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":"desktop/src/features/workflows/ui/WorkflowScheduleFields.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"84b0ba670a044790e40d8e8721995b09ed826427487904dfee6e85293dd8dd13"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AppTheme._buildTheme: MethodTooLong \u2014 _buildTheme runs 181 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 81 over it, 1.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":"mobile/lib/shared/theme/app_theme.dart"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad1c8e05be1c6b88ff893db3494d9b00f4156ab55a55911e42d418ff3a127d4d"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: NativeAttachmentPopoverViewController: ClassTooLong \u2014 722 significant lines (blank, comment-only and punctuation-only lines excluded), 39 methods. The bar is 400 significant lines; this is 322 over it, 1.81\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":"mobile/ios/Runner/NativeAttachmentPopover.swift"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"d727540c237cdbe4a06d7da242ffe3e4fe716738cac2714abc39b3eb86c48002"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DeletionStore: TooManyMethods \u2014 54 methods. The bar is 30 methods; this is 24 over it, 1.80\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/buzz-db/src/store/deletion.rs"},"region":{"startLine":678}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2e92600f0dad904fbfc8793bf3396325e4269bf7ac95d20d955c799803f5f65"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::api::git::cas_publish::cas_publish_inner: FunctionTooLong \u2014 buzz_relay::api::git::cas_publish::cas_publish_inner runs 180 significant 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 80 over it, 1.80\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/buzz-relay/src/api/git/cas_publish.rs"},"region":{"startLine":1021}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae04f42a38a76b81a07a14d8ab2dd9c8b72546683d75c7664e1f0c686645b057"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AddAgentToChannelDialog.AddAgentToChannelDialog: FunctionTooLong \u2014 AddAgentToChannelDialog runs 180 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 80 over it, 1.80\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":"desktop/src/features/agents/ui/AddAgentToChannelDialog.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"a80c2e6b9636010335ed31f5f15514686182933533f925bbd855d213c3637678"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CompactMessageSummary.CompactMessageSummary: FunctionTooLong \u2014 CompactMessageSummary runs 180 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 80 over it, 1.80\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":"desktop/src/features/agents/ui/AgentSessionToolItem/CompactMessageSummary.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e434d71d4a7674d7371483cabaf4d76e01c273e41998d14ed9cf7d834c6a5ea"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ForumThreadPanel.ForumThreadPanel: FunctionTooLong \u2014 ForumThreadPanel runs 180 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 80 over it, 1.80\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":"desktop/src/features/forum/ui/ForumThreadPanel.tsx"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfd01fede1930f16123dcf08f57e3159030a33f5498aeb3ca975921e22bf28ce"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _HuddleCallAvatar.build: MethodTooLong \u2014 build runs 180 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 80 over it, 1.80\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":"mobile/lib/features/channels/channel_detail_page/huddle_call_avatar.dart"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"4201c4400faed4c30da00d7810473bcbb500fc2a119f58c8d205972b612a22dd"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/auth.rs: FileTooLong \u2014 896 significant 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 396 over it, 1.79\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/auth.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5bb6caddbda5498203a969bda268240a83fe9ea3c7b1d256fb2462419b5a331"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ForumView.ForumView: FunctionTooLong \u2014 ForumView runs 179 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 79 over it, 1.79\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/forum/ui/ForumView.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5967053fa8a710f8954fabdd7b5c003177fa39afe42d29b585f3897da0d340c"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ManageChannelSheet.build: MethodTooLong \u2014 build runs 179 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 79 over it, 1.79\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/manage_channel_sheet.dart"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"01e75850ae907477344eb7931cca63c83f7b0433472d952dd5f50ede3ccc66bf"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: MessageRow: ClassTooLong \u2014 714 significant lines (blank, comment-only and punctuation-only lines excluded), 3 methods. The bar is 400 significant lines; this is 314 over it, 1.79\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/MessageRow.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a34130c3bd562a3ca9ac44b159d90e454f8a13046a115bd7ea7425de5f0a065"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_deletion::execute_stage: FunctionTooLong \u2014 buzz_deletion::execute_stage runs 177 significant 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 77 over it, 1.77\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/buzz-deletion/src/lib.rs"},"region":{"startLine":1193}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c7fec7d51875b36758cf58956edc56deb30c931b87f3f65a50714097f3a1252"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::push_runtime::deliver_one: FunctionTooLong \u2014 buzz_relay::push_runtime::deliver_one runs 177 significant 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 77 over it, 1.77\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/buzz-relay/src/push_runtime.rs"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"17b19b799d72629310337405fa66a58a02fdd1d48890e7f35cb9b90ae9397bda"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectsChannelsList.ProjectsChannelsList: FunctionTooLong \u2014 ProjectsChannelsList runs 177 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 77 over it, 1.77\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":"desktop/src/features/projects/ui/ProjectsChannelsList.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"62dce1bed56b38f7a8b6588176a574f675153149566950a4ad06b5c472c3a610"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/MessageComposer.tsx: FileTooLong \u2014 883 significant lines (blank, comment-only and punctuation-only lines excluded), about 92% of them inside a single declaration: MessageComposerImpl (70-1011). The bar is 500 significant lines; this is 383 over it, 1.77\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":"desktop/src/features/messages/ui/MessageComposer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"747a984091fc1248e016192f6eec1311e004dbd1dace38318f0a62f78efaf9b1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useCommunityInit.useCommunityInit: FunctionTooLong \u2014 useCommunityInit runs 176 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 76 over it, 1.76\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/communities/useCommunityInit.ts"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"87915f8cd7ab817786dd7ce48599da1190b5c8578853534614f44d19010d137c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/ChannelManagementSheet.tsx: FileTooLong \u2014 876 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 376 over it, 1.75\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/ChannelManagementSheet.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a442d88dce2e4e6c54d83d1b647d9d23d9d96556662dc075480e4d51bfa291a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/ProfileAvatarEditor.tsx: FileTooLong \u2014 876 significant lines (blank, comment-only and punctuation-only lines excluded), about 93% of them inside a single declaration: ProfileAvatarEditor (67-1073). The bar is 500 significant lines; this is 376 over it, 1.75\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":"desktop/src/features/profile/ui/ProfileAvatarEditor.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"26bcb4da08927c6a5d468960414ef9b6ed390281fbde403c9b731eb898bca5bc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: nip-rs-unread/exhaustive.py: FileTooLong \u2014 875 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 375 over it, 1.75\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/formal/nip-rs-unread/exhaustive.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"45e9c48b881d46c4f97484339f9b518409f15193054245c9415d0f41bccb565c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: markdown.ImageBlock: FunctionTooLong \u2014 ImageBlock runs 175 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 75 over it, 1.75\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":"desktop/src/shared/ui/markdown.tsx"},"region":{"startLine":986}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f35b3945c3b74c1be61b3077c5ec6fc2f06aa0fcbe3770012310a55e89072a8"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: useMentions: ClassTooLong \u2014 699 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 299 over it, 1.75\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":"desktop/src/features/messages/lib/useMentions.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3328e0436ab1c0065b9d21f6797f742d10d41afd01353d22024891b3f8b39ee"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useCommunityJoinAlerts.useCommunityJoinAlerts: FunctionTooLong \u2014 useCommunityJoinAlerts runs 174 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/community-members/useCommunityJoinAlerts.ts"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"a86e169f4078afe02b1697d9cc75d5df7b4ba3210ad0215d8319c40907cf6f7a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useVoiceNoteRecorder.useVoiceNoteRecorder: FunctionTooLong \u2014 useVoiceNoteRecorder runs 174 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/messages/lib/useVoiceNoteRecorder.ts"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e408aff823788feaa5953d144d4f82b31a50e971c182814b1840b55e70aebbb"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectDetailFeedPanels.ActivityPanel: FunctionTooLong \u2014 ActivityPanel runs 174 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/projects/ui/ProjectDetailFeedPanels.tsx"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bb2bad77e86e83e405e6ef8981df46c0866a355ab628e7585454be640f8a8d7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SignOutSection.SignOutSection: FunctionTooLong \u2014 SignOutSection runs 174 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/settings/ui/SignOutSection.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dfbd3e751c60aa6b3b22c5685d3205f3c10be2171c68390392aeb6ce10e6c82"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: VoiceNoteAttachment.build: MethodTooLong \u2014 build runs 174 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"mobile/lib/features/channels/voice_note_attachment.dart"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"03d0a0f55fb0fbd7825c84e917edc551e4536f18d3a0d04744e04e711d7312f0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/client.rs: FileTooLong \u2014 866 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 62% of them inside a single declaration: BuzzClient (2 blocks, 516-1394). The bar is 500 significant lines; this is 366 over it, 1.73\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/buzz-cli/src/client.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fcba9a279b699e02f64e835afc3cde3b7075639dedec6c591a9361540a0bbeb"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::handlers::auth::handle_auth: FunctionTooLong \u2014 buzz_relay::handlers::auth::handle_auth runs 173 significant 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 73 over it, 1.73\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/auth.rs"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"29d7b449c710eddc784544f3b2a25dc37b3b4f360064fe9d1d945a5c8709c496"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: EditCommunityDialog.EditCommunityDialog: FunctionTooLong \u2014 EditCommunityDialog runs 173 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 73 over it, 1.73\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/communities/ui/EditCommunityDialog.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"989620f5c3a39817054563b7c18c53f44bff3a433b3d0d7a29951e27cd4ac318"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectsActivityFeed.ActivityCard: FunctionTooLong \u2014 ActivityCard runs 173 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 73 over it, 1.73\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectsActivityFeed.tsx"},"region":{"startLine":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6dd7e99e4d0c7a6791ba1c8096d945023b58ca82c232566f75e7a14fe946b03"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ProjectsView: ClassTooLong \u2014 690 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 290 over it, 1.73\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectsView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2828d0c9e2344a9de1a2d7e78bfc543b35c349831a2f6a507f43060178509b6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::managed_agents::config_bridge::reader::read_config_surface: FunctionTooLong \u2014 buzz_desktop::managed_agents::config_bridge::reader::read_config_surface 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":"desktop/src-tauri/src/managed_agents/config_bridge/reader.rs"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0b3c1731ec81693bca220ebccfd94937fdb53ad3cca3e8914cb9f4b51974bc3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CreateChannelFormFields.CreateChannelFormFields: FunctionTooLong \u2014 CreateChannelFormFields runs 172 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 72 over it, 1.72\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/CreateChannelFormFields.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d28ffd99eb35f20ce6c033c0b91514829bc00703882979a810c5d5ff0f30817"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: handlers/command_executor.rs: FileTooLong \u2014 858 significant 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 358 over it, 1.72\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/command_executor.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eadc22ff7fb54c8569f837ad122d33b9ed5584d681a1d14a68d754198becdd50"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/ProjectDetailScreen.tsx: FileTooLong \u2014 858 significant lines (blank, comment-only and punctuation-only lines excluded), about 90% of them inside a single declaration: ProjectDetailScreen (87-990). The bar is 500 significant lines; this is 358 over it, 1.72\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":"desktop/src/features/projects/ui/ProjectDetailScreen.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"20fa1151c42fbd7c4398ba904b2966fdbce58c5d02849e026a5fe0b029fd3341"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ChannelMessagesNotifier: ClassTooLong \u2014 685 significant lines (blank, comment-only and punctuation-only lines excluded), 41 methods. The bar is 400 significant lines; this is 285 over it, 1.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":"mobile/lib/features/channels/channel_messages_provider.dart"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"8830a13aa041e38423e6a8a071ac0a680ced5cf1543e20f45e5bd06760428bfd"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/AgentCreationPreview.tsx: FileTooLong \u2014 856 significant lines (blank, comment-only and punctuation-only lines excluded), about 95% of them inside a single declaration: AgentCreationPreview (47-1043). The bar is 500 significant lines; this is 356 over it, 1.71\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":"desktop/src/features/agents/ui/AgentCreationPreview.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"88af39e3e818a015358cf9231d66863ed0ba41c30933e86ef26b3c48e86aee8f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/AgentDefinitionDialog.tsx: FileTooLong \u2014 856 significant lines (blank, comment-only and punctuation-only lines excluded), about 86% of them inside a single declaration: AgentDefinitionDialog (124-1016). The bar is 500 significant lines; this is 356 over it, 1.71\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":"desktop/src/features/agents/ui/AgentDefinitionDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed68ec076529d6f4dfa4192e2f5987a984512821204c9e1e1ed2a62c55e70bde"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MembersSidebarMemberCard.MembersSidebarMemberCard: FunctionTooLong \u2014 MembersSidebarMemberCard runs 171 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 71 over it, 1.71\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/MembersSidebarMemberCard.tsx"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ca59e77bb44258f97fd6fe1315dc30bc3c3eed509e21366addd4fcdfa09eb73"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AgentConfigFields: ClassTooLong \u2014 683 significant lines (blank, comment-only and punctuation-only lines excluded), 5 methods. The bar is 400 significant lines; this is 283 over it, 1.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":"desktop/src/features/agents/ui/AgentConfigFields.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d6cccb632f4b02580218f2d89303f0c67ac3dd457aa8c7186c3ac7c195a3720"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/config.rs: FileTooLong \u2014 851 significant 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 351 over it, 1.70\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/config.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e84684ee3c0f6b49ff51ceff1371f29c500850df35d9e7a5a7bd284defe11acb"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buildMentionCandidates.buildMentionCandidates: FunctionTooLong \u2014 buildMentionCandidates runs 170 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 70 over it, 1.70\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":"desktop/src/features/messages/lib/buildMentionCandidates.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"43fddf217e5b6e1cd8ab54125fe403ea454857a149902cbc8a4d4870b918a835"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectPullRequestFilesChangedPanel.ProjectDiffFilesPanel: FunctionTooLong \u2014 ProjectDiffFilesPanel runs 170 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 70 over it, 1.70\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":"desktop/src/features/projects/ui/ProjectPullRequestFilesChangedPanel.tsx"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2703e06e6f7e7b1db99a8185c6d2fdb7e5e8e54f603a1dbfbc45d434d0a35eb"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: app/AppShell.tsx: FileTooLong \u2014 849 significant lines (blank, comment-only and punctuation-only lines excluded), about 87% of them inside a single declaration: AppShell (110-1010). The bar is 500 significant lines; this is 349 over it, 1.70\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":"desktop/src/app/AppShell.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"52a89c2724117f28d5b5f9bee79e102eeb1174343ec3722b988889e361ffc86a"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ThreadDetailPage: ClassTooLong \u2014 678 significant lines (blank, comment-only and punctuation-only lines excluded), 2 methods. The bar is 400 significant lines; this is 278 over it, 1.70\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/thread_detail_page.dart"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e7381cb686f20e3feb450215fdc6562909ecb1385c28bfea8f4cdd06bad7cc0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/HomeView.tsx: FileTooLong \u2014 845 significant lines (blank, comment-only and punctuation-only lines excluded), about 89% of them inside a single declaration: HomeView (101-1004). The bar is 500 significant lines; this is 345 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":"desktop/src/features/home/ui/HomeView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"65e46a858ef8af42f255f73f0f10cc6da0004b475b23fee676151efd7372db75"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _EmojiMode.build: MethodTooLong \u2014 build runs 169 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 69 over it, 1.69\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":"mobile/lib/features/profile/profile_avatar_editor/emoji_avatar_picker.dart"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"89b6f5c60256371fffd1da48c38ad3d4cd099f2d0433fe265d8e01efea20dbae"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/WorkflowFormBuilder.tsx: FileTooLong \u2014 844 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 344 over it, 1.69\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/WorkflowFormBuilder.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c335e4f0033d8ad0923e9e77bec98c1f46db35daf4df4e19dd2c1628e4691cf"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: git/cas_publish.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/buzz-relay/src/api/git/cas_publish.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff0614a91b90cf66b9b00a7a925a8c0363be492d209f8124208ff77ada613e68"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ComposerAddressControls.ComposerMentionButton: FunctionTooLong \u2014 ComposerMentionButton runs 168 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 68 over it, 1.68\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":"desktop/src/features/messages/ui/ComposerAddressControls.tsx"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5f8023b7802252d5ab83af897bfce69e26af8523040f49f43fb60590d6dc447"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/MessageRow.tsx: FileTooLong \u2014 839 significant lines (blank, comment-only and punctuation-only lines excluded), about 85% of them inside a single declaration: MessageRow (71-941). The bar is 500 significant lines; this is 339 over it, 1.68\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":"desktop/src/features/messages/ui/MessageRow.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7603048e781f31d73a4fa27df3d4ac8d90e2c69e7e519f05ea99c6bc10b0990"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/AgentConfigFields.tsx: FileTooLong \u2014 836 significant lines (blank, comment-only and punctuation-only lines excluded), about 82% of them inside a single declaration: AgentConfigFields (212-1045). The bar is 500 significant lines; this is 336 over it, 1.67\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":"desktop/src/features/agents/ui/AgentConfigFields.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"111ea238d3db723cb8d42ae5319576afab6e040f79e198b06dd8192391843216"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SetupStep.SetupStepContent: FunctionTooLong \u2014 SetupStepContent runs 167 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 67 over it, 1.67\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":"desktop/src/features/onboarding/ui/SetupStep.tsx"},"region":{"startLine":963}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d3ccfed5667b394fa271fb927447c8f5471fbe610bd6d6f9f3747270da27b71"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: UserProfilePanelTabs.ProfileRuntimeTabContent: FunctionTooLong \u2014 ProfileRuntimeTabContent runs 167 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 67 over it, 1.67\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":"desktop/src/features/profile/ui/UserProfilePanelTabs.tsx"},"region":{"startLine":713}}}],"partialFingerprints":{"codehealthFindingId/v1":"b20914558616b65ea5ca5479210ae3880a65be4bdd1e873f2b4f853d53929ada"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: segmented-control.SegmentedControl: FunctionTooLong \u2014 SegmentedControl runs 167 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 67 over it, 1.67\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":"desktop/src/shared/ui/segmented-control.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3effc5d5b314f42544b28d59a3172356579f697d3a1c7a9297734b44b70ab25"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _RecentPhotoGalleryPicker.build: MethodTooLong \u2014 build runs 167 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 67 over it, 1.67\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":"mobile/lib/features/channels/compose_bar/photo_gallery_picker.dart"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b8dd0bdb46b4e7672c888abce7ec7260dd6c746fe8fa6698fab7e8d7ecbd0e5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/ProjectPullRequestsPanel.tsx: FileTooLong \u2014 834 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 334 over it, 1.67\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectPullRequestsPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bbe58ad0d631bb1c1bd293a1d381c9081ac711c9985bd5c1a5309af51c1a2eb"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: buzz_desktop::managed_agents::storage: TooManyFunctions \u2014 50 free functions. The bar is 30 free functions; this is 20 over it, 1.67\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/storage.rs"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b1960d94637ad23788f87ed7876b706e2b9d45bf6fa7344aec1fd64b4d5d154"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: RelayClient: TooManyMethods \u2014 50 methods. The bar is 30 methods; this is 20 over it, 1.67\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/api/relayClientSession.ts"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"3335e332a70382e2ca4f0ef2eb2225cbb38032ab2bf23db318e017cd00c35a7f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: api/relayClientSession.ts: FileTooLong \u2014 833 significant lines (blank, comment-only and punctuation-only lines excluded), about 91% of them inside a single declaration: RelayClient (79-1199). The bar is 500 significant lines; this is 333 over it, 1.67\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":"desktop/src/shared/api/relayClientSession.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"217c3e975732fea50a92173d30fe772643a70442a25539e9f3af25b0aa58fad7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/UserProfilePanel.tsx: FileTooLong \u2014 831 significant lines (blank, comment-only and punctuation-only lines excluded), about 88% of them inside a single declaration: UserProfilePanel (104-998). The bar is 500 significant lines; this is 331 over it, 1.66\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/UserProfilePanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c0cf874309ecd0710a069e9765549581bd9e73c57a559393e43cfce9f912e73"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AvatarUpload.AvatarUpload: FunctionTooLong \u2014 AvatarUpload runs 166 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 66 over it, 1.66\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/AvatarUpload.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"84e6a990dbe3845238d2d3c544d54af390416cb9442fead94922237565942155"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: IosGlassNavigationButton.build: MethodTooLong \u2014 build runs 166 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 66 over it, 1.66\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/widgets/ios_glass_navigation_button.dart"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"b79103a68c855ce9fd24f0847db0e08d50308691f19c8a874985ff4052b8c695"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/state.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/buzz-relay/src/state.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cfd7f94380ce3660890523b2da4bf3cdc8d40877e907a392388efc7b730ece5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/AnimatedAvatarCapture.tsx: FileTooLong \u2014 829 significant lines (blank, comment-only and punctuation-only lines excluded), about 92% of them inside a single declaration: AnimatedAvatarCapture (71-1007). The bar is 500 significant lines; this is 329 over it, 1.66\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/AnimatedAvatarCapture.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b82f74daeac85be460ade040d1aacdc0ea29c9a835dcfe3bb3277e0658a2ed7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: BuzzPushKit/BuzzDevPushEnrollmentDriver.swift: FileTooLong \u2014 825 significant lines (blank, comment-only and punctuation-only lines excluded), about 62% of them inside a single declaration: BuzzDevPushEnrollmentDriver (333-986). The bar is 500 significant lines; this is 325 over it, 1.65\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzDevPushEnrollmentDriver.swift"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f23e2774ddd1f31b418bd2a696ca27ae35e8c3f59917ed9ec193dca2dc1a0c55"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::api::bridge::count_events_authed: FunctionTooLong \u2014 buzz_relay::api::bridge::count_events_authed runs 165 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 65 over it, 1.65\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/bridge.rs"},"region":{"startLine":1931}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a71d7d19f88ccbcbb882a52e840bbebd6ed1a5cba22c3891b977acd98ccefe6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useProfileInteractionActions.useProfileInteractionActions: FunctionTooLong \u2014 useProfileInteractionActions runs 165 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 65 over it, 1.65\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/useProfileInteractionActions.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"9950301a10a2cb5bf7ccaf2bd88c88b1a106922a595833bc694a9a47268cf825"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SidebarSection.SidebarSection: FunctionTooLong \u2014 SidebarSection runs 165 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 65 over it, 1.65\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/SidebarSection.tsx"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"97a0d0a4df38c0db36201ffc54e503fe1890dff6ac3ba779c97929ff816bf7da"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: UserProfileSheet.build: MethodTooLong \u2014 build runs 165 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 65 over it, 1.65\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/profile/user_profile_sheet.dart"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b49a3354e1dd3912fd5a3fce1e0bea7d8d79cafe6eb56146bcf9e74e2039e84"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BuzzPushLeaseDescriptor.fromRelayInformation: MethodTooLong \u2014 fromRelayInformation runs 165 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 65 over it, 1.65\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/push/dev_push_lease.dart"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c470ceb3ace9d6a697dcd2a815555f18390649fa121824af7dee68f79fb084d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: handlers/req.rs: FileTooLong \u2014 823 significant 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 323 over it, 1.65\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/req.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"16d4319bd40354b56fdaccabb2c6e5c6098e3a8494d23867873eea6027c6c083"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AvatarStep.AvatarStep: FunctionTooLong \u2014 AvatarStep runs 164 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 64 over it, 1.64\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/AvatarStep.tsx"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff76dc3fca1f3465664b570050e1d8dd894a34fb7c9d51feabe05ac95a78349b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/WorkflowDialog.tsx: FileTooLong \u2014 819 significant lines (blank, comment-only and punctuation-only lines excluded), about 78% of them inside a single declaration: WorkflowDialog (216-965). The bar is 500 significant lines; this is 319 over it, 1.64\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":"desktop/src/features/workflows/ui/WorkflowDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"22b5fd41df74ed76175dc150bce85e56455666bb2be12040e39297f7bb1ce87a"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: MessageThreadPanel: ClassTooLong \u2014 654 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 254 over it, 1.64\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":"desktop/src/features/messages/ui/MessageThreadPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1ec167361def236f544fa541006fe8cf3598c528bdff981036d9cfc1c5be31a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/App.tsx: FileTooLong \u2014 817 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 317 over it, 1.63\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":"admin-web/src/App.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c4fedf7fbee45bf2f4984b76b9377cdf679301c82f9225611a993157f44a65d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CustomChannelSection.SectionActionsMenu: FunctionTooLong \u2014 SectionActionsMenu runs 163 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/sidebar/ui/CustomChannelSection.tsx"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b1db87ae8b2cbf1f7843338fb9c9107beea3aa21350e6ea7292911223ddb23c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/HostedCommunitiesSettingsCard.tsx: FileTooLong \u2014 810 significant lines (blank, comment-only and punctuation-only lines excluded), about 63% of them inside a single declaration: HostedCommunitiesSettingsCard (69-737). The bar is 500 significant lines; this is 310 over it, 1.62\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/HostedCommunitiesSettingsCard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aac19c0daaab026be68cff490b7adb16fcd90e8ff63db64e64cd5c83913cf0bb"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ThemeProvider.ThemeProvider: FunctionTooLong \u2014 ThemeProvider runs 162 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 62 over it, 1.62\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/theme/ThemeProvider.tsx"},"region":{"startLine":480}}}],"partialFingerprints":{"codehealthFindingId/v1":"91df99d795f25e62b0c1ae59409eb6bdb514ceebf81b4bcd09e7f47687cec8ba"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::api::git::policy::hook_policy_check: FunctionTooLong \u2014 buzz_relay::api::git::policy::hook_policy_check runs 161 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 61 over it, 1.61\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/git/policy.rs"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"c046bd5627cbc3f01da741440da8b423a675c47c98cfa00b53bcbbdee0d77813"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: agentConfigControls.AgentDropdownSelect: FunctionTooLong \u2014 AgentDropdownSelect runs 161 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 61 over it, 1.61\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/agentConfigControls.tsx"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"957eb3b531cbc627a2ef85c3990d2a1cca6dcfc6dd4c0f75a94efdb3c0544798"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: HuddleAttachment.HuddleAttachment: FunctionTooLong \u2014 HuddleAttachment runs 161 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 61 over it, 1.61\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/components/HuddleAttachment.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"e38879e63e2fb62770be41ec2ea3e6aa13d7245f20f5ca4a0a475ae1744c3a5e"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _MorphingQuickActionsButton.build: MethodTooLong \u2014 build runs 161 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 61 over it, 1.61\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channels_page/quick_actions.dart"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbb70a0d31d6c73f6441f41254fc8aa2a7c1ce320ee8f4b8398e015f692c1216"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/AppSidebar.tsx: FileTooLong \u2014 804 significant lines (blank, comment-only and punctuation-only lines excluded), about 91% of them inside a single declaration: AppSidebar (80-961). The bar is 500 significant lines; this is 304 over it, 1.61\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":"desktop/src/features/sidebar/ui/AppSidebar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d3a8af07184ea9f0af16eae906c3a0be510aa23056703294d579ce22dbea236"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/config.rs: FileTooLong \u2014 801 significant 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 76% of them inside a single declaration: Config (2 blocks, 118-1380). The bar is 500 significant lines; this is 301 over it, 1.60\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/buzz-relay/src/config.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8266bc9e930fedda22a9ee8440553bd36963a9ee8f20d4570c38345d6d53e37e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: commands/agents.rs: FileTooLong \u2014 800 significant 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 300 over it, 1.60\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":"desktop/src-tauri/src/commands/agents.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbb83e236bb55fa4fbeeac0f30589706219f57a0b566a1d00e235479b410a908"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::commands::channels::fetch::fetch_channels: FunctionTooLong \u2014 buzz_desktop::commands::channels::fetch::fetch_channels runs 160 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 60 over it, 1.60\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/channels/fetch.rs"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd7d96c2d6af6b5843e29accc6eb07427c54515c2b287b1e00645277a2e81cc2"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: WorkflowDialog: ClassTooLong \u2014 639 significant lines (blank, comment-only and punctuation-only lines excluded), 4 methods. The bar is 400 significant lines; this is 239 over it, 1.60\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/WorkflowDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6e7af3e248bdd90618ca6142d9fa778920522dd823dbc523fbfdea8994ce0d1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/ProjectsView.tsx: FileTooLong \u2014 797 significant lines (blank, comment-only and punctuation-only lines excluded), about 87% of them inside a single declaration: ProjectsView (111-978). The bar is 500 significant lines; this is 297 over it, 1.59\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":"desktop/src/features/projects/ui/ProjectsView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f921ed591d0787a1a02f6a331855dc191df75e367586c5c856e69baae7a3980"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: RelaySessionNotifier: ClassTooLong \u2014 636 significant lines (blank, comment-only and punctuation-only lines excluded), 58 methods. The bar is 400 significant lines; this is 236 over it, 1.59\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":"mobile/lib/shared/relay/relay_session.dart"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0b81e24175d617f91f38f70e1430ec1ad12c1af1b7c5c849f2972acbfeb35e7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/useMentionSendFlow.ts: FileTooLong \u2014 795 significant lines (blank, comment-only and punctuation-only lines excluded), about 94% of them inside a single declaration: useMentionSendFlow (51-997). The bar is 500 significant lines; this is 295 over it, 1.59\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":"desktop/src/features/messages/ui/useMentionSendFlow.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"64981cbe3651e46f43605699d7d7dea51921f5b0f48b03eaffaba25441cb9db4"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SetupStep.RuntimeStatus: FunctionTooLong \u2014 RuntimeStatus runs 159 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 59 over it, 1.59\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":"desktop/src/features/onboarding/ui/SetupStep.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"96f31faf061173e811f1255e621349b2d7a28e9e3ee91a924b5988c9e3cc3707"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _MobileHuddleCallPage.build: MethodTooLong \u2014 build runs 159 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 59 over it, 1.59\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":"mobile/lib/features/channels/channel_detail_page/huddle_sheet.dart"},"region":{"startLine":539}}}],"partialFingerprints":{"codehealthFindingId/v1":"673930f2b7c8a1d8fb4dcb653755765fc4382acefa3b7ec2ac0902958c9d7c76"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: MessageContent.build: MethodTooLong \u2014 build runs 159 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 59 over it, 1.59\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":"mobile/lib/features/channels/message_content.dart"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecfe25ef419b1a2e70f41ed854ea6e5d5508bc44d299915637c9c528e5bbe831"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/ProjectRepositoryPanel.tsx: FileTooLong \u2014 792 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 292 over it, 1.58\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":"desktop/src/features/projects/ui/ProjectRepositoryPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1ec8c98a89fe5924c38f62c1ae179c9c7e1d852a3b4d1f31bd4ceafc602ea2d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/TopbarSearch.tsx: FileTooLong \u2014 792 significant lines (blank, comment-only and punctuation-only lines excluded), about 66% of them inside a single declaration: TopbarSearch (376-998). The bar is 500 significant lines; this is 292 over it, 1.58\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/search/ui/TopbarSearch.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a32ae9e0ebb5915cf33f37c6eb4f725b3e16152db6ec7ae3492bd0033f538eb"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/SystemMessageRow.tsx: FileTooLong \u2014 791 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 291 over it, 1.58\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":"desktop/src/features/messages/ui/SystemMessageRow.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d730167d33cd9790e6fa3fc6f3fffa418624606127859ce2a71bfee22c621cbb"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_db::store::push::accept_lease_event: FunctionTooLong \u2014 buzz_db::store::push::accept_lease_event runs 158 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 58 over it, 1.58\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/push.rs"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3b2dd21b82ef813f72258d2f241452d52cea556dda3652d62fe2e588d1e3bc0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: EditAgentProviderModelFields.EditAgentProviderModelFields: FunctionTooLong \u2014 EditAgentProviderModelFields runs 158 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 58 over it, 1.58\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/EditAgentProviderModelFields.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"db3d9b64543f9e12e7b3d77133637da0cd52db03cfbab0e9056333276bf811cb"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: PersonaModelCombobox.PersonaModelCombobox: FunctionTooLong \u2014 PersonaModelCombobox runs 158 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 58 over it, 1.58\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/PersonaModelCombobox.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebd5c3ed8714929407ec05e5161f5071e4a2f407b2a628ecd56da0c82789491d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ChannelScreenHeader.ChannelScreenHeader: FunctionTooLong \u2014 ChannelScreenHeader runs 158 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 58 over it, 1.58\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/ChannelScreenHeader.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee6adbf31feee8fe405f699e5ecdaf6ef86699b0a9d7c105fb9299e01e7956e9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectDetailFeedPanels.ContributorsPanel: FunctionTooLong \u2014 ContributorsPanel runs 158 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 58 over it, 1.58\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectDetailFeedPanels.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"2084c431477ed1386b71054759fe72bfdb65c0b44cad16cdea89bbea7c01dbfb"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: EncryptedBackupProvider.EncryptedBackupProvider: FunctionTooLong \u2014 EncryptedBackupProvider runs 158 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 58 over it, 1.58\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/EncryptedBackupProvider.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"b05240f674eacbc2c41d10ce82f7a4c3cd7f63daaf3bf9b5a9983f1a8ca27c29"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: profile/animated_avatar_capture.dart: FileTooLong \u2014 786 significant lines (blank, comment-only and punctuation-only lines excluded), about 62% of them inside a single declaration: AnimatedAvatarCapture (41-667). The bar is 500 significant lines; this is 286 over it, 1.57\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":"mobile/lib/features/profile/animated_avatar_capture.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"455890e2cc1c9c96321b0907c5f8f9b4f67456112562e57396b11142e9579dd1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/sidebar.tsx: FileTooLong \u2014 785 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 285 over it, 1.57\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/sidebar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"12342eabfaf33916b702e314f09db115beb4e3d8e45d82f112fe78e693090e97"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::commands::personas::inbound::reconcile_inbound_persona_event_blocking: FunctionTooLong \u2014 buzz_desktop::commands::personas::inbound::reconcile_inbound_persona_event_blocking 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":"desktop/src-tauri/src/commands/personas/inbound.rs"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"6313cd48eb75b59d75aac6a38e5ac140a33703fb7fb6620361d1209b3afb9e5a"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: AppState: TooManyFields \u2014 47 stored fields beside 20 methods. The bar is 30 stored fields; this is 17 over it, 1.57\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/buzz-relay/src/state.rs"},"region":{"startLine":739}}}],"partialFingerprints":{"codehealthFindingId/v1":"055a12f64e4b2917acee067d421873380438293746c02d2f2ea11fe53924a30b"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: CliArgs: TooManyFields \u2014 47 stored fields. The bar is 30 stored fields; this is 17 over it, 1.57\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/buzz-acp/src/config.rs"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"a09b5ca6340c053a6402bdf806acbada1d2abaa166605f2f52308af91b7b8227"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/MessageThreadPanel.tsx: FileTooLong \u2014 783 significant lines (blank, comment-only and punctuation-only lines excluded), about 84% of them inside a single declaration: MessageThreadPanel (145-936). The bar is 500 significant lines; this is 283 over it, 1.57\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":"desktop/src/features/messages/ui/MessageThreadPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d66e1a0824a226cd65e430c969e02e78f82f59bb476e56d93b2a88116480a7a"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: PairingNotifier: ClassTooLong \u2014 625 significant lines (blank, comment-only and punctuation-only lines excluded), 34 methods. The bar is 400 significant lines; this is 225 over it, 1.56\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":"mobile/lib/features/pairing/pairing_provider.dart"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"00ce4c4b216196ab3d984f3df95b381cf21c734e220e1ef796bdb283c6079169"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/ComposerAttachments.tsx: FileTooLong \u2014 781 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 281 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":"desktop/src/features/messages/ui/ComposerAttachments.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"437fa81c5db448362c96251aa0216b97494f00fadc5c58652da847b5f409e5ba"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/migration.rs: FileTooLong \u2014 780 significant 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 37 free functions. The bar is 500 significant lines; this is 280 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":"desktop/src-tauri/src/migration.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"964fc38439c9d5e621dedf09b61fd8211c5a044d8b0b12ddffdfc0c8e9a631f8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ManagedAgentRow.ManagedAgentRow: FunctionTooLong \u2014 ManagedAgentRow runs 156 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 56 over it, 1.56\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":"desktop/src/features/agents/ui/ManagedAgentRow.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"46dfd0d0dec45d94f715668cbd65e2f8ea4a3d36d7dbe7fdac410712027eb353"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: observedUnreadNativeRig.installNativeRig: FunctionTooLong \u2014 installNativeRig runs 156 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 56 over it, 1.56\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":"desktop/src/features/channels/observedUnreadNativeRig.mjs"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"93461d5e2d572b042972d768c8dfa1e649fcd614aa693d26709edae08e6bd0af"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _PairingWelcomeView.build: MethodTooLong \u2014 build runs 156 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 56 over it, 1.56\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":"mobile/lib/features/pairing/pairing_page/pairing_welcome_view.dart"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9725466089c4150f72790b9d73925dd84824459a1aa654229b47ac9cc4ab0a2"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/executor.rs: FileTooLong \u2014 778 significant 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 278 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/buzz-workflow/src/executor.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"79e79da0acf4178dce153443abc74e19c94a99358d5f63010572fdbad814414f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ChannelRouteScreen.ChannelRouteScreen: FunctionTooLong \u2014 ChannelRouteScreen runs 155 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 55 over it, 1.55\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":"desktop/src/app/routes/ChannelRouteScreen.tsx"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cfaa0d0abe55f09dfea71091ec24ac726feb6d218d3a29acbba953664db81da"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: lib/useMentions.ts: FileTooLong \u2014 774 significant lines (blank, comment-only and punctuation-only lines excluded), about 90% of them inside a single declaration: useMentions (76-952). The bar is 500 significant lines; this is 274 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":"desktop/src/features/messages/lib/useMentions.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e64622982419715bd54c930f6dc221c96d60622d394091fcd2ec686e96983b6f"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ProfileSettingsCard: ClassTooLong \u2014 616 significant lines (blank, comment-only and punctuation-only lines excluded), 3 methods. The bar is 400 significant lines; this is 216 over it, 1.54\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/ProfileSettingsCard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"352e3cee6e5f5ae73125d381254509f6152278301ca79cebcc04bd5e6552ca9c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_agent::llm::openrouter_post: FunctionTooLong \u2014 buzz_agent::llm::openrouter_post runs 154 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 54 over it, 1.54\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/llm.rs"},"region":{"startLine":2258}}}],"partialFingerprints":{"codehealthFindingId/v1":"3aceb3fe0d4c063e1230e261d04d6f46ff08c5e86089729b200776519695b81d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::commands::project_git_workflow::merge_project_pull_request: FunctionTooLong \u2014 buzz_desktop::commands::project_git_workflow::merge_project_pull_request runs 154 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 54 over it, 1.54\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/project_git_workflow.rs"},"region":{"startLine":493}}}],"partialFingerprints":{"codehealthFindingId/v1":"f96dca21993c402ef2a4d72c3932242c99fc27188494b58339e98923feaa3405"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/UserProfilePanelTabs.tsx: FileTooLong \u2014 769 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 269 over it, 1.54\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/UserProfilePanelTabs.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc69c8d7f7da77586fddb6cac9c23199610b16647d25469296381dc956e74963"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: compose_bar/compose_bar_widget.dart: FileTooLong \u2014 769 significant lines (blank, comment-only and punctuation-only lines excluded), about 100% of them inside a single declaration: ComposeBar (3-1038). 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":"mobile/lib/features/channels/compose_bar/compose_bar_widget.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bc597dd3735d84c7155a73d66399592c480d4b5a17447fefe356386c6b98138"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: store/thread.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). The bar is 500 significant lines; this is 267 over it, 1.53\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/thread.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a64cb148286d0329f1e187ea1c4cc11f1ca3e66d37bea7fb3e38b255eaadccdc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/ProjectPullRequestFilesChangedPanel.tsx: FileTooLong \u2014 767 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 267 over it, 1.53\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectPullRequestFilesChangedPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d60704679cd2368f8139bb9a4dcffe6ea04c11d2b4e10765ce31c86bb077f283"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::handlers::relay_admin::execute_relay_admin_command: FunctionTooLong \u2014 buzz_relay::handlers::relay_admin::execute_relay_admin_command runs 153 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 53 over it, 1.53\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/relay_admin.rs"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"f34ac0eb8614f78c0458cebec1a33ab4c1dd253465118078f4aae94120d668c2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SetupStep.RuntimeProvidersSection: FunctionTooLong \u2014 RuntimeProvidersSection runs 153 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 53 over it, 1.53\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/SetupStep.tsx"},"region":{"startLine":662}}}],"partialFingerprints":{"codehealthFindingId/v1":"138a4e90bb7bcd1a4525bf40a9516660306ec6ce3b2136dcc2caccfe0319c261"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/InboxDetailPane.tsx: FileTooLong \u2014 764 significant lines (blank, comment-only and punctuation-only lines excluded), about 78% of them inside a single declaration: InboxMessageDetailPane (166-902). The bar is 500 significant lines; this is 264 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":"desktop/src/features/home/ui/InboxDetailPane.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b867000328ad00ccb8d79ca176842174c9986f8b999e29201fb021d5e8af5e02"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: MembersSidebar: ClassTooLong \u2014 608 significant lines (blank, comment-only and punctuation-only lines excluded), 7 methods. The bar is 400 significant lines; this is 208 over it, 1.52\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":"desktop/src/features/channels/ui/MembersSidebar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0369bf54f3ddd7d2a2bea63ef09eb0d3b771e04088780cfd13adecb7113b33c3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::archive::pipeline::commit_archive: FunctionTooLong \u2014 buzz_desktop::archive::pipeline::commit_archive 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":"desktop/src-tauri/src/archive/pipeline.rs"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"9eef756dd333fc4fe0d7bf600cb1295b1de29d77116c44f7ec5fd79ad28bb0b9"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: HuddlePresenceTracker.apply: MethodTooLong \u2014 apply runs 152 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/huddle/lib/huddlePresence.ts"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"4da53e40981c302c999abb3950da78064af6df576eef7d029b209a13278d577d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: VideoPlayer.VideoScrubber: FunctionTooLong \u2014 VideoScrubber runs 152 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/shared/ui/VideoPlayer.tsx"},"region":{"startLine":353}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a3515a3c5c392577d5f86e776c033dbf565760bfd3fdc468ade9e6bb7442cd8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: store/relay_members.rs: FileTooLong \u2014 759 significant 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 259 over it, 1.52\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/relay_members.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"edbc9d294c9eeaee275ec7e07b8136938037a6e8d200bdd9478a3c1c17aff5a7"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Config: ClassTooLong \u2014 607 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), 1 methods, 2 blocks, lines 118-1380. The bar is 400 significant lines; this is 207 over it, 1.52\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/buzz-relay/src/config.rs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2d92d7232d8b5c90693cb763d6f3a93df0e1eff65acd4031dadb29bc8a646a5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: commands/messages.rs: FileTooLong \u2014 758 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 258 over it, 1.52\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/messages.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"880e36e2086ae8b60a80e6c6d453ef245e27bcdaaef390b558e59f3652e5cfa8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/AgentSessionTranscriptList.tsx: FileTooLong \u2014 758 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 258 over it, 1.52\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentSessionTranscriptList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"348f8621dccca300001aef018036fc2da5e379a59cdd57611321657fc779fb11"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useAutoPinMentionedAgents.useAutoPinMentionedAgents: FunctionTooLong \u2014 useAutoPinMentionedAgents runs 151 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/messages/ui/useAutoPinMentionedAgents.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"99b63bc09039cdf013259cd753e00fe03b1880df1a0774e564c68ad50e7746b9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: projectsOverviewContext.projectsOverviewContext: FunctionTooLong \u2014 projectsOverviewContext runs 151 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/projects/ui/projectsOverviewContext.ts"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"df78c3b359a419af77ade8a2a145ae69644cdbd8e0501d00f8e5a9da8b29d039"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: Config: TooManyFields \u2014 45 stored fields beside 3 methods. The bar is 30 stored fields; this is 15 over it, 1.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/buzz-acp/src/config.rs"},"region":{"startLine":541}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c30c42f3e277024b3c08613d00b6694998f4ef0c976af02519e55ae5cd91398"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: RespondToField.CreateAgentRespondToField: FunctionTooLong \u2014 CreateAgentRespondToField runs 150 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 50 over it, 1.50\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/RespondToField.tsx"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e41c6f0b6cf3d211990e37d285d68dffc8f0199085c6c90e4dc204f8a2a9831"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/NostrBindConsentDialog.tsx: FileTooLong \u2014 748 significant lines (blank, comment-only and punctuation-only lines excluded), about 77% of them inside a single declaration: NostrBindConsentDialog (213-933). The bar is 500 significant lines; this is 248 over it, 1.50\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":"desktop/src/features/profile/ui/NostrBindConsentDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"838979a76604aac71f032b2023d0c9d4788851b506af39cfbb02488e324de356"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ComposerUploadProgressPill.ComposerUploadProgressPill: FunctionTooLong \u2014 ComposerUploadProgressPill runs 149 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 49 over it, 1.49\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":"desktop/src/features/messages/ui/ComposerUploadProgressPill.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"28fdbed38f333331399c39cf2d130a4f4ed7a3bf752e9f72c3107b4a82ad0b32"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CreateProjectFormContent.CreateProjectFormContent: FunctionTooLong \u2014 CreateProjectFormContent runs 149 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 49 over it, 1.49\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":"desktop/src/features/projects/ui/CreateProjectFormContent.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"71ca5772aed1d776708eae2d0067ed6ae53921ff4a845607e2d9c390989e54ab"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: RemindersPanel.ReminderDetailPane: FunctionTooLong \u2014 ReminderDetailPane runs 149 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 49 over it, 1.49\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":"desktop/src/features/reminders/ui/RemindersPanel.tsx"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3eff1eaef4e0a4be478d8376b723185233c83b60c0dd361ddfc81d31f270edb"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ChannelsPage.build: MethodTooLong \u2014 build runs 149 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 49 over it, 1.49\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":"mobile/lib/features/channels/channels_page.dart"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f6c42f2a89dedc0e95173486d251fdcce1e0c932dda6e0536a809a4c88c6b8c"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: VoiceNoteComposerRecorder.build: MethodTooLong \u2014 build runs 149 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 49 over it, 1.49\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":"mobile/lib/features/channels/voice_note_composer_recorder.dart"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"71ba415a46919a4a87f9e4bef10939a0d82b79cb2974b092c1d8a8843d91a18f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: handlers/event.rs: FileTooLong \u2014 741 significant 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 241 over it, 1.48\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/buzz-relay/src/handlers/event.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e3c9d31d9572f5659972aa6af9b037c418f33e2735cd3b833f4823b779753e1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AgentSnapshotImportDialog.PreviewBody: FunctionTooLong \u2014 PreviewBody runs 148 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 48 over it, 1.48\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentSnapshotImportDialog.tsx"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"96b49bc6ed21cd0dd8ad068b46e003a9e280a909dac8da838a227f50ce8a6001"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AddCommunityDialog.AddCommunityDialog: FunctionTooLong \u2014 AddCommunityDialog runs 148 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 48 over it, 1.48\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/communities/ui/AddCommunityDialog.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"7eca347c0a58929e818f243395ab35b8a7ed3f5e0005d639913829906f379c4d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/lib.rs: FileTooLong \u2014 739 significant 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 239 over it, 1.48\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":"desktop/src-tauri/src/lib.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9cf0e243cc85e97071d88c3718ac1caf9f3d765bdd5291b0ae699fcdeb3d098"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/MembersSidebar.tsx: FileTooLong \u2014 738 significant lines (blank, comment-only and punctuation-only lines excluded), about 82% of them inside a single declaration: MembersSidebar (138-910). The bar is 500 significant lines; this is 238 over it, 1.48\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/MembersSidebar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"73c823486d5c185e7148c4230d28015d1b5ba25d7203c3e07337436ec05aa0e0"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: TerminalSubstrate: ClassTooLong \u2014 590 significant lines (blank, comment-only and punctuation-only lines excluded), 3 methods. The bar is 400 significant lines; this is 190 over it, 1.48\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/terminal/TerminalSubstrate.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e979034a0808c00ffebf99a1e039977090e11d4192562e8cee9f8d0e7807c441"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: HostedCommunityOnboarding: ClassTooLong \u2014 590 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 190 over it, 1.48\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/communities/ui/HostedCommunityOnboarding.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"25b210d92869affc9bd2cabe136bc6582c35a60f45931bb49198a5da74d57434"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: channels/thread_detail_page.dart: FileTooLong \u2014 736 significant lines (blank, comment-only and punctuation-only lines excluded), about 92% of them inside a single declaration: ThreadDetailPage (68-992). The bar is 500 significant lines; this is 236 over it, 1.47\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":"mobile/lib/features/channels/thread_detail_page.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b36b1b9491c3d1fcdb8bc7f2e788c54a2c7f52e9358e3c851dfba350bc253a6a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: UsageTracker.record: MethodTooLong \u2014 record runs 147 significant 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 47 over it, 1.47\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/usage.rs"},"region":{"startLine":560}}}],"partialFingerprints":{"codehealthFindingId/v1":"52700dea523f7246e8fce1b97ad218e350cb1625083797b741ae29422a5e6340"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useEmojiAutocomplete.useEmojiAutocomplete: FunctionTooLong \u2014 useEmojiAutocomplete runs 147 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 47 over it, 1.47\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useEmojiAutocomplete.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"47f36699339f730ac1e7788674dcde2d6be77a59db30a9b647883d3ec6370fe1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectBrowserDialog.ProjectBrowserDialog: FunctionTooLong \u2014 ProjectBrowserDialog runs 147 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 47 over it, 1.47\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectBrowserDialog.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"a33435e7cce3be97c42a99dfc0eefc649a2f72af86e4674c37e8851c6f2bd397"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkflowTemplateTextarea.WorkflowTemplateTextarea: FunctionTooLong \u2014 WorkflowTemplateTextarea runs 147 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 47 over it, 1.47\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/WorkflowTemplateTextarea.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"125fb77de2aa8d2548f463ef9ff9a21681a84bd57f52d89b24ba7695a9807ac9"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ForumPostCard.build: MethodTooLong \u2014 build runs 147 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 47 over it, 1.47\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/forum/forum_post_card.dart"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"5264c8e4d972277d0003ac610c7fa1dcb261dce983aacedc3ea86da549a32227"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/ProfileSettingsCard.tsx: FileTooLong \u2014 734 significant lines (blank, comment-only and punctuation-only lines excluded), about 84% of them inside a single declaration: ProfileSettingsCard (135-868). The bar is 500 significant lines; this is 234 over it, 1.47\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":"desktop/src/features/settings/ui/ProfileSettingsCard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cf65109f2d4497112b3a2d1adcedf60f4d2273f6cacc338ac2c57a476bafac7"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: HuddleBar: ClassTooLong \u2014 587 significant lines (blank, comment-only and punctuation-only lines excluded), 9 methods. The bar is 400 significant lines; this is 187 over it, 1.47\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/components/HuddleBar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9bec9111d9550db5c223fd694199121aa064d3cdad1d6ac3c0973822d47871b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: api/media.rs: FileTooLong \u2014 733 significant 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 233 over it, 1.47\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/media.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e81ad34e28dab4b3fe2f51212d7a166575e0d2f34fedb57df5b3bd956a5f1170"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: search/search_page.dart: FileTooLong \u2014 733 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 233 over it, 1.47\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/search/search_page.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c0cc3757affff3b3083fbe58b2177ed1ed96d37a863f1b008deaa504da31cf8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Runner/NativeAttachmentPopover.swift: FileTooLong \u2014 732 significant lines (blank, comment-only and punctuation-only lines excluded), about 99% of them inside a single declaration: NativeAttachmentPopoverViewController (8-973). The bar is 500 significant lines; this is 232 over it, 1.46\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":"mobile/ios/Runner/NativeAttachmentPopover.swift"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b908dae9f068380e75a51c6a4564fa0cfda0f5ea8f52f8164aa0d33f61f4cb48"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Runner/HuddleAudioEngine.swift: FileTooLong \u2014 730 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 230 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":"mobile/ios/Runner/HuddleAudioEngine.swift"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4e27e1d7e6ed3cd13af2aed62e1577fc4f73ba02d0864ec53eb7073fb5c0a9d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_db::store::event::query_events_on: FunctionTooLong \u2014 buzz_db::store::event::query_events_on runs 146 significant 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 46 over it, 1.46\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/buzz-db/src/store/event.rs"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd3242eace7eb79d3368862c49a933e666ac6743b85ad33f5a881529ad293b67"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AppState.new: MethodTooLong \u2014 new runs 146 significant 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 46 over it, 1.46\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/buzz-relay/src/state.rs"},"region":{"startLine":926}}}],"partialFingerprints":{"codehealthFindingId/v1":"945762af76cd94569cfe6d2b9f58eef04d49f7828575591b4adc74b74a4437e3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::archive::agent_usage::compute_series: FunctionTooLong \u2014 buzz_desktop::archive::agent_usage::compute_series runs 146 significant 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 46 over it, 1.46\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":"desktop/src-tauri/src/archive/agent_usage.rs"},"region":{"startLine":681}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc2ba41c00ef5f6f99452cf0741d3cd1a01fb8870b5da767f8476c0a9b52ba82"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: UnifiedAgentsSection.UnifiedAgentsSection: FunctionTooLong \u2014 UnifiedAgentsSection runs 146 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 46 over it, 1.46\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":"desktop/src/features/agents/ui/UnifiedAgentsSection.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"94de2c278112e4c21a9dc89dcd169f70dc0772f2363ba84ce3acbcccf1e40e20"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: DiscussionChannels.DiscussedInChannels: FunctionTooLong \u2014 DiscussedInChannels runs 146 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 46 over it, 1.46\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":"desktop/src/features/projects/ui/DiscussionChannels.tsx"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e1efd042c6cc630fd36be3a1ca82c8e357b847873cd6f575ae64cc2efbc75eb"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useChannelMutes.useChannelMutes: FunctionTooLong \u2014 useChannelMutes runs 146 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 46 over it, 1.46\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":"desktop/src/features/sidebar/lib/useChannelMutes.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"964c850ef63cfa8c71a99ec1be0e3fdc007fb923b86f317110217c84425cfa07"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useChannelStars.useChannelStars: FunctionTooLong \u2014 useChannelStars runs 146 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 46 over it, 1.46\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":"desktop/src/features/sidebar/lib/useChannelStars.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"b484ad88497e28d484928c0de27da10e88177efdb294443b021d0ec5b73efa41"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CommunityThemeController.CommunityThemeController: FunctionTooLong \u2014 CommunityThemeController runs 146 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 46 over it, 1.46\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":"desktop/src/shared/theme/CommunityThemeController.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2abc96a269930243d6f921dda1a9af79601f6a18ec4203d2a1fe3a8ca52956f"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _IOSInlinePhotoPicker.build: MethodTooLong \u2014 build runs 146 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 46 over it, 1.46\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":"mobile/lib/features/channels/compose_bar/ios_photo_picker.dart"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa7a37079c8843eb21b6fe784f14548951e59a7c8a0f82629d732725d426a528"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: channel_detail_page/message_list.dart: FileTooLong \u2014 725 significant lines (blank, comment-only and punctuation-only lines excluded), about 100% of them inside a single declaration: _MessageList (3-937). The bar is 500 significant lines; this is 225 over it, 1.45\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":"mobile/lib/features/channels/channel_detail_page/message_list.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"97fe750b34914048438b8fc5598e8f70c3263902fea9f1c4f94b0cbe4690da1f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::commands::project_git::compare_local_remote_status: FunctionTooLong \u2014 buzz_desktop::commands::project_git::compare_local_remote_status runs 145 significant 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 45 over it, 1.45\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":"desktop/src-tauri/src/commands/project_git.rs"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa96e75463ba6eb86a7bfe8349737f2360c32d747591ae9c7d62ef6f3b7adf4a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: BestieGlobalOverlay.BestieGlobalOverlay: FunctionTooLong \u2014 BestieGlobalOverlay runs 145 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 45 over it, 1.45\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":"desktop/src/protectedFeatures/bestie/BestieGlobalOverlay.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"efeca08b2e4df33980fab407350a88fc7a7d3229f8daf6861806c2f0f474a6e8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/CommunityCatalogDialog.tsx: FileTooLong \u2014 723 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 223 over it, 1.45\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":"desktop/src/features/agents/ui/CommunityCatalogDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6feff13cca054f39813dd531d614bb6cb9b5c55df9021b968c953a79a8e5b67e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: store/channel.rs: FileTooLong \u2014 722 significant 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 222 over it, 1.44\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/buzz-db/src/store/channel.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1c641c0e1fca892f757dea3535fbcb59cf58f811dae83b79a23db3d81a302aa"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: NostrBindConsentDialog: ClassTooLong \u2014 577 significant lines (blank, comment-only and punctuation-only lines excluded), 11 methods. The bar is 400 significant lines; this is 177 over it, 1.44\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/NostrBindConsentDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d76791d584e61fd892ea607a91aacf03c1a0419fc959e09be9df44722163e9a2"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: HuddleControlAcceptor.serve_control_loop: MethodTooLong \u2014 serve_control_loop runs 144 significant 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 44 over it, 1.44\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/buzz-relay/src/audio/join.rs"},"region":{"startLine":1156}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba65e93b0d726a65dfd8f3c59d5acef317a95155bc88e7c99401dd62298675e0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ChannelTypeSettings.ChannelTypeSettings: FunctionTooLong \u2014 ChannelTypeSettings runs 144 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 44 over it, 1.44\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":"desktop/src/features/channels/ui/ChannelTypeSettings.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7c27772421e8256bf1bfe60f3390b3a2dba5fbb479c594d458139f6f548b846"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MessageReactions.ReactionPill: FunctionTooLong \u2014 ReactionPill runs 144 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 44 over it, 1.44\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":"desktop/src/features/messages/ui/MessageReactions.tsx"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b3c2759fe6c4505bf30d8a7f6645c63761b400a14b82771af64926de942e48f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectsOverviewItems.ProjectsOverviewProjectItems: FunctionTooLong \u2014 ProjectsOverviewProjectItems runs 144 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 44 over it, 1.44\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":"desktop/src/features/projects/ui/ProjectsOverviewItems.tsx"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e6104eef4e9e5087d202cc9f9549cacfbfda2713ef72cb5affadae94377e2c7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: sidebar-action-card.SidebarCompactActionCard: FunctionTooLong \u2014 SidebarCompactActionCard runs 144 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 44 over it, 1.44\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":"desktop/src/shared/ui/sidebar-action-card.tsx"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"daf332bb77432f1992f0bf2274cf5f2600d827c97de4720c4727bdcbc46898fb"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _CreateChannelSheet.build: MethodTooLong \u2014 build runs 144 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 44 over it, 1.44\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":"mobile/lib/features/channels/channels_page/sheets.dart"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"4199137561eff70c251c4894a23b19e4990cd1b048d2b9ad22dc0feb69f669a5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Runner/AppDelegate.swift: FileTooLong \u2014 717 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 217 over it, 1.43\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/AppDelegate.swift"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e91b4036ce88c16c3c0425dafb619687e395601823cb53c760c2bb526414b60a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/CustomChannelSection.tsx: FileTooLong \u2014 717 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 217 over it, 1.43\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/CustomChannelSection.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4829502a8b41fa664b7e9d617389202a5eb871758fb9a01199926ea65bd3a5ba"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: buzz_desktop::events: TooManyFunctions \u2014 43 free functions. The bar is 30 free functions; this is 13 over it, 1.43\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/events.rs"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e00061ce380a35d5d3ca41ca4f0ff4f33df8fb99320d5bc53abac30e24d1399"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/InboxListPane.tsx: FileTooLong \u2014 715 significant lines (blank, comment-only and punctuation-only lines excluded), about 66% of them inside a single declaration: InboxListPane (243-769). 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":"desktop/src/features/home/ui/InboxListPane.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5acd2db0c9ec0ca96d612a20a720a9592b2e8712e1f83387a610ca41bf4f5930"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: UserProfilePanelFields.buildOwnerFields: FunctionTooLong \u2014 buildOwnerFields runs 143 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 43 over it, 1.43\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/UserProfilePanelFields.tsx"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfa831660bcd3dc2a378073607ab38f981b362e668381c9029a5f7bca9820cc9"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: projects/hooks.ts: FileTooLong \u2014 713 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 213 over it, 1.43\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/hooks.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"51dede8962e6d715a000cf4fa4084998776642e20fe75ea1769fb8dc8dda61ba"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: HuddleAudioEngine: ClassTooLong \u2014 568 significant lines (blank, comment-only and punctuation-only lines excluded), 14 methods. The bar is 400 significant lines; this is 168 over it, 1.42\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":"mobile/android/app/src/main/kotlin/xyz/block/buzz/mobile/HuddleAudioEngine.kt"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"949232427beafcc5a91866c268271ae1a5a0bd49fc1596a6937ae978d67df75c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_media::upload::process_video_upload: FunctionTooLong \u2014 buzz_media::upload::process_video_upload runs 142 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 42 over it, 1.42\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-media/src/upload.rs"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"81fbc5d1212f93a0a01aef25612a2744decad02ff434462f10089346ec4c4dd8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CommunityMembersSettingsCard.RelayMemberRow: FunctionTooLong \u2014 RelayMemberRow runs 142 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 42 over it, 1.42\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/community-members/ui/CommunityMembersSettingsCard.tsx"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"91ee9d086e238dddfddfc17475d8ab1981e19161d7c889b2bd4a70d48b57cb8e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AddAgentDialog.AddAgentDialog: FunctionTooLong \u2014 AddAgentDialog runs 142 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 42 over it, 1.42\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/components/AddAgentDialog.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"b50a317a63669ab900b34ce8d949ec800192b89926569fb334faefa4600cb661"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: UpdateChecker.UpdateChecker: FunctionTooLong \u2014 UpdateChecker runs 142 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 42 over it, 1.42\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/UpdateChecker.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"accd45765a2237359a821932170f3fd0c60e47e8ba41401898cccfe6ea7c785a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: markdown.MarkdownInner: FunctionTooLong \u2014 MarkdownInner runs 142 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 42 over it, 1.42\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/markdown.tsx"},"region":{"startLine":1676}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b98e2d0169f3bf91d9f584f6f442a4917f2e8c21f1a276d46fbe2e7a13b39f0"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ChannelsNotifier._fetchChannels: MethodTooLong \u2014 _fetchChannels runs 142 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 42 over it, 1.42\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channels_provider.dart"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"f49e6ccab43a2f2eb751bb37b087860945c76e4b7e8e79ce3a5182b0cb34c8ae"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: api/tauri.ts: FileTooLong \u2014 708 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 208 over it, 1.42\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":"desktop/src/shared/api/tauri.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fa2409d21cbefb1555b69a742865f783245c5e99ec60afbf2f460c74ec46c23"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: channels/channel_messages_provider.dart: FileTooLong \u2014 708 significant lines (blank, comment-only and punctuation-only lines excluded), about 97% of them inside a single declaration: ChannelMessagesNotifier (28-975). The bar is 500 significant lines; this is 208 over it, 1.42\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":"mobile/lib/features/channels/channel_messages_provider.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0b3cac7763a91f47c826b4c901d6ad63bf32fcd116c9506241ac141442482df"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: channels/message_content.dart: FileTooLong \u2014 708 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 208 over it, 1.42\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":"mobile/lib/features/channels/message_content.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9974465412f9c835f38076b9f07784344838daaca7a9f72e01a67f29269c15d5"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: HuddleTransport: ClassTooLong \u2014 565 significant lines (blank, comment-only and punctuation-only lines excluded), 34 methods. The bar is 400 significant lines; this is 165 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":"mobile/lib/shared/huddle/huddle_transport.dart"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ce06609feba3cbcb7196a82cb1c455f43fa060f30ec5f49ff28176e9805c2d7"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: CommunityOnboardingFlow: ClassTooLong \u2014 565 significant lines (blank, comment-only and punctuation-only lines excluded), 4 methods. The bar is 400 significant lines; this is 165 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":"desktop/src/features/onboarding/ui/CommunityOnboardingFlow.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"30472d49777bfdff67f265bfe707d0dd01cda0cce92059efd7619de4f5241677"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/UserProfilePanelSections.tsx: FileTooLong \u2014 705 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 205 over it, 1.41\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/UserProfilePanelSections.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"25a0671deea51c87c58bedf56f3b548f3d6d1695abebeb42c00cf1affeb20500"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: relay/media_upload.dart: FileTooLong \u2014 705 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 205 over it, 1.41\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/relay/media_upload.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"717f3b3b7a23a0a984f85ac7d99a94eb56a886795dba4d35f3c958a94aba90cd"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: WorkflowEngine.run: MethodTooLong \u2014 run runs 141 significant 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 41 over it, 1.41\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-workflow/src/lib.rs"},"region":{"startLine":489}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0a6d4c19ea2fb82cb5c013e92dcc777fb2595ff204a40ad9cf684db1a1f7879"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: TeamsSection.TeamsSection: FunctionTooLong \u2014 TeamsSection runs 141 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 41 over it, 1.41\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/TeamsSection.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"a49d130129f25bac8918139b829a94faaf7878ef179e6e412779f926828860e3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: hooks.useAppOnboardingState: FunctionTooLong \u2014 useAppOnboardingState runs 141 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 41 over it, 1.41\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/hooks.ts"},"region":{"startLine":466}}}],"partialFingerprints":{"codehealthFindingId/v1":"4985d0e1e06b1d7bd30ca3d3ea59366d306a61114a463775fb327a74f47106ba"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _ThreadMessageList.build: MethodTooLong \u2014 build runs 141 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 41 over it, 1.41\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/thread_detail_page/message_list.dart"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"8875ecdac806ed3e79086693be7b254e7170afe9631d0d5a541932317a9c4b38"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _SetStatusSheet.build: MethodTooLong \u2014 build runs 141 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 41 over it, 1.41\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/profile/set_status_sheet.dart"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"e00b2b72efbc3b15d90c5d485a95a3ac958415a781c7fd6eddf821ec69da80a4"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BuzzPushBootstrap.build: MethodTooLong \u2014 build runs 141 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 41 over it, 1.41\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/push/push_bootstrap.dart"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"27f6eea010f6d5b588f061a78a52a56b223aaec080ee21e646cfcbe1e25648db"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: store/moderation.rs: FileTooLong \u2014 704 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 204 over it, 1.41\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/moderation.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddc43ebe338ff77d41a6931436c39608b4d86f08f19d8c91ceee0e5246f753ef"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: components/HuddleBar.tsx: FileTooLong \u2014 702 significant lines (blank, comment-only and punctuation-only lines excluded), about 84% of them inside a single declaration: HuddleBar (149-895). The bar is 500 significant lines; this is 202 over it, 1.40\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":"desktop/src/features/huddle/components/HuddleBar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f19830965ca97cb6d750d3bd8e2ef31ac098773dec854b6b6b8a560c07322b38"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/MessageTimeline.tsx: FileTooLong \u2014 701 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 201 over it, 1.40\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/MessageTimeline.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"26c21e7189c52afcbdcf48a8b4eebf8ea2acaf8c703d4092a037a577f93fb852"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: pairing/pairing_provider.dart: FileTooLong \u2014 700 significant lines (blank, comment-only and punctuation-only lines excluded), about 89% of them inside a single declaration: PairingNotifier (94-989). The bar is 500 significant lines; this is 200 over it, 1.40\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":"mobile/lib/features/pairing/pairing_provider.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3b606bf27ea47c043e1fb3d6c36ac4e59fd04601e3e46d7ecaca57cb6c9f566"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AgentSnapshotCard.AgentSnapshotCard: FunctionTooLong \u2014 AgentSnapshotCard runs 140 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/shared/ui/markdown/AgentSnapshotCard.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bc97bee999210b25e09f178774ab45d9d42eca1e03d9544c6ab44c170b09306"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: ManagedAgentSummary: TooManyFields \u2014 42 stored fields. The bar is 30 stored fields; this is 12 over it, 1.40\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":"desktop/src-tauri/src/managed_agents/types.rs"},"region":{"startLine":535}}}],"partialFingerprints":{"codehealthFindingId/v1":"dca896eef0c55ff9df38c09b06fd8a7bdf5853034254e34c94dbf9c333e02c15"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: useUnreadChannels: ClassTooLong \u2014 559 significant lines (blank, comment-only and punctuation-only lines excluded), 6 methods. The bar is 400 significant lines; this is 159 over it, 1.40\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/useUnreadChannels.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bab8f74ac06f2083c8ef792c3627f3afb99bd75a4e02e3d64bc190e654cd93e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/http.rs: FileTooLong \u2014 695 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 195 over it, 1.39\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-push-gateway/src/http.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1968534db41cb84293da3037b74071fb910890d236837fc4029a7738892643f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: commands/messages.rs: FileTooLong \u2014 695 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 195 over it, 1.39\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/messages.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"23168f428f022580c5e169fcc6e5a9fcb9b656d747f0f14d1229c2960e7f1bbf"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::api::git::transport::finalize_push_inner: FunctionTooLong \u2014 buzz_relay::api::git::transport::finalize_push_inner runs 139 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 39 over it, 1.39\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/git/transport.rs"},"region":{"startLine":1903}}}],"partialFingerprints":{"codehealthFindingId/v1":"424074cfa37c0aab4291e4033495eb45a7de152f189efa5ffaf773045780e4d0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: hooks.usePresenceSession: FunctionTooLong \u2014 usePresenceSession runs 139 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 39 over it, 1.39\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/presence/hooks.ts"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"da22fb78abfb3f989afef999cc21ec5080b6a74d51a139945f765655eb573832"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectsAgentPromptPage.ConversationThread: FunctionTooLong \u2014 ConversationThread runs 139 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 39 over it, 1.39\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectsAgentPromptPage.tsx"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"df8db5f8f33cc92d12509988dc7e905ad5ce4b046bc81524ea82833a73de6910"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _SystemMessageRow.build: MethodTooLong \u2014 build runs 139 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 39 over it, 1.39\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_detail_page/system_rows.dart"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"86619657b46a941b433f95098434769aeb17171fff230eb4209a7811d2ccb442"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/CommunityOnboardingFlow.tsx: FileTooLong \u2014 694 significant lines (blank, comment-only and punctuation-only lines excluded), about 81% of them inside a single declaration: CommunityOnboardingFlow (157-831). The bar is 500 significant lines; this is 194 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":"desktop/src/features/onboarding/ui/CommunityOnboardingFlow.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fdec5736e2c947b3f7b237b0efdcb44dadbde9717ad381522c9dca7e73496b5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: relay/relay_session.dart: FileTooLong \u2014 692 significant lines (blank, comment-only and punctuation-only lines excluded), about 92% of them inside a single declaration: RelaySessionNotifier (75-996). The bar is 500 significant lines; this is 192 over it, 1.38\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":"mobile/lib/shared/relay/relay_session.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c5d37eba0dbeeef17f795980eb47654bb9e905e250a13fe17397183810fc2ec"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BuzzDevPushEnrollmentDriver.enroll: MethodTooLong \u2014 enroll runs 138 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 38 over it, 1.38\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzDevPushEnrollmentDriver.swift"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d7b7d9b2d426e2c8b10d3fbee660099acb14c40c16b694e110b4596555a4eff"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: DraftDetailPane.DraftDetailPane: FunctionTooLong \u2014 DraftDetailPane runs 138 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 38 over it, 1.38\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/DraftDetailPane.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf9352e45ccd40c2d0a9755ef09512e32b2330c0315fc96f5e6b1e136ffcfcfc"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: HarnessCatalogDialog.CatalogDetail: FunctionTooLong \u2014 CatalogDetail runs 138 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 38 over it, 1.38\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/HarnessCatalogDialog.tsx"},"region":{"startLine":451}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3c7de9c9643050f96764c2f782d7235958b82ad7e5c2f63ced0e405477c0007"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/mcp.rs: FileTooLong \u2014 688 significant 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 188 over it, 1.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/buzz-agent/src/mcp.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5a55cb179d78505e9d8d7e22a7dbdf55cd923b07838ad0fc20383a8a2cb120f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: mobile/HuddleAudioEngine.kt: FileTooLong \u2014 687 significant lines (blank, comment-only and punctuation-only lines excluded), about 83% of them inside a single declaration: HuddleAudioEngine (174-925). The bar is 500 significant lines; this is 187 over it, 1.37\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":"mobile/android/app/src/main/kotlin/xyz/block/buzz/mobile/HuddleAudioEngine.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1a722ed5d7b726a89c15939433365af5fa6eb575aac4465dbd0f9c4f1e938c3"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/MaskedAvatarBadgeFrame.tsx: FileTooLong \u2014 686 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 186 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":"desktop/src/features/profile/ui/MaskedAvatarBadgeFrame.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"244f420466ae8b81d43a7c06711b99c5597d40d31343cd22c73995866aeb5578"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::connection::handle_active_connection: FunctionTooLong \u2014 buzz_relay::connection::handle_active_connection runs 137 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 37 over it, 1.37\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/connection.rs"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ebf2cfba8af9e2e2787125005c98aea86276ba20148b2f8765fe6e3010cebcc"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectIssuesPanel.ProjectIssueDetail: FunctionTooLong \u2014 ProjectIssueDetail runs 137 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 37 over it, 1.37\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectIssuesPanel.tsx"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2ea4c2f34ad8810c733c3b3cc94e81c32e9d8de2a76aa45365330b93e8a27f2"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _MessageImageCarousel.build: MethodTooLong \u2014 build runs 137 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 37 over it, 1.37\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/message_content/media_carousel.dart"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e17dbf5f6455d3f566a61a0cebd0979971837ed9071fd06d7a431d9fcfdf269"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: NoteCard.build: MethodTooLong \u2014 build runs 137 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 37 over it, 1.37\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/pulse/note_card.dart"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c1ad905fdae4b8165be7209395bfe0cf679b3ee497a67e9d1e407f3fa084733"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ChannelMessagesNotifier: 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":"mobile/lib/features/channels/channel_messages_provider.dart"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e927d48d99e7caa384fa7def80d6f6e750e8334be17f17a787a79a6fa5daba8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: admin-console/AdminConsoleReportsTab.tsx: FileTooLong \u2014 683 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 183 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":"desktop/src/features/admin-console/AdminConsoleReportsTab.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8737a58b812881ddf3925c5ac718902c971261059fcd532408dac0d3526c488"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/SettingsPanels.tsx: FileTooLong \u2014 683 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 183 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":"desktop/src/features/settings/ui/SettingsPanels.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"696bd491364c7776eaea481ed839dcb754bc4d5315172a88a0d5ac5af41311b1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/ProjectsAgentPromptPage.tsx: FileTooLong \u2014 682 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 182 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":"desktop/src/features/projects/ui/ProjectsAgentPromptPage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe2c7b28615f539f6058625ddf3194b659be60319414c3644d66eda960700f27"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: commands/team_snapshot.rs: FileTooLong \u2014 680 significant 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 180 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":"desktop/src-tauri/src/commands/team_snapshot.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"951f7ff42eb9c059a965fdcd5b1817c5652908a3e7f9b6c815c212038771d0b2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_db::store::event::insert_event_with_thread_metadata_tx: FunctionTooLong \u2014 buzz_db::store::event::insert_event_with_thread_metadata_tx runs 136 significant 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 36 over it, 1.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/buzz-db/src/store/event.rs"},"region":{"startLine":1381}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca69fa3c80a480a264cc3a59a9d47e3323d4380b4ff9f282e7578b86a81875f0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_db::store::thread::get_channel_window_on: FunctionTooLong \u2014 buzz_db::store::thread::get_channel_window_on runs 136 significant 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 36 over it, 1.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/buzz-db/src/store/thread.rs"},"region":{"startLine":582}}}],"partialFingerprints":{"codehealthFindingId/v1":"fda45a901eb974ddd54f470d11e5f6e7bdb0dee2f39e4017a1abf628eb7b4ee9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: hooks.useNotificationSettings: FunctionTooLong \u2014 useNotificationSettings runs 136 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 36 over it, 1.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":"desktop/src/features/notifications/hooks.ts"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"38f76c87d3625e1412ea812a259615d9e38db52004750f5b1464af3fa64ba840"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: commands/project_git.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":"desktop/src-tauri/src/commands/project_git.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c7c08507e3efbc6643b85a8fa98990c665b67c7c08ed2ea710286ebfcd6eba8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/ChannelTemplatesSettingsCard.tsx: FileTooLong \u2014 675 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 175 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":"desktop/src/features/settings/ui/ChannelTemplatesSettingsCard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b919f21dd0f0393eb45d0b1250d58ffc24ad0a5074b8b63d299d617c2bf0414"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_db::store::push::enqueue_wakes: FunctionTooLong \u2014 buzz_db::store::push::enqueue_wakes runs 135 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 35 over it, 1.35\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/push.rs"},"region":{"startLine":664}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a7926d3dc75811323457042bad2acff04335519ac950539f8b01e911e3fafab"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::handlers::req::handle_search_req: FunctionTooLong \u2014 buzz_relay::handlers::req::handle_search_req runs 135 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 35 over it, 1.35\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/req.rs"},"region":{"startLine":598}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d2242a546c3187b0989e512fff08fa0dc48ef43862665ebb4123a0ea8a46ca8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::router::build_router: FunctionTooLong \u2014 buzz_relay::router::build_router runs 135 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 35 over it, 1.35\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/router.rs"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"f212a01eaa4c937f0c64a081105d8c5cbec53a09f2373b07230ebaf3f81f1937"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: git_sign_nostr::do_verify: FunctionTooLong \u2014 git_sign_nostr::do_verify runs 135 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 35 over it, 1.35\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/git-sign-nostr/src/lib.rs"},"region":{"startLine":1099}}}],"partialFingerprints":{"codehealthFindingId/v1":"3eb42cebe353e1914058beb510f2bb7a80f457f4d15dfc66ed887e763c5c8f7b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AgentSessionTranscriptList.AgentSessionTranscriptList: FunctionTooLong \u2014 AgentSessionTranscriptList runs 135 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 35 over it, 1.35\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentSessionTranscriptList.tsx"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"800861f179c437e5f7bcf191c2c7ebd28f52fb0710c22f9d48c4302a1134871a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: UserProfileAgentActions.UserProfileAgentSettingsMenu: FunctionTooLong \u2014 UserProfileAgentSettingsMenu runs 135 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 35 over it, 1.35\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/UserProfileAgentActions.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"74f5cf3bd95042ce16578d928d5678781183de8437642403073519d32dccdd6f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: HostedCommunitiesSettingsCard.CommunityRow: FunctionTooLong \u2014 CommunityRow runs 135 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 35 over it, 1.35\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/HostedCommunitiesSettingsCard.tsx"},"region":{"startLine":781}}}],"partialFingerprints":{"codehealthFindingId/v1":"151df5b7009e09212bd38e8cff3a1f22e2783eea478a0e4a89b2bf632f4c8b0b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useSidebarRelayConnectionCard.useSidebarRelayConnectionCard: FunctionTooLong \u2014 useSidebarRelayConnectionCard runs 135 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 35 over it, 1.35\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/useSidebarRelayConnectionCard.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"1228693ee6d1f65f7f63dcb89e8d93b88c8c2f003224db7eddcc7aaa5918a8c6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: compact-link-preview-attachment.CompactLinkPreviewAttachment: FunctionTooLong \u2014 CompactLinkPreviewAttachment runs 135 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 35 over it, 1.35\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/compact-link-preview-attachment.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"884a3f54aea2b73975040bc7f7fe4bd988a855211b89bb291a1c10984ef83ddc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: huddle/HuddleContext.tsx: FileTooLong \u2014 674 significant lines (blank, comment-only and punctuation-only lines excluded), about 92% of them inside a single declaration: HuddleProvider (65-956). The bar is 500 significant lines; this is 174 over it, 1.35\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":"desktop/src/features/huddle/HuddleContext.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"65f3b4bc0a8902c4f3bb82907494edcd07349dea2e8f0aca767219878a8100eb"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: channels/voice_note_recording.dart: FileTooLong \u2014 672 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 172 over it, 1.34\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/voice_note_recording.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"20ab4868ff9525792ffa83951dda59d60b74db2902b059a3aca3318495e49e85"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::api::admin::resolve_report: FunctionTooLong \u2014 buzz_relay::api::admin::resolve_report 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/buzz-relay/src/api/admin/mod.rs"},"region":{"startLine":476}}}],"partialFingerprints":{"codehealthFindingId/v1":"c884bbf191931d5be7043695e3e92703efb59eda2a7baf9e800c8e62401eeb11"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::huddle::start_huddle: FunctionTooLong \u2014 buzz_desktop::huddle::start_huddle 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":"desktop/src-tauri/src/huddle/mod.rs"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ec2894166745ce1a0d6292d8b8f54c7fde17d9b9ec744241ff2a71bb03a21af"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AgentCardViewerDialog.AgentCardViewerContent: FunctionTooLong \u2014 AgentCardViewerContent runs 134 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/agents/ui/AgentCardViewerDialog.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"67b1668fd9297eff277cc8c4aa3c361a1e78220797e48b479cfb140f4f3dc583"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useForumMentionPreparation.useForumMentionPreparation: FunctionTooLong \u2014 useForumMentionPreparation runs 134 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/forum/ui/useForumMentionPreparation.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebe00a266d2e85c98e44f2ca28dfb0f8151cb412ba0f766229e0d42c1a5eabd0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: inbox.buildInboxItems: FunctionTooLong \u2014 buildInboxItems runs 134 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/home/lib/inbox.ts"},"region":{"startLine":462}}}],"partialFingerprints":{"codehealthFindingId/v1":"88816d6d8063c06c98c5fe060c889b4c2f6cbf067e6a709bb25058175439f9dc"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: BuzzClient: ClassTooLong \u2014 534 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), 26 methods, 2 blocks, lines 516-1394. The bar is 400 significant lines; this is 134 over it, 1.34\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/buzz-cli/src/client.rs"},"region":{"startLine":516}}}],"partialFingerprints":{"codehealthFindingId/v1":"c045dccdcb55fc88191f5ed8175607f435cc718abbe1143123e896104f028162"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: AcpClient: TooManyMethods \u2014 40 methods. The bar is 30 methods; this is 10 over it, 1.33\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/acp.rs"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd0308a9cb77434dd5d9c944aecb7710cb3f176c39a04d559404e3871c4abb41"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AgentsView: ClassTooLong \u2014 533 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 133 over it, 1.33\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentsView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1252ade3b801d7086c4c3be7ff059aaedbacd31b56a63f6e92f1d1fddfc7ae75"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: NostrKeyImportForm: ClassTooLong \u2014 533 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 133 over it, 1.33\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/NostrKeyImportForm.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"86bda1c09789bfccfefdb50c6cc31c49816adced3972fd8399f2a328d5be0240"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_agent::run_prompt: FunctionTooLong \u2014 buzz_agent::run_prompt 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/buzz-agent/src/lib.rs"},"region":{"startLine":749}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdfda4689939a82c5725b758b7022a032adb57c0d039df62ba2c552b113f5b33"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: DownloadKeyStep.DownloadKeyStep: FunctionTooLong \u2014 DownloadKeyStep runs 133 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/onboarding/ui/DownloadKeyStep.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"d887395062ebc7fbe669faac36239c788540695a6cc60b78275a3a95c7a7cc12"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectPullRequestFilesChangedPanel.DiffPreview: FunctionTooLong \u2014 DiffPreview runs 133 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/projects/ui/ProjectPullRequestFilesChangedPanel.tsx"},"region":{"startLine":447}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbfa8dc9f98904e84b706637cfad099d4f9adb29c5eca7daba5534bfd48346d9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: PrivateKeyBackupRow.PrivateKeyBackupRow: FunctionTooLong \u2014 PrivateKeyBackupRow runs 133 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/settings/ui/PrivateKeyBackupRow.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"274488bc8fd61be89ff0b28ad04755848d0766d7cf4a15392451faa3a598f342"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: relayReconnectReplay.replayLiveSubscriptions: FunctionTooLong \u2014 replayLiveSubscriptions runs 133 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/shared/api/relayReconnectReplay.ts"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"07060ab70acf358a7ac6947c13d4ff736cc08bb99e9fd8a066a28f4c52324cb7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/ChannelBrowserDialog.tsx: FileTooLong \u2014 664 significant lines (blank, comment-only and punctuation-only lines excluded), about 63% of them inside a single declaration: ChannelBrowserDialog (102-654). The bar is 500 significant lines; this is 164 over it, 1.33\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":"desktop/src/features/channels/ui/ChannelBrowserDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ffdcb8f39086635f1a52d275510e85cb7b4a1ae130ac31b7fcbba36aa8b74b5"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: useAnchoredScroll: ClassTooLong \u2014 528 significant lines (blank, comment-only and punctuation-only lines excluded), 3 methods. The bar is 400 significant lines; this is 128 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":"desktop/src/features/messages/ui/useAnchoredScroll.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2504fb94455ac8b45495a51fb541a54f0911a1d582a85d75ee1007d88491409"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::managed_agents::runtime::build_managed_agent_summary: FunctionTooLong \u2014 buzz_desktop::managed_agents::runtime::build_managed_agent_summary runs 132 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 32 over it, 1.32\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/runtime.rs"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f3c1b254e388a1599245097f06ca1e195daef07a9db3d5836f7faba41b68d7a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: huddle/huddle_transport.dart: FileTooLong \u2014 658 significant lines (blank, comment-only and punctuation-only lines excluded), about 86% of them inside a single declaration: HuddleTransport (137-931). The bar is 500 significant lines; this is 158 over it, 1.32\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":"mobile/lib/shared/huddle/huddle_transport.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b37babc40265df11f0193ec40de58673fe152eaf19644b4e32bd1ab60c3e7b1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: terminal/TerminalSubstrate.tsx: FileTooLong \u2014 656 significant lines (blank, comment-only and punctuation-only lines excluded), about 90% of them inside a single declaration: TerminalSubstrate (80-813). The bar is 500 significant lines; this is 156 over it, 1.31\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":"desktop/src/features/terminal/TerminalSubstrate.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b9e492af7d2f54b1e8c279929d7f6ff6a6f4f8e4b1a1d71f660654304104d1c"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AprilPocketTts: ClassTooLong \u2014 524 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), 15 methods, 2 blocks, lines 222-959. The bar is 400 significant lines; this is 124 over it, 1.31\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/buzz-voice/src/pocket_april.rs"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"22a7f3d3d81d6e0e32b917cddc74cdd1b123944a5373995b69ecd9e676958f3a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_acp::pool::create_session_and_apply_model: FunctionTooLong \u2014 buzz_acp::pool::create_session_and_apply_model 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/buzz-acp/src/pool.rs"},"region":{"startLine":1490}}}],"partialFingerprints":{"codehealthFindingId/v1":"52cfd398fb6aad2b2cab4ed024d9e28bbb128abb93050d162c73f8b00a1cdbe8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: VoiceNoteRecorder.VoiceNoteRecorder: FunctionTooLong \u2014 VoiceNoteRecorder runs 131 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/messages/ui/VoiceNoteRecorder.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"a25a16b6170f8e3a2769d5a8911d695087035583837cff529ca2077620f6c27c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: NsecMaskedDisplay.NsecMaskedDisplay: FunctionTooLong \u2014 NsecMaskedDisplay runs 131 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/onboarding/ui/NsecMaskedDisplay.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7a5a6bf35a723f80de04b1263597ade8553690919b4730840bda271805c41e8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkflowStepCard.WorkflowStepCard: FunctionTooLong \u2014 WorkflowStepCard runs 131 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/workflows/ui/WorkflowStepCard.tsx"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae138b43c6c68181f906021ca27d4fc000e1b19573f56d557a46b3bf3ff33d08"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _AttachmentSurfacePanel.build: MethodTooLong \u2014 build runs 131 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"mobile/lib/features/channels/compose_bar/attachments.dart"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c4a3627b215e36f8910f559ba1c3bab13a95fe64d180b429df00bb7c6afd171"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/TimelineMessageList.tsx: FileTooLong \u2014 654 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 154 over it, 1.31\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/TimelineMessageList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"91a9d1836eba6bafeaf6154fc7079115f0af9e2625cc1176e5b5312fed6be754"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: channels/useUnreadChannels.ts: FileTooLong \u2014 652 significant lines (blank, comment-only and punctuation-only lines excluded), about 86% of them inside a single declaration: useUnreadChannels (126-984). The bar is 500 significant lines; this is 152 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":"desktop/src/features/channels/useUnreadChannels.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"87f54d795ec7e62fd6c8c7f31c9cf19f4de727816af7726fdc209a697b699a4b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/HostedCommunityOnboarding.tsx: FileTooLong \u2014 652 significant lines (blank, comment-only and punctuation-only lines excluded), about 90% of them inside a single declaration: HostedCommunityOnboarding (77-809). The bar is 500 significant lines; this is 152 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":"desktop/src/features/communities/ui/HostedCommunityOnboarding.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"09e8814a40ead024366ca59359ab1a3fa74721f69bc0a8ccc1d564b9dd577f14"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: NativeAttachmentPopoverViewController: TooManyMethods \u2014 39 methods. The bar is 30 methods; this is 9 over it, 1.30\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":"mobile/ios/Runner/NativeAttachmentPopover.swift"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e2da747e40a5ee2739ca603ccc80de456692088f529ef431d0e2763067ae051"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_db::store::relay_admin_actions::finalize_success: FunctionTooLong \u2014 buzz_db::store::relay_admin_actions::finalize_success 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/buzz-db/src/store/relay_admin_actions.rs"},"region":{"startLine":837}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d2c0eeeb480f844280122f3f1ff0c1a6d169ec479460e8eaf3c240cd7841951"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AgentRuntimeAvatarControl.AgentRuntimeAvatarControl: FunctionTooLong \u2014 AgentRuntimeAvatarControl runs 130 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/agents/ui/AgentRuntimeAvatarControl.tsx"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"790d10aeffba3e551009d1b415989be69412d6a72af06665483fe0287c82fbca"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: UserMessageBubble.UserMessageBubble: FunctionTooLong \u2014 UserMessageBubble runs 130 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/agents/ui/activityRenderClasses/UserMessageBubble.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee671038018ec5a3eda46c8b9aeab3afc966308f8bab1cce0f8811f8871d06ab"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AgentVoiceMenu.AgentVoiceMenu: FunctionTooLong \u2014 AgentVoiceMenu runs 130 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/huddle/components/AgentVoiceMenu.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"11dfcfc8646002d0ffc00335eddc697948ba9318221701a9be8e3ce845e045f9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MessageModerationMenuItems.MessageModerationMenuItems: FunctionTooLong \u2014 MessageModerationMenuItems runs 130 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/moderation/ui/MessageModerationMenuItems.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"05e80fd891512ac32e9e70b7c3df796481d40cd2afc329460deb3d60bfba55c2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: EncryptedBackupCreator.PassphraseGeneratorPopover: FunctionTooLong \u2014 PassphraseGeneratorPopover runs 130 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/onboarding/ui/EncryptedBackupCreator.tsx"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"4196e4b6728461c254a7064655f51ab629935d00c78558eff4e76b37b8fe58ca"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: TopbarSearch: ClassTooLong \u2014 519 significant lines (blank, comment-only and punctuation-only lines excluded), 16 methods. The bar is 400 significant lines; this is 119 over it, 1.30\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":"desktop/src/features/search/ui/TopbarSearch.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b3029d71c212053906171ce518e505a489b2642cda8561b0e46e0d84a2a2f26"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: MachineOnboardingFlow: ClassTooLong \u2014 518 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 118 over it, 1.30\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":"desktop/src/features/onboarding/ui/MachineOnboardingFlow.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"10039c7fc297c436ed7f1d2cf5be942c1b16986be049ad621cee80d0a773eeac"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_cli::commands::messages::dispatch: FunctionTooLong \u2014 buzz_cli::commands::messages::dispatch runs 129 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 29 over it, 1.29\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/messages.rs"},"region":{"startLine":933}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9eba23423d92a95efdcbeb167b2a922a41ae5d35b703d6f4c3e12a1a2a2e438"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_dev_mcp::shell::run: FunctionTooLong \u2014 buzz_dev_mcp::shell::run runs 129 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 29 over it, 1.29\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-dev-mcp/src/shell.rs"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"d48f30f06eeeb95db999657f75948dde45d21c7a914bc47348364ccba9dee8f5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useNonMemberInvite.useNonMemberInvite: FunctionTooLong \u2014 useNonMemberInvite runs 129 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 29 over it, 1.29\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useNonMemberInvite.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"ace4602a68fc3837b080901b440cafc50c63f043d9613a8b6f252d5b2d7b9fe0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectCommitDetailPanel.ProjectCommitDetailPanel: FunctionTooLong \u2014 ProjectCommitDetailPanel runs 129 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 29 over it, 1.29\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectCommitDetailPanel.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfc36a92810d9a615e029a90ed7fb2d3c86339ef1344ef55a506c46d4d833bc7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: terminalBanner.buildTerminalBanner: FunctionTooLong \u2014 buildTerminalBanner runs 129 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 29 over it, 1.29\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/terminal/terminalBanner.ts"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd0b3c7c4172cc4463e25efaf69a39bff1c811dc72f88e073d01816755cc5d37"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CronExpressionInput.CronExpressionInput: FunctionTooLong \u2014 CronExpressionInput runs 129 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 29 over it, 1.29\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/CronExpressionInput.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d130f47b050a9aeae7b14597154c477c3f6d50fc20645c46cd757f5ab43bb42"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: HomePage.build: MethodTooLong \u2014 build runs 129 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 29 over it, 1.29\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/home/home_page.dart"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"36d33b0139bbfec83a0b645c028585dc86cf64b6a19081d5dda36859d8adf764"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/agent.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 62% of them inside a single declaration: RunCtx (2 blocks, 143-1059). 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/buzz-agent/src/agent.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"db169a88a6e2e00b80b68cb12b4cb4d7aba646e935890fb28d834bbfe8442673"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: managed_agents/discovery.rs: FileTooLong \u2014 641 significant 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 50 free functions. The bar is 500 significant lines; this is 141 over it, 1.28\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/discovery.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"512a1fd4cdedc93b5f38ed1ac304256c7a357d186c85c9bfeba217df6eed5985"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: channels_page/sheets.dart: FileTooLong \u2014 640 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 140 over it, 1.28\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channels_page/sheets.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8af9deb1a82d4cc11ea16fc315a6e7f133fd24294c4a28cb93ae2a33b0f6037"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: channels/message_actions.dart: FileTooLong \u2014 640 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 140 over it, 1.28\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/message_actions.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"95d88fa3e075c3019b0d59e9826aec863a9da1169e8256e370c9c3ecbf9a6ce5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::managed_agents::backend::invoke_provider: FunctionTooLong \u2014 buzz_desktop::managed_agents::backend::invoke_provider 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":"desktop/src-tauri/src/managed_agents/backend.rs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef4f4bccd67ea68cfbbaa88d4e87a22b27aff73bce9447880afa4998a1ba0377"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::migration::pollen::migrate_pollen_agent_name_in_file: FunctionTooLong \u2014 buzz_desktop::migration::pollen::migrate_pollen_agent_name_in_file 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":"desktop/src-tauri/src/migration/pollen.rs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"c86d07f959c5df8ca9a17e84f5b7e95a5ae78b4aa68802da7a92dc6589fcefb6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AgentSnapshotExportDialog.AgentSnapshotExportDialog: FunctionTooLong \u2014 AgentSnapshotExportDialog runs 128 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/agents/ui/AgentSnapshotExportDialog.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"03693288000fa92d5dcb6a88849b4ecdf3d28c4ddee9384a2db51e7cfdc0ed7e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectWorkItemRow.ProjectWorkItemRow: FunctionTooLong \u2014 ProjectWorkItemRow runs 128 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/projects/ui/ProjectWorkItemRow.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"d252b558d4ba6e49d3542c4224f3a0f4a2ab9eb43110cd79bfb32131d87fe203"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkflowFormBuilder.WorkflowNode: FunctionTooLong \u2014 WorkflowNode runs 128 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/workflows/ui/WorkflowFormBuilder.tsx"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"1046299df3475d7637a008e60cac43086b4c47b0b36040cfc72444c303e60107"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/lib.rs: FileTooLong \u2014 639 significant 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 139 over it, 1.28\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/lib.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9f2bcb8802decb7f335364e783814871b00cd82e41e25b7d9f9b509f0e337ab"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ChannelsNotifier: ClassTooLong \u2014 511 significant lines (blank, comment-only and punctuation-only lines excluded), 25 methods. The bar is 400 significant lines; this is 111 over it, 1.28\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channels_provider.dart"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a61ea645abfb148f1c12bd360448cac83f299faf336e7e7e08ec501d951d0ba"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: HostedCommunitiesSettingsCard: ClassTooLong \u2014 511 significant lines (blank, comment-only and punctuation-only lines excluded), 5 methods. The bar is 400 significant lines; this is 111 over it, 1.28\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/HostedCommunitiesSettingsCard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e9363d30d026a62bc612beefff06b0b7fa028f38c12b2df731cce509bed1c19"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: BuzzDevPushEnrollmentDriver: ClassTooLong \u2014 510 significant lines (blank, comment-only and punctuation-only lines excluded), 19 methods. The bar is 400 significant lines; this is 110 over it, 1.28\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzDevPushEnrollmentDriver.swift"},"region":{"startLine":333}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fa60fe4a437f5ef20939b25aed0ea6b8da07bf954a8becbc6b343c38f3229af"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: channel_detail_page/huddle_sheet.dart: FileTooLong \u2014 637 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 137 over it, 1.27\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_detail_page/huddle_sheet.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dbd49b5e2d6f4accee6dde2e1037dd8e55165318f4bcf4e54b7b1e947c9e348"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/PersonaShareDialog.tsx: FileTooLong \u2014 636 significant lines (blank, comment-only and punctuation-only lines excluded), about 61% of them inside a single declaration: SnapshotShareDialog (228-677). The bar is 500 significant lines; this is 136 over it, 1.27\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/PersonaShareDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"69883f9786bf7d44a5a17bd249417c4e41c4109785ecff8d4d264811e9fc538e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::api::media::upload_blob_result: FunctionTooLong \u2014 buzz_relay::api::media::upload_blob_result runs 127 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 27 over it, 1.27\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/media.rs"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd9eabb95dee53462f73b5aadfcd482c22d94fbea2e5d21c00e613e475a2d4d1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::handlers::event::handle_event: FunctionTooLong \u2014 buzz_relay::handlers::event::handle_event runs 127 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 27 over it, 1.27\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/event.rs"},"region":{"startLine":608}}}],"partialFingerprints":{"codehealthFindingId/v1":"46ee41a7d0895db580c6a2fb42060bafbc2d6c7138dc3b6fdf84ddc9a36f72d9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AdminConsoleReportsTab.ResolveReportForm: FunctionTooLong \u2014 ResolveReportForm runs 127 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 27 over it, 1.27\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/AdminConsoleReportsTab.tsx"},"region":{"startLine":362}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e24cf2a5825209f8fadacd9be392e0b410373fbaf096e20fb4f2a48b01f231c"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: PairingPage.build: MethodTooLong \u2014 build runs 127 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 27 over it, 1.27\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/pairing/pairing_page.dart"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"a95f73356f4b9e7ef94b3c961dcec41e4364dc66660c16f15c998653d20dfe81"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: admin/mod.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), declaring 31 free functions. The bar is 500 significant lines; this is 132 over it, 1.26\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/admin/mod.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"13614b10969e5cdba8b79471e18e8836ad6d9d0e738f7fae6a2b4a380ef0f1ec"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/lib.rs: FileTooLong \u2014 631 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 131 over it, 1.26\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-pair-relay/src/lib.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2d62de3b4e5c088304186751385ca5bf38957dbad23804624de7f8409f74157"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SelectionFormattingTray.SelectionFormattingTray: FunctionTooLong \u2014 SelectionFormattingTray runs 126 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 26 over it, 1.26\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/SelectionFormattingTray.tsx"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"15a5c4b574b87b72c8466901e949f761449041f74111ab6162674a52917c34b5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectsIssuesList.ProjectsIssuesList: FunctionTooLong \u2014 ProjectsIssuesList runs 126 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 26 over it, 1.26\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectsIssuesList.tsx"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5178f2446cb70e747748758605dcaf3b2fac57c998cdda47f193ef23d28ea54"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectsPullRequestsList.ProjectsPullRequestsList: FunctionTooLong \u2014 ProjectsPullRequestsList runs 126 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 26 over it, 1.26\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectsPullRequestsList.tsx"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fcbd2b720c0c561459d8df663729959be07c5ed65984e8c3ff7e6d259e8188e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: api/types.ts: FileTooLong \u2014 626 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 126 over it, 1.25\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/api/types.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d1bf13c520592e1200f4d7f4951195762f8db7118100be1646b8d1ba155b381"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: useMediaUpload: ClassTooLong \u2014 500 significant lines (blank, comment-only and punctuation-only lines excluded), 6 methods. The bar is 400 significant lines; this is 100 over it, 1.25\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useMediaUpload.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"37f99c85c2518c12d2181e826b7fa3fa11c094d979969807ad245d79a134beaf"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: agents/hooks.ts: FileTooLong \u2014 625 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 125 over it, 1.25\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/hooks.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a11e1880693d39a47ae07db51ac694dec2603233db375f8f15c90a71de084d2a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BuzzDevPushEnrollmentDriver.completeEnrollment: MethodTooLong \u2014 completeEnrollment runs 125 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 25 over it, 1.25\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzDevPushEnrollmentDriver.swift"},"region":{"startLine":609}}}],"partialFingerprints":{"codehealthFindingId/v1":"7af036fbf3eea584314314dd3f7d73abeeeac9066887c1b4602c61e730d691e2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: FeedSection.FeedSection: FunctionTooLong \u2014 FeedSection runs 125 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 25 over it, 1.25\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/ui/FeedSection.tsx"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0b9b8b04a807384c25400571d42c22c84a9967b075a9cd903aee69e59478b79"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: RemindersPanel.ReminderRow: FunctionTooLong \u2014 ReminderRow runs 125 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 25 over it, 1.25\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/reminders/ui/RemindersPanel.tsx"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"a25b7b8c3bb4f841907755f3c14079666e4948deb4109e815f980bbd36415f32"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: EncryptedBackupCreator.PassphraseGeneratorPopover: FunctionTooLong \u2014 PassphraseGeneratorPopover runs 125 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 25 over it, 1.25\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/EncryptedBackupCreator.tsx"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec30b98190a6115116f6b386de0f7aa3b1361c776d23cb10d826221ed7d88862"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: calendar.Calendar: FunctionTooLong \u2014 Calendar runs 125 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 25 over it, 1.25\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/calendar.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ba3c760dbb0f558860b28894c1335c50fbc68dbd00125ada8d5866a77b97044"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: styled-qr-code.StyledQrCode: FunctionTooLong \u2014 StyledQrCode runs 125 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 25 over it, 1.25\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/styled-qr-code.tsx"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"1146a4e2ed11868fd40825e76829972ad633f97bd91458a765fa7e70b5f18723"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SettingsPage.build: MethodTooLong \u2014 build runs 125 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 25 over it, 1.25\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/settings/settings_page.dart"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"5350d4accce06cc4ad20b8778d6b0ae68890f90b29770efadf172f8e83c33215"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/EncryptedBackupCreator.tsx: FileTooLong \u2014 623 significant lines (blank, comment-only and punctuation-only lines excluded), about 61% of them inside a single declaration: EncryptedBackupCreator (361-825). The bar is 500 significant lines; this is 123 over it, 1.25\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/EncryptedBackupCreator.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"675e163ec4df2972b8428f0db7cc8d5b6c7a58b1f36871ea1200f364fc9a1b9a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: message_actions/message_action_popover.dart: FileTooLong \u2014 621 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 121 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":"mobile/lib/features/channels/message_actions/message_action_popover.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d24ba5df661db13767ccb886cd64bff7ff064d18f643b8ae8caad16d6c2854e3"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AppDelegate.didInitializeImplicitFlutterEngine: MethodTooLong \u2014 didInitializeImplicitFlutterEngine runs 124 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 24 over it, 1.24\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/AppDelegate.swift"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b7140af1c2024fcc304b3edabafd74a558fde29cc1a314de3c6d9a9dfb27a79"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_acp::dispatch_pending: FunctionTooLong \u2014 buzz_acp::dispatch_pending runs 124 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 24 over it, 1.24\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/lib.rs"},"region":{"startLine":4403}}}],"partialFingerprints":{"codehealthFindingId/v1":"39e4c5cb565a35b2a8a9a656c810dc91e664c44bee3a7f07fa6c247f3f5608b2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useAppShellDesktopNotifications.useAppShellDesktopNotifications: FunctionTooLong \u2014 useAppShellDesktopNotifications runs 124 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 24 over it, 1.24\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/app/useAppShellDesktopNotifications.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4ca9624bb8b62de10237d7a5120113b906090a0df290882af0fb884619187ee"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: agentSessionTranscriptHelpers.parseSystemPromptSections: FunctionTooLong \u2014 parseSystemPromptSections runs 124 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 24 over it, 1.24\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/agentSessionTranscriptHelpers.ts"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"00349bc9477681a61b86a9b17a6ef32b20bbbf10d8a758d51fce26a28af283cb"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useDraftPersistSnapshot.useDraftPersistLifecycle: FunctionTooLong \u2014 useDraftPersistLifecycle runs 124 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 24 over it, 1.24\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useDraftPersistSnapshot.ts"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3d38fc67adea14d6470fa6d1106a6a028f58699f8a958363ce8720ebef11cc4"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useCreateChannelForm.useCreateChannelForm: FunctionTooLong \u2014 useCreateChannelForm runs 124 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 24 over it, 1.24\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/lib/useCreateChannelForm.ts"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"86c4ac9c4278534d7e469fe683a73d723d1cd389751e671d12d13df9efeba61d"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _SasVerificationView.build: MethodTooLong \u2014 build runs 124 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 24 over it, 1.24\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/pairing/pairing_page.dart"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a5a17797002d710c72e58ba59a270be372f959760beadf652fe23e8bfad003b"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: FrostedAppBar.build: MethodTooLong \u2014 build runs 124 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 24 over it, 1.24\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/widgets/frosted_app_bar.dart"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cf02b610a72f871d457dcdf060c1e3ce380a9d361206580c119430f29f1c7c8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: runtime/mod.rs: FileTooLong \u2014 619 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 62% of them inside a single declaration: Db (2 blocks, 126-1360). The bar is 500 significant lines; this is 119 over it, 1.24\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/runtime/mod.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"360a0bb89d9ea3688322bacbb191b16077ec0e32c7b698ba26e79f04ba7282cf"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/ForumComposer.tsx: FileTooLong \u2014 619 significant lines (blank, comment-only and punctuation-only lines excluded), about 93% of them inside a single declaration: ForumComposerVisit (52-786). The bar is 500 significant lines; this is 119 over it, 1.24\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/forum/ui/ForumComposer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"452fa841e814939aef20f867809b2fcbd57d8a0d98195ab6f1a71facee38ffbd"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: admin-console/AdminConsoleStaffingTab.tsx: FileTooLong \u2014 618 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 118 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":"desktop/src/features/admin-console/AdminConsoleStaffingTab.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"744c337f05cb237b6961c1db40954467f57ad2b1a05b6646223e2f0dad1ca432"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_agent::llm::post: FunctionTooLong \u2014 buzz_agent::llm::post runs 123 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 23 over it, 1.23\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/llm.rs"},"region":{"startLine":1862}}}],"partialFingerprints":{"codehealthFindingId/v1":"b73d4659f52bd8d5e749dcf5b89e83dac958f168991fd51087db5562e10bd331"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_db::store::relay_invite::claim_relay_invite: FunctionTooLong \u2014 buzz_db::store::relay_invite::claim_relay_invite runs 123 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 23 over it, 1.23\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/relay_invite.rs"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"239b1e8b432661226d1b48d213956d6a326f7c9146d2fbde41328e24f7ca5bce"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::api::bridge::handle_channel_window_filter: FunctionTooLong \u2014 buzz_relay::api::bridge::handle_channel_window_filter runs 123 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 23 over it, 1.23\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/bridge.rs"},"region":{"startLine":672}}}],"partialFingerprints":{"codehealthFindingId/v1":"721255d051f39b75fca77775baa2496e8c6293ca0045bce58b2b22fe25e69d9c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ManagedAgentLogPanel.ManagedAgentLogPanel: FunctionTooLong \u2014 ManagedAgentLogPanel runs 123 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 23 over it, 1.23\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/ManagedAgentLogPanel.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"05fa80d352cd8100e6311159c6dfb96bfa636cdef66a6e803b8e8faec6871466"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WelcomeComposerBanner.WelcomeComposerBanner: FunctionTooLong \u2014 WelcomeComposerBanner runs 123 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 23 over it, 1.23\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/WelcomeComposerBanner.tsx"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fe4724024401df9def9b0abeb935005e2b8b6245e39c3016909b645d16bb006"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useComposerVoiceNote.useComposerVoiceNote: FunctionTooLong \u2014 useComposerVoiceNote runs 123 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 23 over it, 1.23\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useComposerVoiceNote.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea83a91a930091345edf67e3aaf93246f2be3bca1cfbf7c2314b8d4f0bee90b7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useProjectChannelRequests.useProjectChannelRequests: FunctionTooLong \u2014 useProjectChannelRequests runs 123 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 23 over it, 1.23\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/useProjectChannelRequests.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a77ffd1992ccd5c9a8a8614f868d0aa18eabb63545d815f199bf6d50fe9d249"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: messages/hooks.ts: FileTooLong \u2014 614 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 114 over it, 1.23\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/hooks.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"94db6edb37e11bd4fb04a46a601dce502555b0cfc2008123b20c94837d9bea4f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: channels/channel_detail_page.dart: FileTooLong \u2014 611 significant lines (blank, comment-only and punctuation-only lines excluded), about 79% of them inside a single declaration: ChannelDetailPage (252-852). The bar is 500 significant lines; this is 111 over it, 1.22\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_detail_page.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dd1effa471dc2122812041559891c325518790aa082e267699a69eb745590d3"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: BuzzPushKit/BuzzPushPresentationCache.swift: FileTooLong \u2014 610 significant lines (blank, comment-only and punctuation-only lines excluded), about 78% of them inside a single declaration: BuzzPushPresentationCacheStore (160-760). The bar is 500 significant lines; this is 110 over it, 1.22\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushPresentationCache.swift"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b80e15e45c55f38d1ed00289fe01edac3b5330b23f6a1b7ec72b8e7df76ed77a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/config.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/buzz-agent/src/config.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b9cf2e91a4819d26f06c94976644ff19ea86ad0b0ae333f3d65024df4b1f773"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::migration::sync_shared_agent_data: FunctionTooLong \u2014 buzz_desktop::migration::sync_shared_agent_data 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":"desktop/src-tauri/src/migration.rs"},"region":{"startLine":785}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae01263ed92ebb02edc1a2aef9d11bf8ae05e52352ce9a7b40e5ff64bad4fd3f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: HuddleProfileControl.HuddleProfileControl: FunctionTooLong \u2014 HuddleProfileControl runs 122 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/huddle/components/HuddleProfileControl.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"10e0519d56e4d1e00b17754e628cc8101c4e4d32838fb6d161c77e50a38b89fc"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: TimelineMessageRow.MessageRowItem: FunctionTooLong \u2014 MessageRowItem runs 122 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/messages/ui/TimelineMessageRow.tsx"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"d36b50d0e5d552f2ebf4524640d6b5b097b2ab32eb192cb2383f6faab5056d78"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: machineOnboarding.useMachineOnboardingState: FunctionTooLong \u2014 useMachineOnboardingState runs 122 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/onboarding/machineOnboarding.ts"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfd9e55d6bee56855d6a89baab879e8b61d63fac4dac3d04fc042d4a7f861049"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: UserProfilePrimaryActions.ProfilePrimaryActions: FunctionTooLong \u2014 ProfilePrimaryActions runs 122 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/profile/ui/UserProfilePrimaryActions.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2a540aa395c68a4f62cd8d675a54f236714c25402f86e5e64ac32bf91b0dab8"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _MobileHuddleDrawer.build: MethodTooLong \u2014 build runs 122 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"mobile/lib/features/channels/channel_detail_page/huddle_drawer.dart"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f2fc1d1c49ef82b8ff4e5282d043e460f7e6b89e55eea050d7f148488e61152"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: mesh_llm/mod.rs: FileTooLong \u2014 609 significant 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 109 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":"desktop/src-tauri/src/mesh_llm/mod.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8059f4c48ecf6ef4cef0ef660e31a970aa5e8f6d3702b983c064ecf6ac051361"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: theme_picker_page/theme_preview_sheet.dart: FileTooLong \u2014 609 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 109 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":"mobile/lib/features/settings/theme_picker_page/theme_preview_sheet.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"68206ffdb0523803c4d83b865df933c8006002ba30bcc541f5db2a5d1ace92a5"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AnimatedAvatarCapture: ClassTooLong \u2014 487 significant lines (blank, comment-only and punctuation-only lines excluded), 2 methods. The bar is 400 significant lines; this is 87 over it, 1.22\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":"mobile/lib/features/profile/animated_avatar_capture.dart"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"8790959a0f5ef0025de3c0cc9eabc03b6eaa7fde7f50393a854c50324d67245a"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ChannelDetailPage: ClassTooLong \u2014 485 significant lines (blank, comment-only and punctuation-only lines excluded), 2 methods. The bar is 400 significant lines; this is 85 over it, 1.21\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_detail_page.dart"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b4dbe82cbd71e40446862eca64e649029ef72b57bbd306fc69d218116f0b5d8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: channels/hooks.ts: FileTooLong \u2014 605 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 105 over it, 1.21\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":"desktop/src/features/channels/hooks.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ae0770040f0bf650fb8e6cc3c9da852bca1ea6f88687f3842defcbc8f492268"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::commands::personas::update::update_persona_with: FunctionTooLong \u2014 buzz_desktop::commands::personas::update::update_persona_with runs 121 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 21 over it, 1.21\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/personas/update.rs"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac136cb9b1b6b37990bea784ce45e4cc28801fa73fa5ccfd43fb2a6513e7277e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useChannelAgentSessions.useChannelAgentSessions: FunctionTooLong \u2014 useChannelAgentSessions runs 121 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 21 over it, 1.21\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/useChannelAgentSessions.ts"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb64318cd8a16a4ff0155025e605ee17bf9c248c4cf1067ca1b20e385d767909"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectInboxDetailPane.ProjectInboxDetailPane: FunctionTooLong \u2014 ProjectInboxDetailPane runs 121 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 21 over it, 1.21\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/ui/ProjectInboxDetailPane.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"21d0ba09c156f316711002863c635f35be7e47541f73d31da465961de57a7690"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectsSectionSearch.ProjectsSectionSearch: FunctionTooLong \u2014 ProjectsSectionSearch runs 121 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 21 over it, 1.21\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectsSectionSearch.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae28a5722a47bd14db595f362b1944995455f8dafbe2eb19609e1ea65e76c3b3"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/connection.rs: FileTooLong \u2014 604 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 104 over it, 1.21\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/buzz-relay/src/connection.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd53361a4effdb2ea6bcf575ab3c6c078f333f91ffaf2907ef6df4cec76535ec"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/useAnchoredScroll.ts: FileTooLong \u2014 604 significant lines (blank, comment-only and punctuation-only lines excluded), about 87% of them inside a single declaration: useAnchoredScroll (150-974). The bar is 500 significant lines; this is 104 over it, 1.21\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useAnchoredScroll.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d28ab2813753407fc8e7583e7b7aadc9729b8da68b7c9ac7b774963f7536bfd5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/SidebarProjectsSection.tsx: FileTooLong \u2014 603 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 103 over it, 1.21\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":"desktop/src/features/sidebar/ui/SidebarProjectsSection.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0fbeeddcd72d6724c11b6ef8bce5c8d3227edaf4f2c3494382134c4b55407aa"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: compose_bar/attachments.dart: FileTooLong \u2014 603 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 103 over it, 1.21\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":"mobile/lib/features/channels/compose_bar/attachments.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"105d5ed6a1de4ab8c7d267c655f9de709f2f886957aa5bc1fef618b95a12d245"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: lib/useMediaUpload.ts: FileTooLong \u2014 601 significant lines (blank, comment-only and punctuation-only lines excluded), about 83% of them inside a single declaration: useMediaUpload (161-971). The bar is 500 significant lines; this is 101 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":"desktop/src/features/messages/lib/useMediaUpload.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b840af635ecce51d60928d4e46ba3fd90ba41071953a557ca04ca9c330a24454"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_acp::relay::execute_connected_command: FunctionTooLong \u2014 buzz_acp::relay::execute_connected_command runs 120 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 20 over it, 1.20\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/relay.rs"},"region":{"startLine":1548}}}],"partialFingerprints":{"codehealthFindingId/v1":"9acf206c39a560d2071e66800a474d12d9b688b1ecd7465b7f6c82c6f5b5444d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_acp::run_task::run: FunctionTooLong \u2014 buzz_acp::run_task::run runs 120 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 20 over it, 1.20\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/run_task.rs"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3a542b1348a69aedcc9731fcb7ebf9da7b7855a6e9c9be83174b2dd20cae28b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AgentConfigPanel.AgentConfigSurfaceRows: FunctionTooLong \u2014 AgentConfigSurfaceRows runs 120 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 20 over it, 1.20\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentConfigPanel.tsx"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"29efbee57f1c2283bd243b77e98d17d33250d1141cfbb3e81342b903aa75a257"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectIssueCommentTimeline.ProjectIssueCommentTimeline: FunctionTooLong \u2014 ProjectIssueCommentTimeline runs 120 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 20 over it, 1.20\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectIssueCommentTimeline.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ab1627e18f2afbee87bb1f72312b4aea40d92c73640f629dc0bd7581238e5c7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectRepositorySource.RepositoryBranchDropdown: FunctionTooLong \u2014 RepositoryBranchDropdown runs 120 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 20 over it, 1.20\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectRepositorySource.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"b11adcd40189178875adb2ae4c9cdaf5c910bda01df8e22dd617d919a8f0ce1a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/shell.rs: FileTooLong \u2014 598 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 98 over it, 1.20\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-dev-mcp/src/shell.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e615fb3fd68f5807c56b9fd586f066897d2099f3424d3a51bc996dcd2c0e959f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/AppearanceSettingsControls.tsx: FileTooLong \u2014 597 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 97 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":"desktop/src/features/settings/ui/AppearanceSettingsControls.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"598cb286064d9f638c20aef334c5a65fd96c0bddabe0543c8937fa5d32f8173e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: onboarding/welcomeKickoff.ts: FileTooLong \u2014 596 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 96 over it, 1.19\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/welcomeKickoff.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1f849fb80fd5e9f0608cc4894251ecf56d2da4ef37fedac2c81b76900bc927d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_agent::session_new: FunctionTooLong \u2014 buzz_agent::session_new 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/buzz-agent/src/lib.rs"},"region":{"startLine":432}}}],"partialFingerprints":{"codehealthFindingId/v1":"da6a098dc8bf0b9c9e40cc2cbb4c9a778a89df168f8edd655c6434f6dadf7f5d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useChannelTyping.useChannelTyping: FunctionTooLong \u2014 useChannelTyping runs 119 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/messages/useChannelTyping.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"12f13b5986cc8a2d18a7cab1682965a894dff01261ff16bac1242672ef3430ee"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectDetailChrome.ProjectDetailChrome: FunctionTooLong \u2014 ProjectDetailChrome runs 119 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/projects/ui/ProjectDetailChrome.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"57c8a643d7b2c873e2c1aaf22743a5a18b1029fe545d839f1f4b6120fffb9f08"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SidebarProjectsSection.SidebarProjectRow: FunctionTooLong \u2014 SidebarProjectRow runs 119 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/sidebar/ui/SidebarProjectsSection.tsx"},"region":{"startLine":565}}}],"partialFingerprints":{"codehealthFindingId/v1":"c956899b3ded02b074f680dfe95a8fedaa0151df6139d56e1bd834beb5e16f47"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkflowCard.WorkflowCard: FunctionTooLong \u2014 WorkflowCard runs 119 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/workflows/ui/WorkflowCard.tsx"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"f82b50b0eaf0e3a528fad6609d65b53c75abb89da7135d7bf7a06f8501ba78de"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useResolvedLinkPreviews.createMetadataLoader: FunctionTooLong \u2014 createMetadataLoader runs 119 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/shared/lib/useResolvedLinkPreviews.ts"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e9032e6f70c56984b67630f1f6c135b89bbdc7360c4be4bdfb90817e29c9cc3"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _PersonInviteSection.build: MethodTooLong \u2014 build runs 119 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"mobile/lib/features/invites/invite_create_page/person_invite_section.dart"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bfd0fbc18b337f1fb5225e09a7f641b6ea0adbc94d59961d9c4cc9342444003"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: FallbackPairingQrScanner.build: MethodTooLong \u2014 build runs 119 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"mobile/lib/features/pairing/pairing_qr_scanner/fallback_scanner.dart"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f4752fd18990338d4b34b05c02d4c0c1ecd31bcd47e2601e49585cb6ccc0637"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: BuzzPushPresentationCacheStore: ClassTooLong \u2014 475 significant lines (blank, comment-only and punctuation-only lines excluded), 28 methods. The bar is 400 significant lines; this is 75 over it, 1.19\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushPresentationCache.swift"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"54e5bb200c308d4e70f6b0f375e60d87873e6dfab5367e0b5a2ff327dd4c0a6b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/terminal_runtime.rs: FileTooLong \u2014 592 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 92 over it, 1.18\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/terminal_runtime.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f029da0e95c670fca233f3cafc8026ee737b7c1466c82cbf2a6f117057a1574"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: InboxListPane: ClassTooLong \u2014 472 significant lines (blank, comment-only and punctuation-only lines excluded), 6 methods. The bar is 400 significant lines; this is 72 over it, 1.18\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":"desktop/src/features/home/ui/InboxListPane.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e460aa52300ff9fb15505ccad52227c41a762a89ded5034e1f8a5307b1cce64"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::api::bridge::workflow_webhook: FunctionTooLong \u2014 buzz_relay::api::bridge::workflow_webhook runs 118 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 18 over it, 1.18\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/bridge.rs"},"region":{"startLine":2367}}}],"partialFingerprints":{"codehealthFindingId/v1":"da3b06ec1c17e0b4e8a179408a3813c71509e0ea6a94eb0729669fedb5dc683a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ClientMessage.parse: MethodTooLong \u2014 parse runs 118 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 18 over it, 1.18\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/protocol.rs"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"d548f0c4c75727ad0cc4f9a5c04789b4855552fd5852f23e39962530aee2b1c3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AdminConsoleFeedbackTab.AttachmentViewer: FunctionTooLong \u2014 AttachmentViewer runs 118 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 18 over it, 1.18\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/AdminConsoleFeedbackTab.tsx"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a77954fc0cbc8371c6ca408dc8535a5b3c3b5aee49ab68e3062e35deac55f10"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CommunityMembersSettingsCard.CommunityMembersSettingsCard: FunctionTooLong \u2014 CommunityMembersSettingsCard runs 118 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 18 over it, 1.18\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/community-members/ui/CommunityMembersSettingsCard.tsx"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"855ade96719c8bbe7a3901d72bc707492efdaa01dca8996dbad40c22b6858b9d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: projectWorkItems.fetchProjectsWorkItems: FunctionTooLong \u2014 fetchProjectsWorkItems runs 118 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 18 over it, 1.18\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/projectWorkItems.ts"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"80d4a143538bcc1a0348fa59ecb48092cabecaa84874aa1239e03f7f109d6f92"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: use-updater.useUpdater: FunctionTooLong \u2014 useUpdater runs 118 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 18 over it, 1.18\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/hooks/use-updater.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"43162c50985f712747d4817caaa2b1fa4066239b5b4ac27aa9a7410609a7ef6e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: EmojiBurstProvider.EmojiBurstProvider: FunctionTooLong \u2014 EmojiBurstProvider runs 118 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 18 over it, 1.18\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/EmojiBurstProvider.tsx"},"region":{"startLine":556}}}],"partialFingerprints":{"codehealthFindingId/v1":"6532eab63257172ea5fa40bf8d2b7a556d5211ee44714dcd5e35d262599ad298"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SettingsProfileHeader.build: MethodTooLong \u2014 build runs 118 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 18 over it, 1.18\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/profile/settings_profile_header.dart"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"e20f6d31ba983b60b8f7d40bba0a674f8c140b0c01220110dadacd33cd42a62a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: archive/store.rs: FileTooLong \u2014 589 significant 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 89 over it, 1.18\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/archive/store.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f921dee54b1b926f011def53dc4dc9c7bd0d15a83eea48560e130211101ab652"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: readState/readStateManager.ts: FileTooLong \u2014 589 significant lines (blank, comment-only and punctuation-only lines excluded), about 73% of them inside a single declaration: ReadStateManager (271-999). The bar is 500 significant lines; this is 89 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":"desktop/src/features/channels/readState/readStateManager.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b470e29864c683eff3b0f87550ae358d5b6967dcf15be61db26b68dcb9f5a7a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: huddle/huddle_session.dart: FileTooLong \u2014 588 significant lines (blank, comment-only and punctuation-only lines excluded), about 75% of them inside a single declaration: HuddleSessionNotifier (178-774). The bar is 500 significant lines; this is 88 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":"mobile/lib/shared/huddle/huddle_session.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1acb411767a57ec5a9040c103e81fa372d29a214dd59cf159a0e48856047060"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: huddle/tts.rs: FileTooLong \u2014 586 significant 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 86 over it, 1.17\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/huddle/tts.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2623d091a82a0cbdbebc8f14cb07acbd7888a66f36643dbb67f0b3bc3a1c5689"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/catalog.rs: FileTooLong \u2014 585 significant 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 85 over it, 1.17\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/catalog.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b936f536eafa82b6189222f1f68e00ecbd339202140146c6504ebcd00418407"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::api::git::cas_publish::capture_compacted_packs: FunctionTooLong \u2014 buzz_relay::api::git::cas_publish::capture_compacted_packs 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/buzz-relay/src/api/git/cas_publish.rs"},"region":{"startLine":666}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2ecc0fbc56c2f7a8f56b27675db7344eaa1eb8e775e2bb620f89af7569621d8"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AprilPocketTts.synth_chunk_streaming: MethodTooLong \u2014 synth_chunk_streaming 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/buzz-voice/src/pocket_april.rs"},"region":{"startLine":476}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7be24281f75a5ea06e2823b581e63bcc58bd1234d96a8c5ab79a36dc52c338e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::commands::agent_discovery::relay_directory::list_relay_agents_for_selection: FunctionTooLong \u2014 buzz_desktop::commands::agent_discovery::relay_directory::list_relay_agents_for_selection 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":"desktop/src-tauri/src/commands/agent_discovery/relay_directory.rs"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"d120faee5bc5c7549fd18a45f63fd7cad24b93fce1814a7824b4f9c2f9061cc4"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: TeamSnapshotExportDialog.TeamSnapshotExportDialog: FunctionTooLong \u2014 TeamSnapshotExportDialog runs 117 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/agents/ui/TeamSnapshotExportDialog.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3460d286ad48ca1968a4cbe0d0c5fa377901b94568456836e886b3a279f4797"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _InviteLinkSection.build: MethodTooLong \u2014 build runs 117 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"mobile/lib/features/invites/invite_create_page/invite_link_section.dart"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6fcb434f164f614646d03d59d1b4f27f208ddf9f7adcb803028e75a23d97f51"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: commands/link_preview.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":"desktop/src-tauri/src/commands/link_preview.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9eba496186aebf64c72e1ef4567b342b64883cadd38109aa1bf6073df6acf52"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: BuzzPushNotificationResolver: ClassTooLong \u2014 464 significant lines (blank, comment-only and punctuation-only lines excluded), 17 methods. The bar is 400 significant lines; this is 64 over it, 1.16\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":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushNotificationResolver.swift"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2daf93a60fd8e6a823297ae2d3235a25997d719d12620be21e0d94e289aa671"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: personas/card.rs: FileTooLong \u2014 580 significant 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 80 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":"desktop/src-tauri/src/commands/personas/card.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f3b4faf1ff5edaeb161a7d5c3e09345b8e3437ad9a6a447cf528a453ca50c99"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: buzz-logo/BuzzLogoAnimation.tsx: FileTooLong \u2014 580 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 80 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":"desktop/src/shared/ui/buzz-logo/BuzzLogoAnimation.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4d60a2a5481909f411de4607ca51170303c1298b1394af70f9552a00cc2aea4"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::relay::profile_avatar::localize_avatar: FunctionTooLong \u2014 buzz_desktop::relay::profile_avatar::localize_avatar 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":"desktop/src-tauri/src/relay/profile_avatar.rs"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"05abf51be912e9efcf08dda9c1db1fbaf3454a5ec634509b7e69d5c230fd97b4"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AgentDefaultsDialog.AgentDefaultsDialog: FunctionTooLong \u2014 AgentDefaultsDialog runs 116 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/agents/ui/AgentDefaultsDialog.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfb64188156995f088881291623aca84b82e255497228b943fea5a8715492424"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: hooks.useFirstRunOnboardingGate: FunctionTooLong \u2014 useFirstRunOnboardingGate runs 116 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/onboarding/hooks.ts"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"19f3c230cad356ad5e0c17ffbd1209024e7a7e327fcab0a8cb93fe91f305aad8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectsOverviewItems.ProjectsOverviewRepositoryItems: FunctionTooLong \u2014 ProjectsOverviewRepositoryItems runs 116 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/projects/ui/ProjectsOverviewItems.tsx"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"d05db0b60720c0d205c133fa673748d0f68cd32c810e666e2a5dbc8fc8c32cc3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: RemindMeLaterDialog.RemindMeLaterDialog: FunctionTooLong \u2014 RemindMeLaterDialog runs 116 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/reminders/ui/RemindMeLaterDialog.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"243a9dee545ff29c95942c0922f96c504ef5f3846668f082665de184b68df23e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: HarnessesSettingsPanel.HarnessesSettingsPanel: FunctionTooLong \u2014 HarnessesSettingsPanel runs 116 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/settings/ui/HarnessesSettingsPanel.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"5090daf35eeb41890de64a72153ec51a8e21d42151fc5226dad27029443429c7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SidebarSection.ChannelMenuButton: FunctionTooLong \u2014 ChannelMenuButton runs 116 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/sidebar/ui/SidebarSection.tsx"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d965b65140512bd458ca29edfd43c749191895277b8e081e1cfd7bfabc18c92"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: commands/projects.rs: FileTooLong \u2014 579 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), declaring 31 free functions. The bar is 500 significant lines; this is 79 over it, 1.16\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/projects.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d5c3d5a11606d517514a3e6fd507098474cd6b54c16f50692ad93ed170f45d1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: theme/ThemePreviewFrame.tsx: FileTooLong \u2014 579 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 79 over it, 1.16\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/theme/ThemePreviewFrame.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"123cb59096aabc28f638f67869758ac8bc1defec772709c7c242e7bdcf8856c3"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ImageAvatarCapture: ClassTooLong \u2014 462 significant lines (blank, comment-only and punctuation-only lines excluded), 2 methods. The bar is 400 significant lines; this is 62 over it, 1.16\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":"mobile/lib/features/profile/image_avatar_capture.dart"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"26af12ee6a53e5eb426ec939aa0ffc39f82c0f6ffd58b93165681f11b675fba5"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: NewMessageScreen: ClassTooLong \u2014 462 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 62 over it, 1.16\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":"desktop/src/features/messages/ui/NewMessageScreen.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ff1610e555270e56118abb1c58d3a80816270cd78ade7966cf41981ce88d5b1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: commands/agent_discovery.rs: FileTooLong \u2014 576 significant 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 76 over it, 1.15\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/agent_discovery.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e6efe1eacf07e931d9e64b1bf37e2b7c89f45e2a49bbdd0f3f0ea8ef3b1187b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/validation.rs: FileTooLong \u2014 575 significant 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 75 over it, 1.15\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-media/src/validation.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0df5347e7d641ff5ebbbb3116313cc29af57ab41873b6934ec7d4933e698c17b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_db::store::thread::get_thread_replies_on: FunctionTooLong \u2014 buzz_db::store::thread::get_thread_replies_on runs 115 significant 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 15 over it, 1.15\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/buzz-db/src/store/thread.rs"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"c39891ae507c0fb744393dcbda498583f621b300376738e37f2a2ae7cfb19569"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_push_gateway::http::deliver: FunctionTooLong \u2014 buzz_push_gateway::http::deliver runs 115 significant 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 15 over it, 1.15\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/buzz-push-gateway/src/http.rs"},"region":{"startLine":654}}}],"partialFingerprints":{"codehealthFindingId/v1":"f106d4143e3bcf7459bec3e3def873343244c04d8a48badfb1adb7c178ae1030"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::handlers::imeta::validate_imeta_tags: FunctionTooLong \u2014 buzz_relay::handlers::imeta::validate_imeta_tags runs 115 significant 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 15 over it, 1.15\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/buzz-relay/src/handlers/imeta.rs"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b61f74770510488ada9a80915d3a387434a6db7e77a19736dc4df7d79b98278"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AnimatedAvatarControls.AvatarFilmstripPicker: FunctionTooLong \u2014 AvatarFilmstripPicker runs 115 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 15 over it, 1.15\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":"desktop/src/features/profile/ui/AnimatedAvatarControls.tsx"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"56f1d0e56fad5641818cf38e552e8bef9e3d0ef636544ae42509cb5856021679"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: UserProfilePanelTabs.ProfileInfoTabContent: FunctionTooLong \u2014 ProfileInfoTabContent runs 115 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 15 over it, 1.15\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":"desktop/src/features/profile/ui/UserProfilePanelTabs.tsx"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"787c055e543399f5dca808382e051c3c3fb0a31bf82b8f2db344ba8a4637198a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/NostrKeyImportForm.tsx: FileTooLong \u2014 573 significant lines (blank, comment-only and punctuation-only lines excluded), about 93% of them inside a single declaration: NostrKeyImportForm (60-705). The bar is 500 significant lines; this is 73 over it, 1.15\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/NostrKeyImportForm.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"feefe13a63de02621ad0d7f1fb7081ff645f974899121027aa309946188989e7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/ProjectWorkspaceTabs.tsx: FileTooLong \u2014 572 significant lines (blank, comment-only and punctuation-only lines excluded), about 87% of them inside a single declaration: WorkspaceTabs (86-642). The bar is 500 significant lines; this is 72 over it, 1.14\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectWorkspaceTabs.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a13016a4cbf57350b1eec14fdb83afcba4cdfb6c33459c97852f78d8106d087"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: config_bridge/reader.rs: FileTooLong \u2014 571 significant 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 71 over it, 1.14\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":"desktop/src-tauri/src/managed_agents/config_bridge/reader.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9106fe45cd4835e93719c9514ad0a64554079cdb30f077d285b66ce76d9349fb"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/AgentsView.tsx: FileTooLong \u2014 571 significant lines (blank, comment-only and punctuation-only lines excluded), about 93% of them inside a single declaration: AgentsView (40-704). The bar is 500 significant lines; this is 71 over it, 1.14\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentsView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"89e0f7133167214feb211bdfc0663454da74c16e1b3603c7df8948847a5d2be5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/MachineOnboardingFlow.tsx: FileTooLong \u2014 570 significant lines (blank, comment-only and punctuation-only lines excluded), about 91% of them inside a single declaration: MachineOnboardingFlow (57-654). The bar is 500 significant lines; this is 70 over it, 1.14\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/MachineOnboardingFlow.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d144d9b0505a7a588156f71d90b1a25025b08abf0983eeed6cddf345f725be5a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::handlers::command_executor::handle_workflow_trigger: FunctionTooLong \u2014 buzz_relay::handlers::command_executor::handle_workflow_trigger 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/buzz-relay/src/handlers/command_executor.rs"},"region":{"startLine":815}}}],"partialFingerprints":{"codehealthFindingId/v1":"884e26c4272ecf399b4c9d6c705b47d3070529173e5c6303b8648d5ee0c93aae"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AddChannelBotTeamsSection.AddChannelBotTeamsSection: FunctionTooLong \u2014 AddChannelBotTeamsSection runs 114 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/channels/ui/AddChannelBotTeamsSection.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"852aa9c6a5bdf80a5a2f08a0fde2429ef1d76d847e18da485b6d2624e50dacdb"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: plainTextProjection.buildPlainTextProjection: FunctionTooLong \u2014 buildPlainTextProjection runs 114 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/messages/lib/plainTextProjection.ts"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce919fcb3eb94c73f174e35991dcf771d554c1c80843071db441126009ded497"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: UserProfilePanelSections.ProfileHero: FunctionTooLong \u2014 ProfileHero runs 114 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/profile/ui/UserProfilePanelSections.tsx"},"region":{"startLine":606}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b1727c32ea1e124fbb15402999d6054111fbac4523200de06d8d6f072ee9d09"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useProjectSidebarMembership.useProjectSidebarMembership: FunctionTooLong \u2014 useProjectSidebarMembership runs 114 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/projects/lib/useProjectSidebarMembership.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ce59b95f7eb0dd2df2a53bcbb57b272dbb37c08bb08f55258b85e6c08dde8d9"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ChannelQuickActionsLauncher.build: MethodTooLong \u2014 build runs 114 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"mobile/lib/features/channels/channels_page/quick_actions_launcher.dart"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2cf80a5d1f185b438cbdec108522b7829280ca424461ac2b1e6c1d8c2392b37"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _InlineCameraPreview.build: MethodTooLong \u2014 build runs 114 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"mobile/lib/features/channels/compose_bar/camera_preview.dart"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee12b75df32ecce9e1b752531692afb8433201d03ccbd543fb21305fc27b9b94"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: handlers/report_resolution.rs: FileTooLong \u2014 569 significant 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 69 over it, 1.14\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/buzz-relay/src/handlers/report_resolution.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac8de5c81019210409f4ec2523e27fd0d401378d3b121b5a4b59911dd552660b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: app/App.tsx: FileTooLong \u2014 569 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 69 over it, 1.14\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":"desktop/src/app/App.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4800f1ff580b47cc93bada15bce20bc91925ee2f31f57025a8a56f0029e3edfa"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: channels/channel_details_page.dart: FileTooLong \u2014 569 significant lines (blank, comment-only and punctuation-only lines excluded), about 78% of them inside a single declaration: ChannelDetailsPage (27-572). The bar is 500 significant lines; this is 69 over it, 1.14\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_details_page.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5a0eab82311a886f0e01f3ef55e5e3e3f9fb6e49fbf6f6effe8067dc2c349b2"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: useObservedUnreadPersistence: ClassTooLong \u2014 455 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 55 over it, 1.14\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/useObservedUnreadPersistence.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9069250c87656a656c18b395a4ef023bfe1dbed8e5e962d39ba103c619d1ecc8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: lib/useResolvedLinkPreviews.ts: FileTooLong \u2014 567 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 67 over it, 1.13\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/lib/useResolvedLinkPreviews.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"883e4b7875a8f674ccdffc73df33edc9f231fca30c51f7e51d5a116f1541c331"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: profile/profile_avatar_editor.dart: FileTooLong \u2014 567 significant lines (blank, comment-only and punctuation-only lines excluded), about 69% of them inside a single declaration: ProfileAvatarEditor (73-584). The bar is 500 significant lines; this is 67 over it, 1.13\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/profile/profile_avatar_editor.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5dd8ef11d2bf8e7f5492df2ffef2694cd488f3174ff0b17068f1390c157d3fcf"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: PairingNotifier: TooManyMethods \u2014 34 methods. The bar is 30 methods; this is 4 over it, 1.13\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/pairing/pairing_provider.dart"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"febbea452798af1d936982f2de9ef961bf2edea12be0c978412b3d8093e888bf"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: HuddleTransport: TooManyMethods \u2014 34 methods. The bar is 30 methods; this is 4 over it, 1.13\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/huddle/huddle_transport.dart"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"68343585e83eeb72695a985ae7c0bbd4db33ed16d2b2896e967b3ee5ac59cd83"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: Config: TooManyFields \u2014 34 stored fields beside 3 methods. The bar is 30 stored fields; this is 4 over it, 1.13\u00D7 the bar. This is width in DATA, not behaviour: every reader that takes the whole type couples to all of its fields, so a change to any one of them is a change every reader has to be checked against. To reduce it, group the fields that are read together by the same callers into a smaller type of their own, and have this one hold that type as a single member \u2014 each reader then names only the group it uses."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/config.rs"},"region":{"startLine":544}}}],"partialFingerprints":{"codehealthFindingId/v1":"3447e6f8f3fedbe5fd2906001be9d537c91c8db691514e065a27b1e8275bd670"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/HarnessCatalogDialog.tsx: FileTooLong \u2014 565 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 65 over it, 1.13\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/HarnessCatalogDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aae27c95436a846ce29b4c5d8c15389b56a7addaf8df3358ac56e0792427a322"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::commands::agents::start_managed_agent: FunctionTooLong \u2014 buzz_desktop::commands::agents::start_managed_agent runs 113 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 13 over it, 1.13\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/agents.rs"},"region":{"startLine":826}}}],"partialFingerprints":{"codehealthFindingId/v1":"07640028c880dfc3f2ec0b8daec35938caecb9c39fe5614a4b01b428bbcbe589"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::commands::pairing::pairing_ws_task_inner: FunctionTooLong \u2014 buzz_desktop::commands::pairing::pairing_ws_task_inner runs 113 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 13 over it, 1.13\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/pairing.rs"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"889023485e0aaef20936146bef379c9d107d09c5a3fc43b0dbf7d4be7af73774"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::native_relay_client::run_connection: FunctionTooLong \u2014 buzz_desktop::native_relay_client::run_connection runs 113 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 13 over it, 1.13\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/native_relay_client.rs"},"region":{"startLine":522}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf81c8cfeb1b50c6d608b8ba2de9c293f3a9317975974122c59705e399959b2f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SystemMessageRow.describeSystemEvent: FunctionTooLong \u2014 describeSystemEvent runs 113 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 13 over it, 1.13\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/SystemMessageRow.tsx"},"region":{"startLine":503}}}],"partialFingerprints":{"codehealthFindingId/v1":"6157b3ccff1bf17dd67ad0f05254038cdd2f715fa96e7c82f83a7184b0cf0a36"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CommunityRail.CommunityRail: FunctionTooLong \u2014 CommunityRail runs 113 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 13 over it, 1.13\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/CommunityRail.tsx"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"32cdf3b88da488a2293ed41d7a8f6cc884f6e0481d8f02341382f35c62755781"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: lib/mentionHighlightExtension.ts: FileTooLong \u2014 562 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 62 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":"desktop/src/features/messages/lib/mentionHighlightExtension.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c90701d3b2eeb97924131a8d797d22ae8318ea4045bcf24a3d5dfe2b93dbe584"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: huddle/huddle_media.dart: FileTooLong \u2014 562 significant lines (blank, comment-only and punctuation-only lines excluded), about 66% of them inside a single declaration: MethodChannelHuddleMedia (258-759). The bar is 500 significant lines; this is 62 over it, 1.12\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/huddle/huddle_media.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7d77150dfd8380e361eab12f0491dd66ae8236e648bab8728feae62b9cdf482"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: PostgresAuthorityStore: ClassTooLong \u2014 449 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), 2 methods, 3 blocks, lines 17-567. The bar is 400 significant lines; this is 49 over it, 1.12\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-push-gateway/src/postgres.rs"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"21a250b6cc79327d684bc0cbf290117d3d3c38a49bca091053af1b9041d39679"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/ProjectCards.tsx: FileTooLong \u2014 561 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 61 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":"desktop/src/features/projects/ui/ProjectCards.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0f7ad981cc9a30a2964c48b504b6ad060fc5c01523e9a9f16001fd7f6318f79"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: profile/profile_edit_page.dart: FileTooLong \u2014 561 significant lines (blank, comment-only and punctuation-only lines excluded), about 68% of them inside a single declaration: ProfileEditPage (31-513). The bar is 500 significant lines; this is 61 over it, 1.12\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/profile/profile_edit_page.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6152af6ecdd6b97b667b080748666a59fb83eb79feb4884dfbaa3911ecb06d5f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_agent::catalog::fetch_catalog_page: FunctionTooLong \u2014 buzz_agent::catalog::fetch_catalog_page runs 112 significant 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 12 over it, 1.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/catalog.rs"},"region":{"startLine":514}}}],"partialFingerprints":{"codehealthFindingId/v1":"85c19a72bebff0a6bca06e5cae7f0691e654d2c026f3055db26d2479cefc8592"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::media_proxy::handle_buzz_media: FunctionTooLong \u2014 buzz_desktop::media_proxy::handle_buzz_media runs 112 significant 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 12 over it, 1.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/media_proxy.rs"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"5706e6c8bdd414c0bce3a80057b864143cc93a8941c290813df4ebf8ae55c198"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::reset::run_boot_reset_with_keychain: FunctionTooLong \u2014 buzz_desktop::reset::run_boot_reset_with_keychain runs 112 significant 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 12 over it, 1.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/reset.rs"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"62d1069644a631efad6058128f336c8fb87b2852de31e891d635a640ca59edcb"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useCommunities.useCommunitiesInternal: FunctionTooLong \u2014 useCommunitiesInternal runs 112 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 12 over it, 1.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/communities/useCommunities.tsx"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a9be7df0d9d8955e32a5bba666ba747489b2d9187737811af353c1891a53db3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: DraftsPanel.DraftRow: FunctionTooLong \u2014 DraftRow runs 112 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 12 over it, 1.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/DraftsPanel.tsx"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"11670c547caf2e3bd744d8805cec9400be6816b18ebed80e2d234b8c4323504e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: PulseTabBar.PulseTabBar: FunctionTooLong \u2014 PulseTabBar runs 112 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 12 over it, 1.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/pulse/ui/PulseTabBar.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"46d219cc8d0e52e6bed733c0c6534e691b1a4b006a41fe11cadbabfb5ac433fa"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MessageLinkPill.MessageLinkPillContents: FunctionTooLong \u2014 MessageLinkPillContents runs 112 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 12 over it, 1.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/markdown/MessageLinkPill.tsx"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2df7d5107c2841139e35f617d7afb5d60a5557b6578c9b9a2fd27ee148619d7"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _DynamicIslandQrScannerPortal.build: MethodTooLong \u2014 build runs 112 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 12 over it, 1.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/pairing/pairing_qr_scanner/dynamic_island_portal.dart"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b3dc8908e1372acedd21dc5e13da19ba665003294fe17994b2e38357c5f7049"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: managed_agents/runtime.rs: FileTooLong \u2014 557 significant 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 57 over it, 1.11\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/runtime.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c604a519cc40f209b6f95a6c6ef1f0e508c21212523d5478568f3d7f1e3d712"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::handlers::event::dispatch_persistent_event_inner: FunctionTooLong \u2014 buzz_relay::handlers::event::dispatch_persistent_event_inner 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/buzz-relay/src/handlers/event.rs"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"de3b2af82270f9b5ca29b656cf420c08f8e38736e9d01868e4700aba8f074093"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useChannelLinks.useChannelLinks: FunctionTooLong \u2014 useChannelLinks runs 111 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 11 over it, 1.11\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useChannelLinks.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d359ae8b3eb18df609064f1c668a339e5731729e1b44e6e97a4ae33fb253247"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: submitMessageEdit.submitMessageEdit: FunctionTooLong \u2014 submitMessageEdit runs 111 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 11 over it, 1.11\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/submitMessageEdit.ts"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f906f7524ec555a401f66d9a77d6d303735a67526835783cf0aa0d54c50d522"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: HuddleSessionNotifier: ClassTooLong \u2014 443 significant lines (blank, comment-only and punctuation-only lines excluded), 23 methods. The bar is 400 significant lines; this is 43 over it, 1.11\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/huddle/huddle_session.dart"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"84d57732dd2dd7ac265c63fc827a87cb8173912c53e9555d877a623175d57304"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: GitStore: ClassTooLong \u2014 442 significant 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 170-913. The bar is 400 significant lines; this is 42 over it, 1.11\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/git/store.rs"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"59902403aaca89c40895755e2d5b4161b331f823c0d0479e47d86fd52404b4c6"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ChannelDetailsPage: ClassTooLong \u2014 442 significant lines (blank, comment-only and punctuation-only lines excluded), 2 methods. The bar is 400 significant lines; this is 42 over it, 1.11\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_details_page.dart"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd802b83d0b14425b20b938dc99dde2b800facfdd3da561f4af805957674ec93"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/EmojiBurstProvider.tsx: FileTooLong \u2014 552 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 52 over it, 1.10\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/EmojiBurstProvider.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fa4eb5dfe91347d591cf2cbc90679f3999e53f8b0383a21ecb08e0c74780a64"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: KnownAcpRuntime: TooManyFields \u2014 33 stored fields beside 1 method. 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":"desktop/src-tauri/src/managed_agents/discovery/runtime_metadata.rs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e8474279c1ea6459995d6ce18f4f6777ecefb860d599cc5969ef6637afa5fb5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: huddle/models.rs: FileTooLong \u2014 550 significant 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 50 over it, 1.10\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/huddle/models.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1c39f6268c954fe7bc5701fc5b56ecbf6483dc0e72eac3881169bf93cc6f813"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BuzzPushNotificationResolver.resolvePresentation: MethodTooLong \u2014 resolvePresentation runs 110 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 10 over it, 1.10\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushNotificationResolver.swift"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"c618e1abe300917eebe8e6f5401943fa46fbb2ee824d1dff7044562a171df8a5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ToolItem.ToolItem: FunctionTooLong \u2014 ToolItem runs 110 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 10 over it, 1.10\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentSessionToolItem/ToolItem.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"417dcd1796b10587a22f83e884e68e804a90d8b656c59bb51b6fab730fc479d5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SystemMessageRow.describeGroupedArrivals: FunctionTooLong \u2014 describeGroupedArrivals runs 110 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 10 over it, 1.10\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/SystemMessageRow.tsx"},"region":{"startLine":361}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b3124a701b581825a2c442a534ef9e62808dd7cedd346430a6c7cb8d5a7cd29"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useComposerLinkPreviews.ComposerLinkPreviewCard: FunctionTooLong \u2014 ComposerLinkPreviewCard runs 110 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 10 over it, 1.10\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useComposerLinkPreviews.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"febdb9e6b4e82db800575c00a0115b6a1652816daffd3ff2c1f1e77f93591e56"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: DeletionRequest: TooManyFields \u2014 33 stored fields. 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/buzz-db/src/store/deletion.rs"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"41aca882b03c853616c1948dd4850c41b946b8ab457323856cc1da2f64a07f4c"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ChannelManagementSheet: ClassTooLong \u2014 439 significant lines (blank, comment-only and punctuation-only lines excluded), 2 methods. The bar is 400 significant lines; this is 39 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":"desktop/src/features/channels/ui/ChannelManagementSheet.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1be0f5591fc0f15bd913c35e8d333219854b9053da0356c37eed6c0ca6fa6371"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: managed_agents/types.rs: FileTooLong \u2014 548 significant 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 48 over it, 1.10\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/types.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c967e7849f7e29975f02d54d8942c51bfe8dfc2728ca5f38e6cf58b3d219b3fb"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/MessageActionBar.tsx: FileTooLong \u2014 547 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 47 over it, 1.09\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/MessageActionBar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fa42d7ef6a280780abae14b7df1423bf397f2d01067f856686b4d3f35f96310"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: commands/pairing.rs: FileTooLong \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). The bar is 500 significant lines; this is 46 over it, 1.09\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/pairing.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0990749820e6b800273edaa6e14ffe6cb1a814052e5a793050c317250def3fb"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_db::store::relay_admin_actions::claim_report: FunctionTooLong \u2014 buzz_db::store::relay_admin_actions::claim_report runs 109 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 9 over it, 1.09\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/relay_admin_actions.rs"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b016009e77e3a82f65b414aef15bef09aa7b4c8c37efd478ae163fa2b0b9d91"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ManagedAgentRow.AgentSummary: FunctionTooLong \u2014 AgentSummary runs 109 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 9 over it, 1.09\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/ManagedAgentRow.tsx"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c47734a3bf03d957e698ad5718a9e8becfc9043c61404f1cf1e3c9b03470ee7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ForumPostCard.ForumPostCard: FunctionTooLong \u2014 ForumPostCard runs 109 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 9 over it, 1.09\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/forum/ui/ForumPostCard.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"65601acbcd9f1b40b3c585654fcfed10bc2f3dd98daea2735c92a02d46483a36"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ChannelSectionDialogs.SectionNameDialog: FunctionTooLong \u2014 SectionNameDialog runs 109 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 9 over it, 1.09\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/ChannelSectionDialogs.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c622e5199b96d43d11f6e59cc4923ea9011a21035f58bce2520b24eb3acb49b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/ProjectRepositoryActionsPanel.tsx: FileTooLong \u2014 544 significant lines (blank, comment-only and punctuation-only lines excluded), about 77% of them inside a single declaration: ProjectRepositoryActionsPanel (139-571). The bar is 500 significant lines; this is 44 over it, 1.09\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":"desktop/src/features/projects/ui/ProjectRepositoryActionsPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ae8e036049a273054e1f7dd2ab6d0ec2d2c71493a681a3869d2c82fcb8a27ea"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: channels/channels_provider.dart: FileTooLong \u2014 543 significant lines (blank, comment-only and punctuation-only lines excluded), about 94% of them inside a single declaration: ChannelsNotifier (46-856). The bar is 500 significant lines; this is 43 over it, 1.09\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":"mobile/lib/features/channels/channels_provider.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c31671baf39097cac1327564130f3cf940ba26b3e019bd005c082dbf4ad4e6f0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/agentConfigControls.tsx: FileTooLong \u2014 541 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 41 over it, 1.08\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/agentConfigControls.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d75a348fae556ccf1270694c6e63909efddb0cb00dcdc02f1c3b6a8bfcba8838"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::handlers::command_executor::handle_workflow_def: FunctionTooLong \u2014 buzz_relay::handlers::command_executor::handle_workflow_def 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/buzz-relay/src/handlers/command_executor.rs"},"region":{"startLine":641}}}],"partialFingerprints":{"codehealthFindingId/v1":"af338993bf93f4fc3c6caf025bdb2236456b9589c373a52ecaa445526e71b0c2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: UnifiedAgentsSection.AgentPersonaCard: FunctionTooLong \u2014 AgentPersonaCard runs 108 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 8 over it, 1.08\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/UnifiedAgentsSection.tsx"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"9828ac3343ebc273e3739b7f93c6d75491b7e0f83218cda6a8d00453fedad869"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: DiffMessage.DiffMessage: FunctionTooLong \u2014 DiffMessage runs 108 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 8 over it, 1.08\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/DiffMessage.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea30ba7085c0b755a9a5431b52bad0b7e2488123eb48e0510c132b1b8c609d9d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ChannelTemplatesSettingsCard.ChannelTemplatesSettingsCard: FunctionTooLong \u2014 ChannelTemplatesSettingsCard runs 108 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 8 over it, 1.08\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/ChannelTemplatesSettingsCard.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e85062cd37e67da50f4d6960f7ea735a17680c1a37513b2e3bbf606ba459a79"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _CustomSectionHeader.build: MethodTooLong \u2014 build runs 108 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 8 over it, 1.08\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channels_page/sections.dart"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"8eee3c75d9a21c05993db7ee154c18bc8aa1a5238063614ec0a9c2ce54f69ba7"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: MessageContent._buildLink: MethodTooLong \u2014 _buildLink runs 108 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 8 over it, 1.08\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/message_content.dart"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"df7e27d264ddae32bdb8b342bcd403fa8899f36217c0582c8dc7d9d0e6a3bc86"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AgentActivityCard.build: MethodTooLong \u2014 build runs 108 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 8 over it, 1.08\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/pulse/agent_activity_card.dart"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b1a4ea4ffa999ed083eb439eaa268f1547fa37840e7be6bb540723c9d500459"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ReadStateManager: ClassTooLong \u2014 431 significant lines (blank, comment-only and punctuation-only lines excluded), 32 methods. The bar is 400 significant lines; this is 31 over it, 1.08\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":"desktop/src/features/channels/readState/readStateManager.ts"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"674d2b4805f4c050077d3554616cd02e66530207329ef195f8d31e06ae26a8d3"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: channels_page/sections.dart: FileTooLong \u2014 538 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 38 over it, 1.08\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channels_page/sections.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"81b01492585e8b15bc3d44def4cfa963901e0cd70ad6ac20a07251474bc8ebe6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/UserProfilePopover.tsx: FileTooLong \u2014 536 significant lines (blank, comment-only and punctuation-only lines excluded), about 61% of them inside a single declaration: UserProfilePopoverBody (257-628). The bar is 500 significant lines; this is 36 over it, 1.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":"desktop/src/features/profile/ui/UserProfilePopover.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"35d84358b52ce982b4a1198a009a7470b5b7af7e31064e4d2b3ff2489ceced9e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/lib.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), about 65% of them inside a single declaration: WorkflowEngine (2 blocks, 75-750). The bar is 500 significant lines; this is 35 over it, 1.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/buzz-workflow/src/lib.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e586be840be6fb76f794d3433c4cc976d34f4dd64c8717d50e31a504050b95f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/ProjectsActivityFeed.tsx: FileTooLong \u2014 535 significant lines (blank, comment-only and punctuation-only lines excluded). 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":"desktop/src/features/projects/ui/ProjectsActivityFeed.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7931bf24202e4b8928cc890f14c001f5a1124da852407391bb1352c526018ba"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SystemMessageAvatars.SystemMessageAvatar: FunctionTooLong \u2014 SystemMessageAvatar runs 107 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 7 over it, 1.07\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/SystemMessageAvatars.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"799e94041e3e9c9ae6ed6e63ed97ae65c6822fc03d5186062133b50a565cb27a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AvatarStep.AvatarStepActions: FunctionTooLong \u2014 AvatarStepActions runs 107 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 7 over it, 1.07\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/AvatarStep.tsx"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c23f5fc43c6f9b714433ec364ffaa8007b8896f116e9fd43dabe26b6dfa7480"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SetupStep.RuntimeSetupGuide: FunctionTooLong \u2014 RuntimeSetupGuide runs 107 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 7 over it, 1.07\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/SetupStep.tsx"},"region":{"startLine":842}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fc7f5e64665fcef70b6c86d734aaea2b008466a72a3bfee66e01d58119cbc01"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: rich-link-preview-attachment.RichLinkPreviewAttachment: FunctionTooLong \u2014 RichLinkPreviewAttachment runs 107 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 7 over it, 1.07\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/rich-link-preview-attachment.tsx"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d97c29db6204cacbd52cfea82d1fef280ff550b2bb6f296f9f35685f56365d0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/private_managed_agent.rs: FileTooLong \u2014 534 significant 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 34 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/buzz-core/src/private_managed_agent.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0656770a02c2b617d8a0554497809d62f47b2776420d8e2480d397573f9a0145"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: api/projectGit.ts: FileTooLong \u2014 534 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 34 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":"desktop/src/shared/api/projectGit.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f76c1e813fab133c02be5458993efb398390108bd62ca5550d3d77895d16176"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: EventQueue: ClassTooLong \u2014 427 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), 23 methods, 3 blocks, lines 199-1059. The bar is 400 significant lines; this is 27 over it, 1.07\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/queue.rs"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c9e2a8b8330d47816f139311a68cf82fbc2d4a6088b25c399ed62d544bcfc28"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ReadStateManager: TooManyMethods \u2014 32 methods. The bar is 30 methods; this is 2 over it, 1.07\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/readState/readStateManager.ts"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"1800bcfb4ba47ec0b4bfe6ef20ed6191177f6fb8f3333b33ec4d49cdf8335d02"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: AppState: TooManyFields \u2014 32 stored fields beside 14 methods. The bar is 30 stored fields; this is 2 over it, 1.07\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":"desktop/src-tauri/src/app_state.rs"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"b39e8eaedac341efd13b421131a124eb45855ab9ab4f91178dfc9f88d72ed637"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: commands/agent_models.rs: FileTooLong \u2014 533 significant 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 33 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":"desktop/src-tauri/src/commands/agent_models.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"393d223b3337026a93f79a9284723e17f15240a56ade116421c8fb71f55aeb66"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/MeshComputeSettingsCard.tsx: FileTooLong \u2014 533 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 33 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":"desktop/src/features/mesh-compute/ui/MeshComputeSettingsCard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e43d995fc23e77b44a3e4946699ed654a383cdae861a3f4e3629a538d002829"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::api::invites::claim_invite: FunctionTooLong \u2014 buzz_relay::api::invites::claim_invite 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/buzz-relay/src/api/invites.rs"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"c65d71245d0812dede247a2b32540d258fb7758681df4442f03c835ebb260a78"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: DiffViewer.DiffViewer: FunctionTooLong \u2014 DiffViewer runs 106 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 6 over it, 1.06\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/DiffViewer.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1c8909f69e9733fed7c7ce947d271a7b8b40bfe6ddf5faa8dabc37d8e618270"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: DefaultConfigStep.DefaultConfigStep: FunctionTooLong \u2014 DefaultConfigStep runs 106 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 6 over it, 1.06\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/DefaultConfigStep.tsx"},"region":{"startLine":342}}}],"partialFingerprints":{"codehealthFindingId/v1":"35146c57cd75f5f22e7267a618f5ee783a6d79ab8f97e62a2fba385cae33ad10"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MaskedAvatarBadgeFrame.getRoundedAvatarCapsuleMaskPolygon: FunctionTooLong \u2014 getRoundedAvatarCapsuleMaskPolygon runs 106 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 6 over it, 1.06\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/MaskedAvatarBadgeFrame.tsx"},"region":{"startLine":434}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7e3dc8abf0cd2205b6e323c88f0df427019b608d984b156bc063e02573b3db2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MaskedAvatarBadgeFrame.MaskedAvatarBadgeFrame: FunctionTooLong \u2014 MaskedAvatarBadgeFrame runs 106 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 6 over it, 1.06\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/MaskedAvatarBadgeFrame.tsx"},"region":{"startLine":751}}}],"partialFingerprints":{"codehealthFindingId/v1":"02f57266a1551e9c0ba3203225370cf4247a735a9e5b73b0d174856305af39ad"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _HuddleParticipantRoster.build: MethodTooLong \u2014 build runs 106 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 6 over it, 1.06\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_detail_page/huddle_participant_overlay.dart"},"region":{"startLine":255}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fc31a9d4345760126ad11d5c215a2128c4d3f219849f454099b99ca178548e0"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _EmojiPickerContent.build: MethodTooLong \u2014 build runs 106 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 6 over it, 1.06\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/emoji_picker.dart"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd485ad6c4681a204d9e6827425fe6e8c244bc51f2d5195a9d92b0814dfc3f09"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: commands/project_git_workflow.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). The bar is 500 significant lines; this is 29 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":"desktop/src-tauri/src/commands/project_git_workflow.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cd93675c377ff3c590cdae98a749b7965ba3b4b0fcf6462b9d957960ee8b7a0"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: VideoPlayer: ClassTooLong \u2014 420 significant lines (blank, comment-only and punctuation-only lines excluded), 18 methods. The bar is 400 significant lines; this is 20 over it, 1.05\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/VideoPlayer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a806b0dd491e7bca1333bc4a9566446bd88432122dafa879418029e86c0a9bb"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: commands/issues.rs: FileTooLong \u2014 525 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 25 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/buzz-cli/src/commands/issues.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7a8af138d7984c9100085ca1d38f4bd7d9055032c6b49af00a33ef03a4c0e6f"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: HuddleAudioEngine.runCapture: MethodTooLong \u2014 runCapture runs 105 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"mobile/android/app/src/main/kotlin/xyz/block/buzz/mobile/HuddleAudioEngine.kt"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"a61fc18df74d95154d63cf4dc674326749bae88e087a184770dda54530b82be1"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Db.replace_addressable_event: MethodTooLong \u2014 replace_addressable_event 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/buzz-db/src/store/replaceable.rs"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"722acc5daa7b300cfa35bcadf82ba26db3e42a723e1b17c40de36bf210bc4adb"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::handlers::report_resolution::run_atomic_mutation: FunctionTooLong \u2014 buzz_relay::handlers::report_resolution::run_atomic_mutation 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/buzz-relay/src/handlers/report_resolution.rs"},"region":{"startLine":734}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdf083647a4cbdcca858f3d302347054b54851f6b1be1d9740452fdfd1ef6e07"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: HomeLoadingState.HomeLoadingState: FunctionTooLong \u2014 HomeLoadingState runs 105 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/home/ui/HomeLoadingState.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b595a7e6ee9f141534d01ef6397e6dd4f27b5e0079c25d4ec939519986c30ca"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useHomeInboxReadState.useHomeInboxReadState: FunctionTooLong \u2014 useHomeInboxReadState runs 105 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/home/useHomeInboxReadState.ts"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9dc08817b803d7d8e3873d7d0b7a023b2dc128b1957fb6a43920510788a681b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MessageReactions.MessageReactions: FunctionTooLong \u2014 MessageReactions runs 105 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/messages/ui/MessageReactions.tsx"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"186100e29b9411fdb0bcae4922425fa3257d41596f70851688681e73d9b823bc"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectSelectableGroup.ProjectSelectableGroup: FunctionTooLong \u2014 ProjectSelectableGroup runs 105 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/projects/ui/ProjectSelectableGroup.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"c548ecf4d302f6fbae8492d11dbc200f8cec52823a0b705de5aab388df76241a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: EncryptedBackupCreator.EncryptedBackupCreator: FunctionTooLong \u2014 EncryptedBackupCreator runs 105 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/features/settings/ui/EncryptedBackupCreator.tsx"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"2509439fa32bd0cdeb1da08fe155f97b0f59edb05bccea113dcd45383317e634"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: BloomMenu.Container: FunctionTooLong \u2014 Container runs 105 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/protectedFeatures/bestie/BloomMenu.tsx"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"b308c725e14f2baf5193dbf124495b242cf140d6aa2737af9a8fcd271a22953e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SpoilerInline.SpoilerInline: FunctionTooLong \u2014 SpoilerInline runs 105 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"desktop/src/shared/ui/markdown/SpoilerInline.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b8d84043b5424fd4e0f4d72103647c1d0500080d023773983f908b3ff2d9eec"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: InviteJoinSheet.build: MethodTooLong \u2014 build runs 105 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"mobile/lib/features/invites/invite_join_sheet.dart"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"84d1152a336d10405b047c653d10cc7c2c76c4b6cf3d58fc1c0841050eafd2cb"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: api/operator.rs: FileTooLong \u2014 524 significant 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 24 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/buzz-relay/src/api/operator.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca69a6ae06dd6e37e2b5dabfc56abe84769349892c66a9bb7bb49955428bcecd"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ChannelBrowserDialog: ClassTooLong \u2014 418 significant lines (blank, comment-only and punctuation-only lines excluded), 5 methods. The bar is 400 significant lines; this is 18 over it, 1.05\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/ChannelBrowserDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"515dab749fcefb511f236774f7f6ba0d8950e3327fa22311b1a9be82b05bae28"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ProjectRepositoryActionsPanel: ClassTooLong \u2014 418 significant lines (blank, comment-only and punctuation-only lines excluded), 3 methods. The bar is 400 significant lines; this is 18 over it, 1.05\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectRepositoryActionsPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b15cd93d4688a1755d52d570e46317f49b7ef3fba6bef0c6974f4bf87b43086"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: agents/observerRelayStore.ts: FileTooLong \u2014 522 significant lines (blank, comment-only and punctuation-only lines excluded). 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":"desktop/src/features/agents/observerRelayStore.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"256e17b2adbd4d795ff5dff2bddb61a79efa5059b3e693b49aad5cef6627c75f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/LocalArchiveSettingsCard.tsx: FileTooLong \u2014 522 significant lines (blank, comment-only and punctuation-only lines excluded). 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":"desktop/src/features/local-archive/ui/LocalArchiveSettingsCard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcdc84a249aa362fddae4dc4162e4ec914e117605cad8ed91f8f41a0a2ee6703"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: profile/image_avatar_capture.dart: FileTooLong \u2014 522 significant lines (blank, comment-only and punctuation-only lines excluded), about 89% of them inside a single declaration: ImageAvatarCapture (48-632). The bar is 500 significant lines; this is 22 over it, 1.04\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/profile/image_avatar_capture.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a723e7bdb90b04d62014b9aefc9a138580d83d2cc73872db544401732c128c73"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: useRichTextEditor: ClassTooLong \u2014 417 significant lines (blank, comment-only and punctuation-only lines excluded), 2 methods. The bar is 400 significant lines; this is 17 over it, 1.04\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useRichTextEditor.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ffa422206747a1678c1782fe775e614bcc2b929fda1e3a2945754ee041db732"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: BuzzPushKit/BuzzPushNotificationResolver.swift: FileTooLong \u2014 521 significant lines (blank, comment-only and punctuation-only lines excluded), about 89% of them inside a single declaration: BuzzPushNotificationResolver (52-631). The bar is 500 significant lines; this is 21 over it, 1.04\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushNotificationResolver.swift"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"143f57323f8d73caf703a4db815c83b6103e57a330b834bd645dce52f3009962"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: channels/useObservedUnreadPersistence.ts: FileTooLong \u2014 521 significant lines (blank, comment-only and punctuation-only lines excluded), about 87% of them inside a single declaration: useObservedUnreadPersistence (78-683). The bar is 500 significant lines; this is 21 over it, 1.04\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/useObservedUnreadPersistence.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0035d703b394fa1e5c2b39ac0acab7f691e0ac925df1ffbfc873073b12af17e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: huddle/mod.rs: FileTooLong \u2014 520 significant 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 20 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":"desktop/src-tauri/src/huddle/mod.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff6b6de0c65107af6292edc68dd8646c9a2066e03a8d5b4b59709c05bc3577b8"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AppDelegate.handleMediaUploadMethodCall: MethodTooLong \u2014 handleMediaUploadMethodCall runs 104 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 4 over it, 1.04\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/AppDelegate.swift"},"region":{"startLine":649}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bf1b93899f01b9d86aa32b31a184b4e8891de9a539704bce2d2aa4e551b03f7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_admin::reconcile_channels: FunctionTooLong \u2014 buzz_admin::reconcile_channels runs 104 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 4 over it, 1.04\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-admin/src/main.rs"},"region":{"startLine":623}}}],"partialFingerprints":{"codehealthFindingId/v1":"9636cf0f32576f2fcc7665dd09fe9d7c5925789b2164377af3880cba608fbf43"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::handlers::event::handle_agent_observer_event: FunctionTooLong \u2014 buzz_relay::handlers::event::handle_agent_observer_event runs 104 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 4 over it, 1.04\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/event.rs"},"region":{"startLine":1005}}}],"partialFingerprints":{"codehealthFindingId/v1":"b771ffaba27918c295e955fbeef53f3594512f7dcc78189cde2993554d361d51"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectIssuesPanel.IssueRow: FunctionTooLong \u2014 IssueRow runs 104 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 4 over it, 1.04\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectIssuesPanel.tsx"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"16cd5f3230afa984eb75a440703140b33ab2ab5475f71fedf44ecbe372439e5a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useNoteActions.usePulseNoteActions: FunctionTooLong \u2014 usePulseNoteActions runs 104 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 4 over it, 1.04\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/pulse/lib/useNoteActions.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"203366d5177934279b366061f48a1c9c28e5b5f833fae880e5c65784891081bd"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useDmSidebarMetadata.useDmSidebarMetadata: FunctionTooLong \u2014 useDmSidebarMetadata runs 104 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 4 over it, 1.04\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/useDmSidebarMetadata.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f11207338e366ab3caa07ac3e873a6430c1af148f0dcc0c01167168ae37b128"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: config-nudge-attachment.RequirementRow: FunctionTooLong \u2014 RequirementRow runs 104 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 4 over it, 1.04\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/config-nudge-attachment.tsx"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"4458a941d918cb81f1857deeb3fbdc64a7b52c946dd40fc963ca059b7c8df8c9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ReposPage.ReposPage: FunctionTooLong \u2014 ReposPage runs 104 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 4 over it, 1.04\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/features/repos/ui/ReposPage.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce9bd9704a73e4a4ebdd4b54ac8fb590f7cf53e22db04498e2afd744dfdd1dd2"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: usePersonaActions: ClassTooLong \u2014 414 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 14 over it, 1.04\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/usePersonaActions.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"de65eb43a2f2fcc275f3bbc87023d24cc133e7ce0e5e1361776866f4066c43a3"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MediaUploadService: TooManyMethods \u2014 31 methods. The bar is 30 methods; this is 1 over it, 1.03\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/relay/media_upload.dart"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"5067ef3bfc12b3e02789470890fa5d757a1edf4a93493d50e6109211b361cd58"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: DeletionStore.abort: MethodTooLong \u2014 abort runs 103 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 3 over it, 1.03\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/deletion.rs"},"region":{"startLine":2212}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3ba69386fd55408aec67589e0cc78c3b43348a61134b981587b422df8aef714"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_push_gateway::main: FunctionTooLong \u2014 buzz_push_gateway::main runs 103 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 3 over it, 1.03\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-push-gateway/src/main.rs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"332bb9fe80044afa9dc0ad46f2629797ade6ebbbccca4dcf656dc1a33030fa5c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_desktop::commands::messages::send_channel_message: FunctionTooLong \u2014 buzz_desktop::commands::messages::send_channel_message runs 103 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 3 over it, 1.03\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/messages.rs"},"region":{"startLine":409}}}],"partialFingerprints":{"codehealthFindingId/v1":"c86acf07951ab8be5ef28bbc2320850ec68315115da7b0ee21e0c508e6931057"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: use-feed-desktop-notifications.useFeedDesktopNotifications: FunctionTooLong \u2014 useFeedDesktopNotifications runs 103 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 3 over it, 1.03\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/notifications/use-feed-desktop-notifications.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cd9c669fc9b8c8fee6e06ce1a00411fe305ecc1ce3a0f23187ddb3e2c99e080"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectConversationPanelContext.ProjectConversationPanelController: FunctionTooLong \u2014 ProjectConversationPanelController runs 103 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 3 over it, 1.03\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectConversationPanelContext.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"30aac8741683bb9256d2c1c5cc866bdd5840240eb9f7ad078f97b8aa1682264f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectHomeCodebasePanel.ProjectHomeCodebasePanel: FunctionTooLong \u2014 ProjectHomeCodebasePanel runs 103 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 3 over it, 1.03\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectHomeCodebasePanel.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a30bacc4731366f66b9d66288a27906ef7d59f965d091639098796c798659ab"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CodeBlock.SyntaxHighlightedCode: FunctionTooLong \u2014 SyntaxHighlightedCode runs 103 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 3 over it, 1.03\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/markdown/CodeBlock.tsx"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"145896b3e09e67614d0ef61b999923e938b1685a220aadec28d5bb2d302f68be"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _ToolItemWidget.build: MethodTooLong \u2014 build runs 103 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 3 over it, 1.03\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/agent_activity/transcript_item_widget.dart"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"1aeacb3c61958bb8af5cc5de57dd751ed3215099b8a680b78bcbc51428f66ff4"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: CommunityCatalogDialog: ClassTooLong \u2014 411 significant lines (blank, comment-only and punctuation-only lines excluded), 13 methods. The bar is 400 significant lines; this is 11 over it, 1.03\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/CommunityCatalogDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"de9302c2e215c78d39755aaac7baf6fbfcdc3994fb6952e9a5e3bc373325d76c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: nip_fi/verifier.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). The bar is 500 significant lines; this is 13 over it, 1.03\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-auth/src/nip_fi/verifier.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ac0a5343b09e19e5751668046a440d0e08ebe4792aea05fd2131cd608981cc6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/app_state.rs: FileTooLong \u2014 510 significant 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 10 over it, 1.02\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/app_state.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f7e24c8442029057c4795ecb82ad813c355e4775f96618256caf3b8998fa2a8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_cli::commands::mem::cmd_patch: FunctionTooLong \u2014 buzz_cli::commands::mem::cmd_patch 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/buzz-cli/src/commands/mem.rs"},"region":{"startLine":538}}}],"partialFingerprints":{"codehealthFindingId/v1":"a97aea82a48a7d00379535dba2c45e928e39c3c0e5fe23fd9be93739d4b5d5fa"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_cli::commands::pr::dispatch: FunctionTooLong \u2014 buzz_cli::commands::pr::dispatch 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/buzz-cli/src/commands/pr.rs"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3f3e59159e000ac6b1b983ce9f072107559edb5ce21dba0b80af0510ab6fcaa"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::api::media::serve_blob_for_tenant: FunctionTooLong \u2014 buzz_relay::api::media::serve_blob_for_tenant 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/buzz-relay/src/api/media.rs"},"region":{"startLine":822}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf615a57bfbde42f3844c02c6ad277488619ad9d70af86da37ba6cab1250faf5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: hooks.useChannelSubscription: FunctionTooLong \u2014 useChannelSubscription runs 102 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 2 over it, 1.02\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/hooks.ts"},"region":{"startLine":318}}}],"partialFingerprints":{"codehealthFindingId/v1":"471ff2f800c332bbf4064d3a90763ff4009b85d459f4e510eaf49494626f2728"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SidebarProjectsSection.SidebarProjectsHeaderActions: FunctionTooLong \u2014 SidebarProjectsHeaderActions runs 102 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 2 over it, 1.02\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/SidebarProjectsSection.tsx"},"region":{"startLine":452}}}],"partialFingerprints":{"codehealthFindingId/v1":"e67726eeaabe000c913c84a4732d1169969f41542d7171ca390535fdf5fbdb5c"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: _HuddleCallParticipants.build: MethodTooLong \u2014 build runs 102 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 2 over it, 1.02\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_detail_page/huddle_call_participants.dart"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7d88a20658358fef6a122ea2edc9a76a1a41904012ad7ff17ecf7e97e49a1de"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: channels/media_viewer_page.dart: FileTooLong \u2014 507 significant lines (blank, comment-only and punctuation-only lines excluded), about 71% of them inside a single declaration: MediaImageViewerPage (170-665). 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":"mobile/lib/features/channels/media_viewer_page.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f125d9c8dde31a9a18218f4dea10eb49185ec5dfa0ac3e3d07ccdc8fd4d7f317"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: store/reaction.rs: FileTooLong \u2014 506 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 6 over it, 1.01\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/reaction.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"327a041fcee39c55a344dec8892bf5efcad2cf5b8ee230d4ced7b34e9c6d37cd"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AudioMessageAttachment: ClassTooLong \u2014 404 significant lines (blank, comment-only and punctuation-only lines excluded), 8 methods. The bar is 400 significant lines; this is 4 over it, 1.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":"desktop/src/features/messages/ui/AudioMessageAttachment.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8c402f0b23734b722036c221b263f3181b0804ea703a26370d14808111e0f17"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: commands/mesh_llm.rs: FileTooLong \u2014 505 significant 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 32 free functions. The bar is 500 significant lines; this is 5 over it, 1.01\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/mesh_llm.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"efe8f0922f7011d8204bab5393b33e54962caaf15f7f7fe407284b43a7456455"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_acp::queue::format_prompt: FunctionTooLong \u2014 buzz_acp::queue::format_prompt runs 101 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 1 over it, 1.01\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/queue.rs"},"region":{"startLine":1993}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e9029023f16392ca5d657349e631330734d96cf8b3ce49919cd567c56eb0326"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::api::git::transport::info_refs_subprocess: FunctionTooLong \u2014 buzz_relay::api::git::transport::info_refs_subprocess runs 101 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 1 over it, 1.01\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/git/transport.rs"},"region":{"startLine":906}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9421b7607ae62f1e373c4056aa1ef3071e651a122313c7e6e4b696f75f453b3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buzz_relay::api::git::transport::run_git_at: FunctionTooLong \u2014 buzz_relay::api::git::transport::run_git_at runs 101 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 1 over it, 1.01\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/git/transport.rs"},"region":{"startLine":1330}}}],"partialFingerprints":{"codehealthFindingId/v1":"57c5a7ea80bd1a853b1e18bfad3d46cc825a64a796febf8216136d6a8d6d903b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AdminConsoleReportsTab.ReportFields: FunctionTooLong \u2014 ReportFields runs 101 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 1 over it, 1.01\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/AdminConsoleReportsTab.tsx"},"region":{"startLine":762}}}],"partialFingerprints":{"codehealthFindingId/v1":"7437903a3eeb3d232de0eac7158153104761291b03bc9b04be5ff696aa3c0c02"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectsOverviewPanel.ProjectsOverviewContextPanel: FunctionTooLong \u2014 ProjectsOverviewContextPanel runs 101 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 1 over it, 1.01\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectsOverviewPanel.tsx"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"efe432702e409b36632b3d3febb8e43203c36150162d344edecdad1414d1fe81"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: git/store.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 88% of them inside a single declaration: GitStore (2 blocks, 170-913). 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/buzz-relay/src/api/git/store.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d79ad4d3a131e3d63012ad99bffb96f6ac540f1e216016f4a1087b5e8c02768"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: snapshot/import.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). The bar is 500 significant lines; this is 4 over it, 1.01\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/personas/snapshot/import.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf19a6ba6ea5540bc7af2f7e9cafdc662c29ecbbc8c89191d7e6d0be857cc471"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: HuddleMediaPlugin: ClassTooLong \u2014 403 significant lines (blank, comment-only and punctuation-only lines excluded), 17 methods. The bar is 400 significant lines; this is 3 over it, 1.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":"mobile/ios/Runner/HuddleMediaPlugin.swift"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dd7b96bd83b50c5ddb690c419a6c0df36f28476640e139c25d8f3c8232c78eb"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: archive/agent_usage.rs: FileTooLong \u2014 503 significant 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 3 over it, 1.01\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/archive/agent_usage.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"df20c1d3bafea847e05106e26a4102ade1736b62b5dd8c5d7e21c7baa7e1a7ec"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: HuddleAudioEngine: ClassTooLong \u2014 402 significant lines (blank, comment-only and punctuation-only lines excluded), 24 methods. The bar is 400 significant lines; this is 2 over it, 1.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":"mobile/ios/Runner/HuddleAudioEngine.swift"},"region":{"startLine":411}}}],"partialFingerprints":{"codehealthFindingId/v1":"002c00f41255aabd88f3a0860b23b194e031d5e20453de98d069aebfa097ef30"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: huddle/tts_settings.rs: FileTooLong \u2014 502 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), declaring 32 free functions. The bar is 500 significant lines; this is 2 over it, 1.00\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/huddle/tts_settings.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"af39e3010e0bb8d95b80d37e58e06154c9484136d21b284bbdffb9622a865974"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/workflowFormTypes.ts: FileTooLong \u2014 502 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 2 over it, 1.00\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/workflowFormTypes.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"055934813f67ab782f0ac086ec56a04b6e17dfe233ac028f4fcf9a71e4ee1e00"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member family (3 members, 45 shared lines): mobile/lib/features/profile/profile_edit_page.dart:649-719 | mobile/lib/features/profile/profile_text_edit_sheet.dart:39-164 | mobile/lib/features/profile/profile_text_editor.dart:162-232 \u2014 These 3 members are variants of one another: a block of 45 lines reported below appears in every one of them, and the pairwise near-duplicate rows they would otherwise produce are collapsed into this row. Read them as one construct written 3 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/profile/profile_edit_page.dart"},"region":{"startLine":649}}}],"partialFingerprints":{"codehealthFindingId/v1":"f245b6f2e126e050716dfe63f76a9cd4bfa0c0dca763c5f9d2083b89ceef588f"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member family (3 members, 12 shared lines): desktop/src-tauri/src/archive/store_migrations.rs:42-128 | desktop/src-tauri/src/archive/store_migrations.rs:191-251 | desktop/src-tauri/src/archive/store_migrations.rs:265-327 \u2014 These 3 members are variants of one another: a block of 12 lines reported below appears in every one of them, and the pairwise near-duplicate rows they would otherwise produce are collapsed into this row. Read them as one construct written 3 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/archive/store_migrations.rs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b3a51550898e982463ae617111cb9da53c22b4895c825309bcd66c5c9e540b2"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (180 shared lines): mobile/lib/features/channels/channel_detail_page/message_bubble.dart:30-319 | mobile/lib/features/channels/thread_detail_page/thread_message.dart:35-316 \u2014 These two members are variants of one another: 180 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_detail_page/message_bubble.dart"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"24abc7dc1ac79d353701a87d3c0019ade3239833bcf762dd1c48f1cc1578b046"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (108 shared lines): crates/buzz-db/src/store/event.rs:477-722 | crates/buzz-db/src/store/event.rs:782-927 \u2014 These two members are variants of one another: 108 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/event.rs"},"region":{"startLine":477}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cb840e4ee9494cf7234825751514e272c5ff192cc95c48ecbf8e9330a39c2f9"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (78 shared lines): crates/buzz-voice/src/pocket_april.rs:482-623 | crates/buzz-voice/src/pocket_april.rs:825-918 \u2014 These two members are variants of one another: 78 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-voice/src/pocket_april.rs"},"region":{"startLine":482}}}],"partialFingerprints":{"codehealthFindingId/v1":"93cb9ba79e4cd74e167b9e90ddc43564e166f1ee22b558f22437616ad8334784"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (48 shared lines): crates/buzz-agent/src/llm.rs:1871-2067 | crates/buzz-agent/src/llm.rs:2264-2497 \u2014 These two members are variants of one another: 48 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/llm.rs"},"region":{"startLine":1871}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd601ee5931cb6caec3ec0cd8e590682acf492e6cb9405321a90971884ff9d9b"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (40 shared lines): crates/buzz-acp/src/relay.rs:3715-3804 | crates/buzz-ws-client/src/message.rs:62-167 \u2014 These two members are variants of one another: 40 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/relay.rs"},"region":{"startLine":3715}}}],"partialFingerprints":{"codehealthFindingId/v1":"f03bb8be78e60890436dcb0f33193cf72f3bb0cebbb641d56a4bd781137aef0d"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (38 shared lines): desktop/src-tauri/src/archive/store.rs:608-689 | desktop/src-tauri/src/archive/store.rs:784-840 \u2014 These two members are variants of one another: 38 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/archive/store.rs"},"region":{"startLine":608}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ddb9677fa2a914602949fd54d3e6be77e419d65d18294e65c6ec291c9a14113"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (27 shared lines): crates/buzz-relay/src/handlers/ingest.rs:1215-1289 | crates/buzz-relay/src/handlers/ingest.rs:1296-1341 \u2014 These two members are variants of one another: 27 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":1215}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcf57001a13a70f00408747042b6b02f477f3045f3ef88e481b3748e8a7715c8"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (25 shared lines): crates/buzz-acp/src/filter.rs:264-334 | crates/buzz-workflow/src/executor.rs:232-328 \u2014 These two members are variants of one another: 25 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/filter.rs"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9a20003fc8471d140174574049f827dbab70b82296346ad85a1b518c30dba60"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (25 shared lines): crates/buzz-voice/src/pocket_april.rs:631-667 | crates/buzz-voice/src/pocket_april.rs:920-958 \u2014 These two members are variants of one another: 25 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-voice/src/pocket_april.rs"},"region":{"startLine":631}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d78102f13c098851ffd0a257c356c0400f329b99eb2422d3827ffe9554ae0e0"}},{"ruleId":"D4","level":"warning","message":{"text":"Edited copy of a member (19 corresponding lines): crates/buzz-sdk/src/builders.rs:749-768 | desktop/src-tauri/src/events.rs:448-467 \u2014 These two members are one piece of code written twice and then edited apart: 19 consecutive lines correspond almost exactly, broken only by small local edits. Most of that correspondence is NOT reported as duplicated blocks below \u2014 the edits cut it into fragments and only the largest of them clear the block floor, so the rows below understate it. The repair is at the members\u0027 grain \u2014 factor the shared implementation into one the two call with their differences as parameters or as an injected step, or, where the difference is systematic (an extra return value, one transport against another), generate one from the other. Left alone, the next edit has to be made twice and the two will drift further apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-sdk/src/builders.rs"},"region":{"startLine":749}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dede1448d5909ceb39cdb622d30199dbacf1d16128b8d9e0b79491860fd4bfe"}},{"ruleId":"D4","level":"warning","message":{"text":"Edited copy of a member (33 corresponding lines): crates/buzz-db/src/store/event.rs:1851-1890 | crates/buzz-db/src/store/event.rs:1905-1941 \u2014 These two members are one piece of code written twice and then edited apart: 33 consecutive lines correspond almost exactly, broken only by small local edits. Most of that correspondence is NOT reported as duplicated blocks below \u2014 the edits cut it into fragments and only the largest of them clear the block floor, so the rows below understate it. The repair is at the members\u0027 grain \u2014 factor the shared implementation into one the two call with their differences as parameters or as an injected step, or, where the difference is systematic (an extra return value, one transport against another), generate one from the other. Left alone, the next edit has to be made twice and the two will drift further apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/event.rs"},"region":{"startLine":1851}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcc1f15cd0eded763565d0bb882fc7d8564ade0ca023c2d53cf56d0637889671"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (6 members, 50\u002B identical tokens): crates/buzz-relay/src/handlers/command_executor.rs:302-429 | crates/buzz-relay/src/handlers/command_executor.rs:436-566 | crates/buzz-relay/src/handlers/command_executor.rs:573-639 | crates/buzz-relay/src/handlers/command_executor.rs:646-813 | crates/buzz-relay/src/handlers/command_executor.rs:1025-1130 | crates/buzz-relay/src/handlers/command_executor.rs:1137-1270 \u2014 These 6 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 6 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 6 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/command_executor.rs"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3cbaea792b25ee14f3356088f8102e01c71ff27292ecf8f8ac2bfcd935a93dd"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): desktop/src-tauri/src/commands/agent_config.rs:260-329 | desktop/src-tauri/src/commands/agent_models.rs:40-155 | desktop/src-tauri/src/commands/agent_models_update.rs:147-472 | desktop/src-tauri/src/commands/agents.rs:345-822 | desktop/src-tauri/src/commands/agents.rs:833-1008 \u2014 These 5 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 5 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 5 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/agent_config.rs"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"11773dc0a565df1aa2dcbc3e6ea81dc61c6a8a3ddaa82df0f213c79cfd99735a"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:54-75 | mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:79-102 | mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:106-128 | mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:132-152 | mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:156-176 \u2014 These 5 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 5 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 5 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"2762b07d96c966adeb9a64fcdfeb40342fc15c77d97f0bb2587b819e47c3c395"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): mobile/lib/shared/widgets/ios_glass_navigation_action.dart:43-107 | mobile/lib/shared/widgets/ios_glass_navigation_button.dart:106-316 | mobile/lib/shared/widgets/ios_glass_theme_pagination.dart:31-95 | mobile/lib/shared/widgets/ios_native_segmented_control.dart:35-85 | mobile/lib/shared/widgets/ios_native_skin_tone_control.dart:35-77 \u2014 These 5 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 5 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 5 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/widgets/ios_glass_navigation_action.dart"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ab2badbb1840dd8ce2f45e8656f2a1d8780f01b1312d5bf3158c79b167a82e6"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): crates/buzz-acp/src/relay.rs:1746-2166 | crates/buzz-acp/src/relay.rs:2183-2564 | crates/buzz-acp/src/relay.rs:2675-2785 | crates/buzz-acp/src/relay/recovery.rs:21-60 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/relay.rs"},"region":{"startLine":1746}}}],"partialFingerprints":{"codehealthFindingId/v1":"7897f2736dd02f3e5076af5924371d9e08f6c5befb553067754c76d69546621f"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): crates/buzz-cli/src/client.rs:789-814 | crates/buzz-cli/src/client.rs:819-844 | crates/buzz-cli/src/client.rs:877-907 | crates/buzz-cli/src/client.rs:1131-1173 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/client.rs"},"region":{"startLine":789}}}],"partialFingerprints":{"codehealthFindingId/v1":"405b98886f9686d6229e5528dbed0cf209f314551d12da17acdb677e1b72723a"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): crates/buzz-cli/src/commands/notes.rs:168-182 | crates/buzz-cli/src/commands/notes.rs:352-363 | crates/buzz-cli/src/commands/projects.rs:256-274 | crates/buzz-cli/src/commands/repos.rs:20-31 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/notes.rs"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"98a5bd423b02af18d24fbc52ce62f403e809bf3a24871f889b11ee18542ce9f8"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): crates/buzz-db/src/store/api_token.rs:151-202 | crates/buzz-db/src/store/api_token.rs:215-269 | crates/buzz-db/src/store/api_token.rs:372-405 | crates/buzz-db/src/store/api_token.rs:528-559 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/api_token.rs"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a697f08ecc1ceabca8b5e1b7833a040d21ca6ad95cf3e41e74e5a928fc2532d"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): crates/buzz-relay/src/api/bridge.rs:2660-2723 | crates/buzz-relay/src/api/gifs.rs:127-177 | crates/buzz-relay/src/api/invites.rs:236-259 | crates/buzz-relay/src/api/workflows.rs:53-135 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/bridge.rs"},"region":{"startLine":2660}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2c7d2b4f9e11344f46ca77c42c862876bfcaa276dc1861d7110f14a378ebe82"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): crates/buzz-relay/src/handlers/identity_archive.rs:141-154 | crates/buzz-relay/src/handlers/ingest.rs:2258-3432 | crates/buzz-relay/src/handlers/moderation_commands.rs:96-134 | crates/buzz-relay/src/handlers/relay_admin.rs:227-484 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/identity_archive.rs"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"b15e9e061c23c6b6f5ccf9288c6c2b5274d874b925e19a7cd482caf8b92f9459"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): desktop/src-tauri/src/commands/agents_pending.rs:92-170 | desktop/src-tauri/src/commands/personas/pending.rs:242-300 | desktop/src-tauri/src/commands/teams/mod.rs:341-401 | desktop/src-tauri/src/managed_agents/team_catalog.rs:809-862 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/agents_pending.rs"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"d156d493f0781fba743a83494a1162a630f7fd192cd297c08034a32a56ccf460"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): desktop/src-tauri/src/managed_agents/runtime/instance_reaper.rs:114-178 | desktop/src-tauri/src/managed_agents/runtime/instance_reaper.rs:232-298 | desktop/src-tauri/src/managed_agents/runtime/orphan_sweep.rs:128-182 | desktop/src-tauri/src/managed_agents/runtime/orphan_sweep.rs:284-331 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/runtime/instance_reaper.rs"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5cb142de98e0202755adccab593349cd12b6f737b4f876130fe1875cafe4331"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): desktop/src-tauri/src/managed_agents/runtime/instance_reaper.rs:301-356 | desktop/src-tauri/src/managed_agents/runtime/orphan_sweep.rs:185-235 | desktop/src-tauri/src/managed_agents/runtime/orphan_sweep.rs:337-379 | desktop/src-tauri/src/managed_agents/runtime/sweep.rs:388-434 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/runtime/instance_reaper.rs"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"07d8d51579dadb770a4eed3dba0dfc2cd5fa000c18178a6f4f8de47bc234bb8d"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): desktop/src-tauri/src/migration.rs:1209-1233 | desktop/src-tauri/src/migration.rs:1239-1255 | desktop/src-tauri/src/migration.rs:1338-1363 | desktop/src-tauri/src/migration/materialize.rs:24-40 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/migration.rs"},"region":{"startLine":1209}}}],"partialFingerprints":{"codehealthFindingId/v1":"332322bc4fc852b48c7eec189f248cb05fe4036f891990a13979a98732cc7539"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): mobile/lib/features/channels/channel_mutes/channel_mutes_provider.dart:28-92 | mobile/lib/features/channels/channel_sections/channel_sections_provider.dart:28-96 | mobile/lib/features/channels/channel_sort/channel_sort_provider.dart:31-100 | mobile/lib/features/channels/channel_stars/channel_stars_provider.dart:28-92 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_mutes/channel_mutes_provider.dart"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccb8d65df96d8ab46bf5d79274a173e81f0208d46aecee05c08c2088c2328425"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): mobile/lib/shared/community/community_provider.dart:371-396 | mobile/lib/shared/community/community_provider.dart:461-498 | mobile/lib/shared/community/community_provider.dart:529-572 | mobile/lib/shared/community/community_provider.dart:574-589 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/community/community_provider.dart"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"eba55ef417bdfc9a73f74ef542d6198f3d9d3064c7be6e8b729a5a8d4785fe02"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (87\u2013100 lines \u00D7 2): crates/buzz-db/src/store/event.rs:530-629 | crates/buzz-db/src/store/event.rs:812-898 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/event.rs"},"region":{"startLine":530}}}],"partialFingerprints":{"codehealthFindingId/v1":"f54504ebceb7e683ca45dfe6bb1c3005a38d21c59e8016186405eb774753b87e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (64 lines \u00D7 2): crates/buzz-dev-mcp/src/shell.rs:472-535 | desktop/src-tauri/src/managed_agents/git_bash.rs:339-402 \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/buzz-dev-mcp/src/shell.rs"},"region":{"startLine":472}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ee25dc8a062a8a715b0f8aaa5ada00f9e59a384a99fab1f94edab5d63a1abed"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (60\u201361 lines \u00D7 2): crates/buzz-relay/src/handlers/command_executor.rs:1026-1086 | crates/buzz-relay/src/handlers/command_executor.rs:1138-1197 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/command_executor.rs"},"region":{"startLine":1026}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c3982c0231cdc3c367cf94784fecba1518d07cfe6162cc4672a87730c224dec"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (40 lines \u00D7 2): desktop/src-tauri/src/commands/personas/snapshot/import.rs:834-873 | desktop/src-tauri/src/commands/team_snapshot.rs:935-974 \u2014 before extracting anything, compare \u0060desktop/src-tauri/src/commands/personas/snapshot/import.rs\u0060 and \u0060desktop/src-tauri/src/commands/team_snapshot.rs\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 105 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/personas/snapshot/import.rs"},"region":{"startLine":834}}}],"partialFingerprints":{"codehealthFindingId/v1":"09397a10e8038b44616741f8a179c8975f15efb076c0d25013c3ed6c8eab4371"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (36 lines \u00D7 2): crates/buzz-db/src/store/event.rs:397-432 | crates/buzz-db/src/store/event.rs:1388-1423 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/event.rs"},"region":{"startLine":397}}}],"partialFingerprints":{"codehealthFindingId/v1":"9803546767736e3c52c4494d5aa6ba8c5cbd80705056995ce2315c5bc0381669"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (35\u201336 lines \u00D7 2): crates/buzz-relay/src/handlers/command_executor.rs:337-372 | crates/buzz-relay/src/handlers/command_executor.rs:499-533 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/command_executor.rs"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef3d4d2d683374c58733f07ab2dd2917f7bf5a43ba676c11cdbe592d39961af2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (32\u201334 lines \u00D7 2): crates/buzz-db/src/store/event.rs:1857-1890 | crates/buzz-db/src/store/event.rs:1910-1941 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/event.rs"},"region":{"startLine":1857}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a113183a15b480438bbff1c0df56f71f0daebdb2d01f29dda1d7e66e1887f79"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (33\u201334 lines \u00D7 2): crates/buzz-relay/src/api/bridge.rs:2067-2099 | crates/buzz-relay/src/api/bridge.rs:2137-2170 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/api/bridge.rs"},"region":{"startLine":2067}}}],"partialFingerprints":{"codehealthFindingId/v1":"154b78844d8bb57af00f2e473299e6463f31547329136c0bcf63fd099c9a7864"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (34 lines \u00D7 2): desktop/src-tauri/src/commands/media_animated.rs:104-137 | desktop/src-tauri/src/commands/media_animated.rs:213-246 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/commands/media_animated.rs"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb9042bf436ca08f04b39e8d8c06c4a33cacb535a7449959df77aff6de9cb1a2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (32\u201333 lines \u00D7 2): crates/buzz-relay/src/handlers/count.rs:208-239 | crates/buzz-relay/src/handlers/count.rs:281-313 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/count.rs"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0815d57ea6b0ed516407aea29c15d607bbfb23707e389c4703146001d51df86"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (29\u201331 lines \u00D7 3): crates/buzz-cli/src/commands/issues.rs:542-571 | crates/buzz-cli/src/commands/patches.rs:137-167 | crates/buzz-cli/src/commands/pr.rs:177-205 \u2014 before extracting anything, compare \u0060crates/buzz-cli/src/commands/issues.rs\u0060 and \u0060crates/buzz-cli/src/commands/patches.rs\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 72 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/issues.rs"},"region":{"startLine":542}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d0d2ec91193ad3f74915007f1c06baf73a644be7933ef674a8fbebd34b2f383"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (29\u201330 lines \u00D7 3): crates/buzz-acp/src/relay.rs:2033-2062 | crates/buzz-acp/src/relay.rs:2072-2100 | crates/buzz-acp/src/relay.rs:2105-2133 \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/buzz-acp/src/relay.rs"},"region":{"startLine":2033}}}],"partialFingerprints":{"codehealthFindingId/v1":"afd622540f46b8857740abb90b7716ae47e645dd561d271ed6163206a64b9a45"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26\u201329 lines \u00D7 3): crates/buzz-db/src/store/relay_admin_actions.rs:462-490 | crates/buzz-db/src/store/relay_admin_actions.rs:550-575 | crates/buzz-db/src/store/relay_admin_actions.rs:740-765 \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/buzz-db/src/store/relay_admin_actions.rs"},"region":{"startLine":462}}}],"partialFingerprints":{"codehealthFindingId/v1":"677caaebea41bd0668fd907e575d06eb00484c96bda58a1877c6bb382bbb7d55"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (29 lines \u00D7 2): crates/buzz-voice/src/pocket_april.rs:575-603 | crates/buzz-voice/src/pocket_april.rs:885-913 \u2014 both copies are in the same file, so extract the block 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/buzz-voice/src/pocket_april.rs"},"region":{"startLine":575}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f99ccf90acbb3efd620c8394cb7386c72f41797f09751870f31930e0e4c00cf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (28\u201329 lines \u00D7 2): desktop/src-tauri/src/managed_agents/runtime/instance_reaper.rs:54-81 | desktop/src-tauri/src/managed_agents/runtime/process.rs:160-188 \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":"desktop/src-tauri/src/managed_agents/runtime/instance_reaper.rs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"9989d9a48ca9439205e7b1e3423017ee02427b59c34bffe203f6d43535fe610f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2): crates/buzz-db/src/store/channel_members.rs:717-743 | crates/buzz-db/src/store/channel_members.rs:826-852 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/channel_members.rs"},"region":{"startLine":717}}}],"partialFingerprints":{"codehealthFindingId/v1":"7666072145ede7dc9308a607d1be0d5f3bb76c1ba456d4c499db7b7da834524b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2): crates/buzz-relay/src/api/bridge.rs:2255-2281 | crates/buzz-relay/src/handlers/req.rs:649-675 \u2014 before extracting anything, compare \u0060crates/buzz-relay/src/api/bridge.rs\u0060 and \u0060crates/buzz-relay/src/handlers/req.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 48 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/bridge.rs"},"region":{"startLine":2255}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7bf81f8e57f9ac3a70cc9ccd08f4c8b7db6f3235f307ab96267ba9512b64736"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23\u201327 lines \u00D7 2): crates/buzz-relay/src/api/media.rs:785-811 | crates/buzz-relay/src/api/media.rs:1078-1100 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/api/media.rs"},"region":{"startLine":785}}}],"partialFingerprints":{"codehealthFindingId/v1":"38222e1f43c3c8b806c6a3545455c5bc3f8c81a252becb7b6c11e9727392289c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2): crates/buzz-relay/src/audio/room.rs:314-340 | crates/buzz-relay/src/audio/room.rs:375-401 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/audio/room.rs"},"region":{"startLine":314}}}],"partialFingerprints":{"codehealthFindingId/v1":"09594c7c644705fcb9ba1f3c6b0719d14088937d7ae625ec70a2f41f35254ce1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26\u201327 lines \u00D7 2): desktop/src-tauri/src/nostr_convert.rs:118-144 | desktop/src-tauri/src/nostr_convert.rs:200-225 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/nostr_convert.rs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"f671c3cb85c24401c6ba2f9c136fb33111449540be1ca1a1b67473c5f3b1e9d3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24\u201326 lines \u00D7 3): crates/buzz-db/src/store/relay_admin_actions.rs:506-531 | crates/buzz-db/src/store/relay_admin_actions.rs:594-617 | crates/buzz-db/src/store/relay_admin_actions.rs:776-800 \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/buzz-db/src/store/relay_admin_actions.rs"},"region":{"startLine":506}}}],"partialFingerprints":{"codehealthFindingId/v1":"f44bfdbd7d25688f0b62619db07ae261f841aa5f261460ebb21a948363d5a2c5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25\u201326 lines \u00D7 2): crates/buzz-acp/src/acp.rs:1268-1293 | crates/buzz-acp/src/acp.rs:1592-1616 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/acp.rs"},"region":{"startLine":1268}}}],"partialFingerprints":{"codehealthFindingId/v1":"6212f7faa8fe0ce6a7b5bbac99e98f047a2c4b4c7ee7c550fad7d2910bc48e8c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2): crates/buzz-acp/src/acp.rs:1313-1338 | crates/buzz-acp/src/acp.rs:1761-1786 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/acp.rs"},"region":{"startLine":1313}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b5c4c1270c1e17f16d60e3749a545f0fe183c1d7339b47f4bbaf572fc4d32bb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24\u201325 lines \u00D7 2): crates/buzz-relay/src/api/bridge.rs:1338-1362 | crates/buzz-relay/src/api/bridge.rs:1955-1978 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/api/bridge.rs"},"region":{"startLine":1338}}}],"partialFingerprints":{"codehealthFindingId/v1":"a49ced28e940943234dfad7afc795a5e4e7e065c632032a53e1e12e953940f20"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22\u201324 lines \u00D7 3): crates/buzz-relay/src/api/bridge.rs:915-938 | crates/buzz-relay/src/api/bridge.rs:1241-1262 | crates/buzz-relay/src/api/bridge.rs:1868-1889 \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/buzz-relay/src/api/bridge.rs"},"region":{"startLine":915}}}],"partialFingerprints":{"codehealthFindingId/v1":"d05d4a8f0813b8ed2ec62a9a5888e5b1938c1950658247a1c2d1d984f6550e02"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21\u201324 lines \u00D7 2): crates/buzz-acp/src/config.rs:873-896 | desktop/src-tauri/src/managed_agents/discovery.rs:333-353 \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/buzz-acp/src/config.rs"},"region":{"startLine":873}}}],"partialFingerprints":{"codehealthFindingId/v1":"a12c2c884313efa40f7cce67baf9d3f58a5165a47e349137ab237a373009de29"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2): desktop/src-tauri/src/managed_agents/runtime/process.rs:323-346 | desktop/src-tauri/src/managed_agents/runtime/process.rs:357-380 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/managed_agents/runtime/process.rs"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"95e9fc46b90f567907ccedb342c10ee0343081c914c9d6aa6912025496f0342d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): crates/buzz-acp/src/relay.rs:3773-3795 | crates/buzz-ws-client/src/message.rs:120-142 \u2014 before extracting anything, compare \u0060crates/buzz-acp/src/relay.rs\u0060 and \u0060crates/buzz-ws-client/src/message.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 40 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/relay.rs"},"region":{"startLine":3773}}}],"partialFingerprints":{"codehealthFindingId/v1":"22e760ae2c717dc7e88c64b19dfc49a93ee8688416f8b136a3c8dbe46d2b8b88"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20\u201322 lines \u00D7 2): crates/buzz-acp/src/pool.rs:3356-3375 | crates/buzz-acp/src/pool.rs:3414-3435 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/pool.rs"},"region":{"startLine":3356}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a5660764425692b5349b0363f29d5afa71175ae12fdfb607bde88db3b2d0948"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): crates/buzz-relay/src/api/admin/mod.rs:1319-1340 | crates/buzz-relay/src/api/admin/mod.rs:1367-1388 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/api/admin/mod.rs"},"region":{"startLine":1319}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7ac968d3f6cfb9a77ae10b6626d81c512db383030000765040c808c605485a4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): crates/buzz-relay/src/handlers/ingest.rs:894-915 | crates/buzz-relay/src/handlers/ingest.rs:1091-1112 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":894}}}],"partialFingerprints":{"codehealthFindingId/v1":"88ff463f4f669c51bcc057d63a5e21f695790a66df06d917821acccd101e93fb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201322 lines \u00D7 2): desktop/src-tauri/src/commands/agents.rs:93-106 | desktop/src-tauri/src/commands/agents.rs:181-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":"desktop/src-tauri/src/commands/agents.rs"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"e466c03e699f535bf6c843a2a207ee19b3e26c5d6e8811c67b1775be01d8f4f9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20\u201321 lines \u00D7 3): desktop/src-tauri/src/managed_agents/runtime/instance_reaper.rs:311-330 | desktop/src-tauri/src/managed_agents/runtime/orphan_sweep.rs:195-215 | desktop/src-tauri/src/managed_agents/runtime/orphan_sweep.rs:347-366 \u2014 before extracting anything, compare \u0060desktop/src-tauri/src/managed_agents/runtime/instance_reaper.rs\u0060 and \u0060desktop/src-tauri/src/managed_agents/runtime/orphan_sweep.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 54 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/runtime/instance_reaper.rs"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"444b8887768427cac35074a87e23ea61539afc29e71550bab0bc693845f78761"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18\u201321 lines \u00D7 2): crates/buzz-relay/src/api/admin/mod.rs:1008-1028 | crates/buzz-relay/src/api/admin/mod.rs:1086-1103 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/api/admin/mod.rs"},"region":{"startLine":1008}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb934051b21edffe3b8cb93fd93e2c6e86c5657b44e8a94198053431769e07df"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): crates/buzz-voice/src/pocket_april.rs:513-533 | crates/buzz-voice/src/pocket_april.rs:828-848 \u2014 both copies are in the same file, so extract the block 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/buzz-voice/src/pocket_april.rs"},"region":{"startLine":513}}}],"partialFingerprints":{"codehealthFindingId/v1":"55646d26708b5f050f9b90264da1adfe3883b3d70d2f46a5c9c0a76e25f94247"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19\u201321 lines \u00D7 2): desktop/src-tauri/src/huddle/tts.rs:542-562 | desktop/src-tauri/src/huddle/tts.rs:607-625 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/huddle/tts.rs"},"region":{"startLine":542}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b1a1a6f903e56df4a7cb0863a1e2158f6fd1c71f235cb16e3c12659b006471c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 4): crates/buzz-db/src/store/relay_admin_actions.rs:458-479 | crates/buzz-db/src/store/relay_admin_actions.rs:548-567 | crates/buzz-db/src/store/relay_admin_actions.rs:648-667 | crates/buzz-db/src/store/relay_admin_actions.rs:738-757 \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/buzz-db/src/store/relay_admin_actions.rs"},"region":{"startLine":458}}}],"partialFingerprints":{"codehealthFindingId/v1":"55302a0bf9d9371cf1e9314888e8d330074f5997afc389c6df32002cdeecac30"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19\u201320 lines \u00D7 4): desktop/src-tauri/src/managed_agents/runtime/instance_reaper.rs:145-164 | desktop/src-tauri/src/managed_agents/runtime/instance_reaper.rs:250-269 | desktop/src-tauri/src/managed_agents/runtime/orphan_sweep.rs:143-162 | desktop/src-tauri/src/managed_agents/runtime/orphan_sweep.rs:300-318 \u2014 before extracting anything, compare \u0060desktop/src-tauri/src/managed_agents/runtime/instance_reaper.rs\u0060 and \u0060desktop/src-tauri/src/managed_agents/runtime/orphan_sweep.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 54 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/runtime/instance_reaper.rs"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"62cf83eef9829ef96fe5450f70d2ab4084a9220f120116aae42011e2df414b9e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19\u201320 lines \u00D7 2): crates/buzz-acp/src/lib.rs:3406-3425 | crates/buzz-acp/src/lib.rs:3459-3477 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/lib.rs"},"region":{"startLine":3406}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7b5b6a257fda511a8920ef5c380e1294f68120e236a3b0193e1543f72d5ee88"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18\u201320 lines \u00D7 2): crates/buzz-acp/src/queue.rs:592-611 | crates/buzz-acp/src/queue.rs:656-673 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/queue.rs"},"region":{"startLine":592}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfb5b012013945336a2fd02695e8241c141dfb5ef24b9a9a2193b1ae0c82d9c5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): crates/buzz-db/src/store/relay_admin_actions.rs:1468-1487 | crates/buzz-db/src/store/relay_admin_actions.rs:1555-1574 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/relay_admin_actions.rs"},"region":{"startLine":1468}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4dc4e29593e7567b719cd0db891f9959709583f74672beb14b7e415ecc2e29d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201320 lines \u00D7 2): crates/buzz-relay/src/audio/wire.rs:70-86 | desktop/src-tauri/src/huddle/wire.rs:103-122 \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/buzz-relay/src/audio/wire.rs"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"1772d273247450d1bc4baa6ba2a5742a518616db896b5cd1c61d503a9e44b03b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): crates/buzz-relay/src/handlers/command_executor.rs:1088-1107 | crates/buzz-relay/src/handlers/command_executor.rs:1199-1218 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/command_executor.rs"},"region":{"startLine":1088}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e392a2bac06e79e38d41ef9a2afa28f30f1f13544bbc57b820c9cd311271a5b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19\u201320 lines \u00D7 2): crates/buzz-relay/src/handlers/side_effects.rs:1945-1964 | crates/buzz-relay/src/handlers/side_effects.rs:1967-1985 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/side_effects.rs"},"region":{"startLine":1945}}}],"partialFingerprints":{"codehealthFindingId/v1":"f666369e64be8f45e51fd7f7ef104742f1890180ac633271319b080a0b0ddfda"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201320 lines \u00D7 2): desktop/src-tauri/src/commands/admin/mod.rs:174-193 | desktop/src-tauri/src/commands/admin/mod.rs:222-237 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/commands/admin/mod.rs"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"aea5aded6c9c9486f415c5ed10ae130c7b0ac367a1d9751dd9e96a66685b36b7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): desktop/src-tauri/src/commands/media_animated.rs:65-84 | desktop/src-tauri/src/commands/media_animated.rs:165-184 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/commands/media_animated.rs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f09b6503370e564a500cf1ef0fb98200130ff04581e7aa5715185bc5775e472"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): crates/buzz-acp/src/lib.rs:4921-4939 | crates/buzz-acp/src/lib.rs:4961-4979 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/lib.rs"},"region":{"startLine":4921}}}],"partialFingerprints":{"codehealthFindingId/v1":"79f4fb8016069b0b75ab9003ccb8d4f7f71b9b57511024ca5911e42b36b09f5b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): crates/buzz-cli/src/commands/feed.rs:9-27 | crates/buzz-cli/src/commands/messages.rs:336-354 \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/buzz-cli/src/commands/feed.rs"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba9695d11da8af31c18aec07096dd630c85f99739fc91b24dc92cb17514b2f37"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201319 lines \u00D7 2): crates/buzz-db/src/store/relay_invite.rs:336-354 | crates/buzz-db/src/store/relay_members.rs:190-206 \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/buzz-db/src/store/relay_invite.rs"},"region":{"startLine":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca4e87649f8ec4d9869dc8f60aab720e970209c2e4280a05aba9a6cea397faaf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201319 lines \u00D7 2): crates/buzz-media/src/upload.rs:92-110 | crates/buzz-media/src/upload.rs:428-443 \u2014 both copies are in the same file, so extract the block 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/buzz-media/src/upload.rs"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb2d7b0e80bd5612d6eb84f1f68718e36d3f7bad47f9f856108dfb4070ef9143"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201319 lines \u00D7 2): crates/buzz-pairing-cli/src/main.rs:129-145 | crates/buzz-pairing-cli/src/main.rs:231-249 \u2014 both copies are in the same file, so extract the block 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/buzz-pairing-cli/src/main.rs"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa04cef89c43a060e57f1046698e7445eb43a349d8d8d2f9c709a03f64b543f6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): crates/buzz-relay/src/conformance/mod.rs:277-295 | crates/buzz-relay/src/conformance/mod.rs:312-330 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/conformance/mod.rs"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"775540b47e2052fa4c41994736981c55be91d9107ce26955da4ded2889e912c2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): crates/buzz-relay/src/handlers/command_executor.rs:453-471 | crates/buzz-relay/src/handlers/command_executor.rs:583-601 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/command_executor.rs"},"region":{"startLine":453}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bfbce2d7f7e553d5cbf40ed876d8af89b121cd5062be73f4d0334f6b0550f56"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): crates/buzz-relay/src/handlers/ingest.rs:1189-1207 | crates/buzz-relay/src/handlers/side_effects.rs:2532-2550 \u2014 before extracting anything, compare \u0060crates/buzz-relay/src/handlers/ingest.rs\u0060 and \u0060crates/buzz-relay/src/handlers/side_effects.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 40 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":1189}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f270a5ca1b6d09a7ee425efd118338e4940445ce182ea59939c412e08c22e18"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): crates/buzz-relay/src/handlers/side_effects.rs:137-155 | crates/buzz-relay/src/handlers/side_effects.rs:208-226 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/side_effects.rs"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"87cfdb1d18d21a17856d3461cff236b0693de8a2efabdba7137464ae8783cd64"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): crates/buzz-relay/src/handlers/side_effects.rs:1548-1566 | crates/buzz-relay/src/handlers/side_effects.rs:2201-2219 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/side_effects.rs"},"region":{"startLine":1548}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab0ec703280293750f73b7c71cb7a7621d5ff9ec877d101361e4502d1cce4b63"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): desktop/src-tauri/src/migration.rs:900-918 | desktop/src-tauri/src/migration.rs:966-984 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/migration.rs"},"region":{"startLine":900}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bfc7ab28dcd934d3c2caa760be9067fca50bcee3595e8957556f8d0e645206c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): desktop/src-tauri/src/commands/project_git.rs:274-292 | desktop/src-tauri/src/commands/project_git.rs:344-362 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/commands/project_git.rs"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"1abd3577328ef77415608d713422a352556519d01514a18d3f0f90a4b34f7b80"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201318 lines \u00D7 2): crates/buzz-acp/src/pool.rs:3190-3207 | crates/buzz-acp/src/pool.rs:3496-3512 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/pool.rs"},"region":{"startLine":3190}}}],"partialFingerprints":{"codehealthFindingId/v1":"0afd4dc0406b72147fd1f742a45ec982b0a707080df90423b91a41dd1db6e8a9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): crates/buzz-cli/src/commands/mem.rs:208-225 | desktop/src-tauri/src/commands/engrams.rs:191-208 \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/buzz-cli/src/commands/mem.rs"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc70d7e4f39fcd9e5cb48086bb042172f521af85fe65044f35dbffbff5c52d6d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): crates/buzz-db/src/store/relay_admin_actions.rs:167-184 | crates/buzz-db/src/store/relay_admin_actions.rs:303-320 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/relay_admin_actions.rs"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e239961ca21a8c9b15ecb2bcee1187e76698ab6741031ca29243b5471eb9ffd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201318 lines \u00D7 2): crates/buzz-relay/src/api/bridge.rs:2752-2769 | crates/buzz-relay/src/api/bridge.rs:2792-2808 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/api/bridge.rs"},"region":{"startLine":2752}}}],"partialFingerprints":{"codehealthFindingId/v1":"69a25c45a081b768114a983132e62529326c740616e90dfd9d05d806217e1f26"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): crates/buzz-relay/src/api/git/transport.rs:1382-1399 | crates/buzz-relay/src/api/git/transport.rs:1786-1803 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/api/git/transport.rs"},"region":{"startLine":1382}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab146ff409a6b4cd59375027d6f6de2bd0507b02979394965821be1c1006d676"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): crates/buzz-relay/src/handlers/ingest.rs:3201-3218 | crates/buzz-relay/src/handlers/ingest.rs:3396-3413 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":3201}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cbeda40c8d1e6cb4f6ee3aa554c2967eb5cdcfdedbbe54f16aebc9239e9a03b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): desktop/src-tauri/src/managed_agents/discovery.rs:384-401 | desktop/src-tauri/src/managed_agents/managed_node_paths.rs:84-101 \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":"desktop/src-tauri/src/managed_agents/discovery.rs"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca3f93cbd51db6dc5f05fd66b2fbbaef638a33e7d1301df03aeafb46c5a80a9b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201317 lines \u00D7 5): desktop/src-tauri/src/commands/agent_config.rs:263-278 | desktop/src-tauri/src/commands/agent_models.rs:43-58 | desktop/src-tauri/src/commands/agents.rs:381-397 | desktop/src-tauri/src/commands/agents.rs:452-468 | desktop/src-tauri/src/commands/agents.rs:875-891 \u2014 there are 5 copies across 3 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 5 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/agent_config.rs"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e98fe6a86fa0ddebe41cf572517922b91924876561a3f4377dd52b2bc836926"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201317 lines \u00D7 3): crates/buzz-acp/src/pool.rs:3356-3371 | crates/buzz-acp/src/pool.rs:3415-3431 | crates/buzz-acp/src/pool.rs:3469-3485 \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/buzz-acp/src/pool.rs"},"region":{"startLine":3356}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cf6cf43259fecc58df789f4d0bd39535b3c12244756aa5dfc1f11975f93b646"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201317 lines \u00D7 3): desktop/src-tauri/src/commands/messages.rs:121-137 | desktop/src-tauri/src/commands/messages/forum.rs:174-189 | desktop/src-tauri/src/commands/messages/forum.rs:229-244 \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":"desktop/src-tauri/src/commands/messages.rs"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d90284f19fa78e8d9077555187a604fdbeb1d95608ca275cc17ae54089092ba"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): crates/buzz-acp/src/lib.rs:5627-5643 | crates/buzz-acp/src/lib.rs:5675-5691 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/lib.rs"},"region":{"startLine":5627}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef8cf8f86e622e4cbb38d4bdad4ce3b17a0cd7b6a8a1c2cbeceae25b1e35ba34"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201317 lines \u00D7 2): crates/buzz-admin/src/main.rs:712-724 | crates/buzz-relay/src/handlers/side_effects.rs:1202-1218 \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/buzz-admin/src/main.rs"},"region":{"startLine":712}}}],"partialFingerprints":{"codehealthFindingId/v1":"a27ec588071c14248cb2dabe1b346427279d165be4c8362d613750f5a8aed1f0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201317 lines \u00D7 2): crates/buzz-agent/src/auth.rs:696-712 | crates/buzz-agent/src/auth.rs:2169-2184 \u2014 both copies are in the same file, so extract the block 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/buzz-agent/src/auth.rs"},"region":{"startLine":696}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0ea4c62c461d89ee475cf2e67541bf18569b7c63600e33fea4a3674cea992a6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201317 lines \u00D7 2): crates/buzz-agent/src/llm.rs:2000-2016 | crates/buzz-agent/src/llm.rs:2438-2452 \u2014 both copies are in the same file, so extract the block 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/buzz-agent/src/llm.rs"},"region":{"startLine":2000}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7ad3971777fac6ddefccda4ff4e7a13b567fd8596e04581d4698b0512d3169b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): crates/buzz-cli/src/commands/issues.rs:504-520 | crates/buzz-cli/src/commands/pr.rs:140-156 \u2014 before extracting anything, compare \u0060crates/buzz-cli/src/commands/issues.rs\u0060 and \u0060crates/buzz-cli/src/commands/pr.rs\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 89 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/issues.rs"},"region":{"startLine":504}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ea2ad2d4208a5b1c882be7a0978eeb733d8a0e3856a75cca43d42b6265d5704"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): desktop/src-tauri/src/commands/project_git_diff.rs:70-86 | desktop/src-tauri/src/commands/project_git_diff.rs:87-103 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/commands/project_git_diff.rs"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"18aebfd75ddc489c0c8ab9b8186762743c31b09e92dceb783f0ee2abfeab906c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201317 lines \u00D7 2): desktop/src-tauri/src/commands/teams/pending.rs:280-293 | desktop/src-tauri/src/commands/teams/pending.rs:316-332 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/commands/teams/pending.rs"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"e80dfa70c57927dbce5306d0088d44936311412f00fa54cddc6cbe9276d669eb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): desktop/src-tauri/src/huddle/tts.rs:753-769 | desktop/src-tauri/src/huddle/tts.rs:833-849 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/huddle/tts.rs"},"region":{"startLine":753}}}],"partialFingerprints":{"codehealthFindingId/v1":"db0963525af853ddf7894da23cf0ecec11add2933821f0d7dcb96c2b0fc372d9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): desktop/src-tauri/src/managed_agents/backend.rs:112-128 | desktop/src-tauri/src/managed_agents/backend.rs:136-152 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/managed_agents/backend.rs"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6e3432875a13e9209534b13c3b2fbdeb85e9e274d78889d9d27a6731df32ca7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201316 lines \u00D7 4): crates/buzz-db/src/store/relay_admin_actions.rs:518-533 | crates/buzz-db/src/store/relay_admin_actions.rs:606-619 | crates/buzz-db/src/store/relay_admin_actions.rs:789-802 | crates/buzz-db/src/store/relay_admin_actions.rs:1081-1093 \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/buzz-db/src/store/relay_admin_actions.rs"},"region":{"startLine":518}}}],"partialFingerprints":{"codehealthFindingId/v1":"44645e04afab64b79df91b0326345db306c3f7775b59e70cc7035840ffe78991"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201316 lines \u00D7 3): desktop/src-tauri/src/commands/project_git_diff.rs:54-68 | desktop/src-tauri/src/commands/project_git_diff.rs:70-84 | desktop/src-tauri/src/commands/project_git_diff.rs:86-101 \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":"desktop/src-tauri/src/commands/project_git_diff.rs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce4563ebb0753b10a3b7df7e15103419138e642ecf3c8ec9f9644e423050cf9f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201316 lines \u00D7 2): crates/buzz-acp/src/acp.rs:1423-1438 | crates/buzz-acp/src/acp.rs:1548-1559 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/acp.rs"},"region":{"startLine":1423}}}],"partialFingerprints":{"codehealthFindingId/v1":"bea3f509917bfd72476865d08454dbf1474031751c9dc89f92b9d26863315a6a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): crates/buzz-acp/src/config.rs:1397-1412 | crates/buzz-acp/src/config.rs:1488-1503 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/config.rs"},"region":{"startLine":1397}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4d74bc898c822dd6f4f2a27ade5eda15702333b7a41928fcecc66fa0b1d5a25"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201316 lines \u00D7 2): crates/buzz-agent/src/llm.rs:1886-1901 | crates/buzz-agent/src/llm.rs:2281-2295 \u2014 both copies are in the same file, so extract the block 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/buzz-agent/src/llm.rs"},"region":{"startLine":1886}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb1405180dd35d9938cf9d689a72b01466791343000755e454967d9b5580e5b8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): crates/buzz-core/src/engram.rs:315-330 | crates/buzz-core/src/private_managed_agent.rs:751-766 \u2014 before extracting anything, compare \u0060crates/buzz-core/src/engram.rs\u0060 and \u0060crates/buzz-core/src/private_managed_agent.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 31 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-core/src/engram.rs"},"region":{"startLine":315}}}],"partialFingerprints":{"codehealthFindingId/v1":"f48aaa75a83db53ccd022db26f5588c36055e560fd987cec9050d268dcb08782"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201316 lines \u00D7 2): crates/buzz-relay/src/api/git/cas_publish.rs:1195-1208 | crates/buzz-relay/src/api/git/cas_publish.rs:1218-1233 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/git/cas_publish.rs"},"region":{"startLine":1195}}}],"partialFingerprints":{"codehealthFindingId/v1":"a16a95695abc3759bb52f766834b367e457a8f20c097e380b08d77524f4abc76"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): crates/buzz-relay/src/handlers/event.rs:257-272 | crates/buzz-relay/src/handlers/event.rs:317-332 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/event.rs"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"23bc54402d66e16b58fedd47324c490d868942d2e9e5dbbfadbcd3697cee972f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): crates/buzz-sdk/src/builders.rs:750-765 | desktop/src-tauri/src/events.rs:449-464 \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/buzz-sdk/src/builders.rs"},"region":{"startLine":750}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7aadf020d5fea6e1da0cf4e43c8c62876ba6b8d1c9f165b837b667c1e9b3205"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): crates/buzz-sdk/src/builders.rs:1680-1695 | crates/buzz-sdk/src/builders.rs:1759-1774 \u2014 both copies are in the same file, so extract the block 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/buzz-sdk/src/builders.rs"},"region":{"startLine":1680}}}],"partialFingerprints":{"codehealthFindingId/v1":"c887615fbb85ad448f1def541252cfd5dd9becfee19792320a219003e55f1947"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): crates/buzz-voice/src/pocket_april.rs:538-553 | crates/buzz-voice/src/pocket_april.rs:850-865 \u2014 both copies are in the same file, so extract the block 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/buzz-voice/src/pocket_april.rs"},"region":{"startLine":538}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c0063cfdbcb304f3bd3f3e870eafdcaab2bfdc9c5d241161b96e7d4c208c4be"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201316 lines \u00D7 2): desktop/src-tauri/src/commands/personas/snapshot/import.rs:717-731 | desktop/src-tauri/src/commands/team_snapshot.rs:806-821 \u2014 before extracting anything, compare \u0060desktop/src-tauri/src/commands/personas/snapshot/import.rs\u0060 and \u0060desktop/src-tauri/src/commands/team_snapshot.rs\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 105 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/personas/snapshot/import.rs"},"region":{"startLine":717}}}],"partialFingerprints":{"codehealthFindingId/v1":"879d4f76392466101a4f8f5edd5967261b78741cba01d5cd151c12286fe07e43"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201316 lines \u00D7 2): desktop/src-tauri/src/managed_agents/runtime/instance_reaper.rs:129-143 | desktop/src-tauri/src/managed_agents/runtime/sweep.rs:333-348 \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":"desktop/src-tauri/src/managed_agents/runtime/instance_reaper.rs"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"60f66ed9d6e1982175c97379f36f0b1e1777e1c056f4b6a47b89bddcade37b3e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): desktop/src-tauri/src/relay.rs:721-736 | desktop/src-tauri/src/relay/submit.rs:39-54 \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":"desktop/src-tauri/src/relay.rs"},"region":{"startLine":721}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa5d14980000cd50c900ab7853d10bf583f594cff3d3e8666c655c25b7a2c953"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201315 lines \u00D7 3): crates/buzz-db/src/store/feed.rs:370-384 | crates/buzz-db/src/store/feed.rs:455-469 | crates/buzz-db/src/store/feed.rs:531-544 \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/buzz-db/src/store/feed.rs"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b7e989ba038d559b48db3d7a41d96f67cd02ef10b6fb163c38637ef996cb1c5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 3): crates/buzz-relay/src/handlers/side_effects.rs:1473-1487 | crates/buzz-relay/src/handlers/side_effects.rs:1543-1557 | crates/buzz-relay/src/handlers/side_effects.rs:2196-2210 \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/buzz-relay/src/handlers/side_effects.rs"},"region":{"startLine":1473}}}],"partialFingerprints":{"codehealthFindingId/v1":"995851f66a40d7ce8f0d2c7dc20b50e467f683ae5268043bedbf73b10ebd7c84"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): crates/buzz-acp/src/pool.rs:3442-3456 | crates/buzz-acp/src/pool.rs:3471-3485 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/pool.rs"},"region":{"startLine":3442}}}],"partialFingerprints":{"codehealthFindingId/v1":"87bc71b68744172a3db52d1debfac00ab20e32d9fcfa98323e2a802bc7e77931"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): crates/buzz-cli/src/client.rs:800-814 | crates/buzz-cli/src/client.rs:830-844 \u2014 both copies are in the same file, so extract the block 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/buzz-cli/src/client.rs"},"region":{"startLine":800}}}],"partialFingerprints":{"codehealthFindingId/v1":"a65640b111c153e6d616f14730137e30b6b81d0ce41689887464489bef456663"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): crates/buzz-cli/src/commands/agents.rs:90-104 | crates/buzz-cli/src/commands/agents.rs:129-143 \u2014 both copies are in the same file, so extract the block 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/buzz-cli/src/commands/agents.rs"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc930624a9657fc9b11e02561e4c556152265502261d7a416f94603ce33d39f2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): crates/buzz-core/src/pairing/session.rs:237-251 | crates/buzz-core/src/pairing/session.rs:437-451 \u2014 both copies are in the same file, so extract the block 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/buzz-core/src/pairing/session.rs"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed33cf4eaafc9d79156bf70cb0cf9cd627baeddf43090c9499eecacf601d88b9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201315 lines \u00D7 2): crates/buzz-pairing-cli/src/main.rs:561-575 | desktop/src-tauri/src/commands/pairing.rs:652-664 \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/buzz-pairing-cli/src/main.rs"},"region":{"startLine":561}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c9cfe503cb7f093686ca4484db0f6ca50fcce16685ec7b250d12945080c63de"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): crates/buzz-relay/src/handlers/side_effects.rs:1464-1478 | crates/buzz-relay/src/handlers/side_effects.rs:2126-2140 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/side_effects.rs"},"region":{"startLine":1464}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a0b829aad497be9572008742f9330d7d0c1da8989acf752237fe4942bfffc58"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201315 lines \u00D7 2): crates/buzz-relay/src/invite_token.rs:162-176 | crates/buzz-relay/src/invite_token.rs:366-378 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/invite_token.rs"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"aeb1752fc2a180f89828fc43eba1b83b7b4851ab480beab1d0a816fe341413f3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): crates/buzz-relay/src/push_runtime.rs:387-401 | crates/buzz-relay/src/push_runtime.rs:448-462 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/push_runtime.rs"},"region":{"startLine":387}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f54ed36698cb77fa573ca3e62bf611e94c4a1397f3674bf0c62d62345f775bd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): crates/buzz-relay/src/subscription.rs:395-409 | crates/buzz-relay/src/subscription.rs:455-469 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/subscription.rs"},"region":{"startLine":395}}}],"partialFingerprints":{"codehealthFindingId/v1":"a68f24410ca927ab2f9b5d1b7144d0ccf5937a70ade68af8b796c698affd077d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201315 lines \u00D7 2): desktop/src-tauri/src/mesh_llm/mod.rs:386-400 | desktop/src-tauri/src/mesh_llm/mod.rs:420-432 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/mesh_llm/mod.rs"},"region":{"startLine":386}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d38ea5ae8be41a489e99e9f6866c16c3e9c02ab39f1d402aecd9443e85a1809"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 3): crates/buzz-cli/src/client.rs:800-813 | crates/buzz-cli/src/client.rs:830-843 | crates/buzz-cli/src/client.rs:1145-1157 \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/buzz-cli/src/client.rs"},"region":{"startLine":800}}}],"partialFingerprints":{"codehealthFindingId/v1":"f84f65527ef01d9cdc523ceb48ad419cd21b6433a0638655ddb19c5c90965cb8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3): crates/buzz-cli/src/commands/issues.rs:499-512 | crates/buzz-cli/src/commands/patches.rs:93-106 | crates/buzz-cli/src/commands/pr.rs:135-148 \u2014 before extracting anything, compare \u0060crates/buzz-cli/src/commands/issues.rs\u0060 and \u0060crates/buzz-cli/src/commands/patches.rs\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 72 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/issues.rs"},"region":{"startLine":499}}}],"partialFingerprints":{"codehealthFindingId/v1":"59116d6803fe0c311aeb992c1d2648a0276080d11c0f670b39a90964c4e2eb22"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3): desktop/src-tauri/src/commands/media_transcode.rs:254-267 | desktop/src-tauri/src/commands/media_transcode.rs:339-352 | desktop/src-tauri/src/commands/media_transcode.rs:405-418 \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":"desktop/src-tauri/src/commands/media_transcode.rs"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"74527879ffe3d41cc18821e31761b6e820f3813a5c0660c16145c7822a72dfbf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 2): crates/buzz-acp/src/relay.rs:2265-2277 | crates/buzz-acp/src/relay.rs:2304-2317 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/relay.rs"},"region":{"startLine":2265}}}],"partialFingerprints":{"codehealthFindingId/v1":"afb10c16051d43a824c42c10c8c571ea7549013c188030d88221258419519161"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): crates/buzz-acp/src/usage.rs:494-507 | crates/buzz-acp/src/usage.rs:797-810 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/usage.rs"},"region":{"startLine":494}}}],"partialFingerprints":{"codehealthFindingId/v1":"019fe2711e16a4bd22b91e67b3ab62f5a2290c60f9fb85779283ee2ca8a4c290"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201314 lines \u00D7 2): crates/buzz-cli/src/commands/mem.rs:100-109 | crates/buzz-cli/src/commands/notes.rs:551-564 \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/buzz-cli/src/commands/mem.rs"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ef3a6d15663bf6a9be47e0d274f7753fc5d932e82324da685311fd2f31da289"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): crates/buzz-db/src/store/channel.rs:676-689 | crates/buzz-db/src/store/channel.rs:719-732 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/channel.rs"},"region":{"startLine":676}}}],"partialFingerprints":{"codehealthFindingId/v1":"57ba035deb08b41bc69793abe572272f29392c7a906ff24fcc53b661ecca40b5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): crates/buzz-db/src/store/deletion.rs:2553-2566 | crates/buzz-db/src/store/deletion.rs:2746-2760 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/deletion.rs"},"region":{"startLine":2553}}}],"partialFingerprints":{"codehealthFindingId/v1":"612562cdb7c5ac505da7fe91f11e9dfa9be00f36f76cdb62ed44c991a401ba59"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 2): crates/buzz-db/src/store/moderation.rs:417-430 | crates/buzz-db/src/store/moderation.rs:468-480 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/moderation.rs"},"region":{"startLine":417}}}],"partialFingerprints":{"codehealthFindingId/v1":"e85605b011baaeaba131bae316c0ab7153bf81c4bf1c2aa6fa0380eedb6e135d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): crates/buzz-db/src/store/feed.rs:93-106 | crates/buzz-db/src/store/feed.rs:182-195 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/feed.rs"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"445aa6f0d7471a60d7f3f328d2873feecfb8cee2b8547496e7db9bf74936e4e7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): crates/buzz-relay/src/api/bridge.rs:2037-2050 | crates/buzz-relay/src/handlers/count.rs:177-190 \u2014 before extracting anything, compare \u0060crates/buzz-relay/src/api/bridge.rs\u0060 and \u0060crates/buzz-relay/src/handlers/count.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 39 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/bridge.rs"},"region":{"startLine":2037}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9c2e4d490c670b57857306723df6c797b08fa74ee5f1dd4d50b1bc9fe27c482"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201314 lines \u00D7 2): crates/buzz-relay/src/api/git/store.rs:271-284 | crates/buzz-relay/src/api/git/store.rs:310-321 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/api/git/store.rs"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"b15997e8ddf20888b11f38ecc037c2c644e952bf2d6d9c3bd6c1a299756d88ac"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): crates/buzz-relay/src/main.rs:2056-2069 | crates/buzz-relay/src/main.rs:2169-2182 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/main.rs"},"region":{"startLine":2056}}}],"partialFingerprints":{"codehealthFindingId/v1":"896ad88c55d9ee027717f2b2acb0105d2c967ba1da1a3d20b1a90e93e7943215"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): crates/buzz-relay/src/subscription.rs:394-407 | crates/buzz-relay/src/subscription.rs:411-424 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/subscription.rs"},"region":{"startLine":394}}}],"partialFingerprints":{"codehealthFindingId/v1":"d59c1611448d1893829f902a3155a0e505a3dc4d02ac6c140d28de26dcb37a2c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): crates/buzz-relay/src/tunnel/directory.rs:308-321 | crates/buzz-relay/src/tunnel/directory.rs:353-366 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/tunnel/directory.rs"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"f97764726e12aa5e5ecb66781ccce2fadc3022aeda13bdda074c40a01809ce02"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): desktop/src-tauri/src/archive/agent_usage.rs:225-238 | desktop/src-tauri/src/archive/agent_usage.rs:247-260 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/archive/agent_usage.rs"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"49c49dc7409f9b73f7e389347ddc557ddcdd705cfa2df489c0dccf7e39d244a9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 2): desktop/src-tauri/src/commands/personas/snapshot/import.rs:742-755 | desktop/src-tauri/src/commands/team_snapshot.rs:838-850 \u2014 before extracting anything, compare \u0060desktop/src-tauri/src/commands/personas/snapshot/import.rs\u0060 and \u0060desktop/src-tauri/src/commands/team_snapshot.rs\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 105 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/personas/snapshot/import.rs"},"region":{"startLine":742}}}],"partialFingerprints":{"codehealthFindingId/v1":"4494369d38d0c155f2b77f96121cb2a0805dc9c4dc6fe97be9af21fc00be92f2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): desktop/src-tauri/src/commands/teams/pending.rs:481-494 | desktop/src-tauri/src/event_sync.rs:555-568 \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":"desktop/src-tauri/src/commands/teams/pending.rs"},"region":{"startLine":481}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c00c3b1440606ca8a5ee27a60211c6793070f9554ed6c57609b3e3b88b4f744"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): desktop/src-tauri/src/huddle/agent_voice.rs:181-194 | desktop/src-tauri/src/huddle/agent_voice.rs:207-220 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/huddle/agent_voice.rs"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"582d228c565f0e5e1ba6f3707e21dbe8e0afde2f4f3c97792c96d39beb5458b2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): desktop/src-tauri/src/event_sync.rs:133-147 | desktop/src-tauri/src/event_sync.rs:274-287 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/event_sync.rs"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a7901ccafa2ab5f99de7cee16cec72a51fdb182b58c8b8ccae0a552f92417fb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 4): desktop/src-tauri/src/managed_agents/runtime/instance_reaper.rs:308-320 | desktop/src-tauri/src/managed_agents/runtime/orphan_sweep.rs:192-204 | desktop/src-tauri/src/managed_agents/runtime/orphan_sweep.rs:344-356 | desktop/src-tauri/src/managed_agents/runtime/sweep.rs:395-407 \u2014 before extracting anything, compare \u0060desktop/src-tauri/src/managed_agents/runtime/instance_reaper.rs\u0060 and \u0060desktop/src-tauri/src/managed_agents/runtime/orphan_sweep.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 54 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/runtime/instance_reaper.rs"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"449a0a6f73dac4d249d584730242f7494e6f0135576ac4a7443bcbd408a2c5a0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 3): crates/buzz-relay/src/api/bridge.rs:897-909 | crates/buzz-relay/src/api/bridge.rs:1224-1236 | crates/buzz-relay/src/api/bridge.rs:1851-1863 \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/buzz-relay/src/api/bridge.rs"},"region":{"startLine":897}}}],"partialFingerprints":{"codehealthFindingId/v1":"16368b03beb2fb833fb3982dc59db97644078a3c2e4ccd5c9832c1b8d84ec89f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): crates/buzz-acp/src/filter.rs:265-277 | crates/buzz-workflow/src/executor.rs:233-245 \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/buzz-acp/src/filter.rs"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ce966d479d99d89968275fe7ba4424af55443a7de5b588aa4489b91d656acbc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): crates/buzz-acp/src/lib.rs:5163-5175 | crates/buzz-acp/src/lib.rs:5404-5416 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/lib.rs"},"region":{"startLine":5163}}}],"partialFingerprints":{"codehealthFindingId/v1":"99a40c71505e16fe7d750b5164f8062d8ecf1b3f5c79f2782a9e22ab188beac6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): crates/buzz-acp/src/relay.rs:1979-1991 | crates/buzz-acp/src/relay.rs:1999-2011 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/relay.rs"},"region":{"startLine":1979}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2964acc60cc623a06430ed5eb55122f0419189299e45b6c9cc8d3a8eb173161"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): crates/buzz-acp/src/relay.rs:4084-4096 | crates/buzz-acp/src/relay.rs:4162-4174 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/relay.rs"},"region":{"startLine":4084}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b03504094df70a26d9e1a9709ced6573f6d0fba76a3eef4d6a03fe67f583fda"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): crates/buzz-admin/src/main.rs:734-746 | crates/buzz-relay/src/handlers/side_effects.rs:1259-1271 \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/buzz-admin/src/main.rs"},"region":{"startLine":734}}}],"partialFingerprints":{"codehealthFindingId/v1":"8987ad5ab7bf94fb64d191682003aeb6ec322b7e4886569607e17393b4c1f083"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201313 lines \u00D7 2): crates/buzz-cli/src/commands/channels.rs:682-694 | crates/buzz-cli/src/commands/channels.rs:1458-1468 \u2014 both copies are in the same file, so extract the block 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/buzz-cli/src/commands/channels.rs"},"region":{"startLine":682}}}],"partialFingerprints":{"codehealthFindingId/v1":"55ebd006f376d752537b7170c650edce0fcc670d75578c8abe27360060bdb16f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): crates/buzz-db/src/store/event.rs:659-671 | crates/buzz-db/src/store/event.rs:909-921 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/event.rs"},"region":{"startLine":659}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8789399481f68990e901ecd23c4a72d51ce4ad6d82d86937df7f39458365ff6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): crates/buzz-relay/src/api/admin/mod.rs:709-721 | crates/buzz-relay/src/api/admin/mod.rs:793-805 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/admin/mod.rs"},"region":{"startLine":709}}}],"partialFingerprints":{"codehealthFindingId/v1":"72318807125e31f17d2f378a99d67861be7d6c1651aea0b3b3f8e4aa55310bc9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): crates/buzz-relay/src/api/bridge.rs:1315-1327 | crates/buzz-relay/src/api/bridge.rs:1940-1952 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/api/bridge.rs"},"region":{"startLine":1315}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b95cd1dd099b3567e65c0f13bbcb20994325786a15accb52a5dc75a437d7e99"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201313 lines \u00D7 2): crates/buzz-relay/src/api/bridge.rs:2108-2120 | crates/buzz-relay/src/handlers/count.rs:252-263 \u2014 before extracting anything, compare \u0060crates/buzz-relay/src/api/bridge.rs\u0060 and \u0060crates/buzz-relay/src/handlers/count.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 39 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/bridge.rs"},"region":{"startLine":2108}}}],"partialFingerprints":{"codehealthFindingId/v1":"b680e18fba41702fd046d5065181e41b2d7efae2a501b5ead08c45de638bdf98"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201313 lines \u00D7 2): crates/buzz-relay/src/connection.rs:906-918 | crates/buzz-relay/src/connection.rs:929-940 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/connection.rs"},"region":{"startLine":906}}}],"partialFingerprints":{"codehealthFindingId/v1":"39a6311b26a53e78f71767819c9b97a11f9e29d6031eca300ba506c30f98e37c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201313 lines \u00D7 2): crates/buzz-relay/src/handlers/side_effects.rs:1312-1323 | crates/buzz-relay/src/handlers/side_effects.rs:1369-1381 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/side_effects.rs"},"region":{"startLine":1312}}}],"partialFingerprints":{"codehealthFindingId/v1":"fecf05f637ad7f7ccbb6d9c61de5d65e91c71a65dee23cce5eb2d4129502bf16"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201313 lines \u00D7 2): crates/buzz-relay/src/handlers/side_effects.rs:1859-1871 | crates/buzz-relay/src/handlers/side_effects.rs:2399-2409 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/side_effects.rs"},"region":{"startLine":1859}}}],"partialFingerprints":{"codehealthFindingId/v1":"81198258988d80ca212417c9ddacd8a896c973c5b573d552135514a51de3010d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201313 lines \u00D7 2): crates/git-sign-nostr/src/lib.rs:221-233 | crates/git-sign-nostr/src/lib.rs:243-251 \u2014 both copies are in the same file, so extract the block 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/git-sign-nostr/src/lib.rs"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"cab0dcf4044cdb8124b05ddb4b890f7044b6d4f188f3300706ff2f02b9455da3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): desktop/src-tauri/src/archive/store.rs:342-354 | desktop/src-tauri/src/archive/store.rs:418-430 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/archive/store.rs"},"region":{"startLine":342}}}],"partialFingerprints":{"codehealthFindingId/v1":"b252464d65b267edcd587d8473933f2442a0245b4ceb84c09faf851d4c8930b3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201313 lines \u00D7 2): desktop/src-tauri/src/relay.rs:583-594 | desktop/src-tauri/src/relay.rs:713-725 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/relay.rs"},"region":{"startLine":583}}}],"partialFingerprints":{"codehealthFindingId/v1":"a06e03eed56aa4cc43ed5760d2b07f55ea868b584af476df78d0b807374b2c53"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): desktop/src-tauri/src/nostr_convert.rs:536-548 | desktop/src-tauri/src/nostr_convert.rs:552-564 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/nostr_convert.rs"},"region":{"startLine":536}}}],"partialFingerprints":{"codehealthFindingId/v1":"c083ab05191b9c866ff00f54e5960847afb737fdfce69f831e5e6cea1af035f4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201312 lines \u00D7 4): crates/buzz-relay/src/api/bridge.rs:2041-2052 | crates/buzz-relay/src/api/bridge.rs:2113-2122 | crates/buzz-relay/src/handlers/count.rs:181-192 | crates/buzz-relay/src/handlers/count.rs:256-265 \u2014 before extracting anything, compare \u0060crates/buzz-relay/src/api/bridge.rs\u0060 and \u0060crates/buzz-relay/src/handlers/count.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 39 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/bridge.rs"},"region":{"startLine":2041}}}],"partialFingerprints":{"codehealthFindingId/v1":"ead0fae7a25f1777e61e44d8e31a5238cc4afec1ca595815f8b7a8fb257f3a1c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 4): desktop/src-tauri/src/huddle/tts.rs:541-552 | desktop/src-tauri/src/huddle/tts.rs:606-617 | desktop/src-tauri/src/huddle/tts.rs:754-765 | desktop/src-tauri/src/huddle/tts.rs:834-845 \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":"desktop/src-tauri/src/huddle/tts.rs"},"region":{"startLine":541}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcf443c6ad4e5cadcf5ed675014fe52e65a21810f02b5905c4d73a12c0c13da4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 4): desktop/src-tauri/src/migration.rs:1210-1221 | desktop/src-tauri/src/migration.rs:1240-1251 | desktop/src-tauri/src/migration.rs:1348-1359 | desktop/src-tauri/src/migration/materialize.rs:25-36 \u2014 there are 4 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 4 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/migration.rs"},"region":{"startLine":1210}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ba7b86a400c8e7db2754af296e8185c85812ee088e8035342f40d9d17ec5ee3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3): crates/buzz-db/src/store/api_token.rs:172-183 | crates/buzz-db/src/store/api_token.rs:234-245 | crates/buzz-db/src/store/api_token.rs:375-386 \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/buzz-db/src/store/api_token.rs"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e2c1d665011af7df46ae60a8eb4e0e8c2f38660df9812f80297d0bd48070a1a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3): crates/buzz-relay/src/audio/handler.rs:543-554 | crates/buzz-relay/src/audio/handler.rs:558-569 | crates/buzz-relay/src/audio/handler.rs:577-588 \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/buzz-relay/src/audio/handler.rs"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"79ca4dd3ae6d5263293fd4649df9428b8ac1b2b12bf08a45b3d48adc37f36261"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3): desktop/src-tauri/src/commands/bestie.rs:82-93 | desktop/src-tauri/src/commands/bestie.rs:107-118 | desktop/src-tauri/src/commands/bestie.rs:131-142 \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":"desktop/src-tauri/src/commands/bestie.rs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"0562578f37aa050608813d502deddc8d3d838b054d426415f5bfbc4add637332"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): crates/buzz-acp/src/queue.rs:373-384 | crates/buzz-acp/src/queue.rs:707-718 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/queue.rs"},"region":{"startLine":373}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e306d13c794b15f35f5934cc92b57fa60a36273fd31a752737808145bea1f89"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): crates/buzz-agent/src/llm.rs:2550-2561 | crates/buzz-agent/src/llm.rs:2574-2585 \u2014 both copies are in the same file, so extract the block 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/buzz-agent/src/llm.rs"},"region":{"startLine":2550}}}],"partialFingerprints":{"codehealthFindingId/v1":"1117c492576351de25ced3295e97bdd4cc4ff226b35795e65479fc5260527e42"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): crates/buzz-db/src/store/channel.rs:629-640 | crates/buzz-db/src/store/channel.rs:654-665 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/channel.rs"},"region":{"startLine":629}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5ddb5c73227421e84c0f8d4903420948591fdd33707adcbbbc737783ebc3797"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): crates/buzz-db/src/store/workflow.rs:646-657 | crates/buzz-db/src/store/workflow.rs:705-717 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/workflow.rs"},"region":{"startLine":646}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c3dc1f406f36d219d7e7a53077dc7053fff3041e943b97f31b76f0d965256d7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201312 lines \u00D7 2): crates/buzz-pairing-cli/src/main.rs:159-170 | crates/buzz-pairing-cli/src/main.rs:290-299 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-pairing-cli/src/main.rs"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ebe35de98134cec2c617401e47483c4359bffb57b00f9a8c3791126e7f323b2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): crates/buzz-relay/src/api/bridge.rs:1389-1400 | crates/buzz-relay/src/api/bridge.rs:1981-1992 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/api/bridge.rs"},"region":{"startLine":1389}}}],"partialFingerprints":{"codehealthFindingId/v1":"81eeb0e997e8383b52f229c66c9a3e31c1107b812ffa3d781b6192180f566cab"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): crates/buzz-relay/src/api/git/cas_publish.rs:878-889 | crates/buzz-relay/src/api/git/transport.rs:1478-1489 \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/buzz-relay/src/api/git/cas_publish.rs"},"region":{"startLine":878}}}],"partialFingerprints":{"codehealthFindingId/v1":"2dad30c3f175fb32e9e37730d5a574a660b7ad878bfb25a0828ea155f133fb1a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): crates/buzz-relay/src/api/git/store.rs:371-382 | crates/buzz-relay/src/api/git/store.rs:397-408 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/api/git/store.rs"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"c60bc607f5f4eb56cd58238aeb5082489bfe2b1a682c3f1eefc026c0c133ddb9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u201312 lines \u00D7 2): crates/buzz-relay/src/handlers/command_executor.rs:494-505 | crates/buzz-relay/src/handlers/command_executor.rs:604-611 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/command_executor.rs"},"region":{"startLine":494}}}],"partialFingerprints":{"codehealthFindingId/v1":"e25c6ac6fd69aed2a4a2644cd450aca7bdab0a5208ba2e0f1a10804e3d41c174"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): crates/buzz-sdk/src/broker/actions/args.rs:529-540 | crates/buzz-sdk/src/broker/actions/outcomes.rs:244-255 \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/buzz-sdk/src/broker/actions/args.rs"},"region":{"startLine":529}}}],"partialFingerprints":{"codehealthFindingId/v1":"282dda349abd60794c84ea5bd1894b09e3aef8cd4033e3bb0195511a975acbe9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): crates/buzz-voice/src/pocket_april.rs:562-573 | crates/buzz-voice/src/pocket_april.rs:872-883 \u2014 both copies are in the same file, so extract the block 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/buzz-voice/src/pocket_april.rs"},"region":{"startLine":562}}}],"partialFingerprints":{"codehealthFindingId/v1":"acc3dad0ad65631bf54c2797c7abf336c41f1ee9a9249b83173d9714936cfee3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201312 lines \u00D7 2): desktop/src-tauri/src/archive/store.rs:669-680 | desktop/src-tauri/src/archive/store.rs:822-831 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/archive/store.rs"},"region":{"startLine":669}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a07f2005763b2451707e348fb3a00e25ef302517e4d34b7072ae158d3b7b169"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): desktop/src-tauri/src/commands/agent_discovery.rs:649-660 | desktop/src-tauri/src/commands/global_agent_config.rs:379-390 \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":"desktop/src-tauri/src/commands/agent_discovery.rs"},"region":{"startLine":649}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9a70f5323324e8d7d6e749f4e4b9bf57629d8e0b87f9bc130b07d690ff7ec6b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): desktop/src-tauri/src/archive/store_migrations.rs:221-232 | desktop/src-tauri/src/archive/store_migrations.rs:294-308 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/archive/store_migrations.rs"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"edc3441ea4c60a51bf8538e896682209fd63ede998bd94f56a5ed629665e2b83"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): desktop/src-tauri/src/commands/agents.rs:798-809 | desktop/src-tauri/src/commands/agents.rs:961-972 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/commands/agents.rs"},"region":{"startLine":798}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7c0ed889838c074cbe9a3a514439824a6c88d303d86424308a153060bc2a3f8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 4): crates/buzz-acp/src/relay.rs:1788-1808 | crates/buzz-acp/src/relay.rs:2047-2057 | crates/buzz-acp/src/relay.rs:2086-2096 | crates/buzz-acp/src/relay.rs:2119-2129 \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/buzz-acp/src/relay.rs"},"region":{"startLine":1788}}}],"partialFingerprints":{"codehealthFindingId/v1":"96c7f2cc16851c56b5849da2f8838670119bd8dc9f95726df87b3a76b9087a63"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): crates/buzz-relay/src/api/admin/mod.rs:488-498 | crates/buzz-relay/src/api/admin/mod.rs:696-706 | crates/buzz-relay/src/api/admin/mod.rs:780-790 \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/buzz-relay/src/api/admin/mod.rs"},"region":{"startLine":488}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d4da37b4ef0a98a17fd5447967ef8c9aad145160bef923bdffff0f63fc06c5c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): crates/buzz-relay/src/api/bridge.rs:2663-2673 | crates/buzz-relay/src/api/gifs.rs:130-140 | crates/buzz-relay/src/api/workflows.rs:56-66 \u2014 before extracting anything, compare \u0060crates/buzz-relay/src/api/bridge.rs\u0060 and \u0060crates/buzz-relay/src/api/workflows.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 30 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/bridge.rs"},"region":{"startLine":2663}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd1606f64de94914da725ce32f2cd87ecf0c4a508060e969f77e70037291c07f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): crates/buzz-admin/src/main.rs:323-333 | crates/buzz-admin/src/main.rs:361-371 \u2014 both copies are in the same file, so extract the block 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/buzz-admin/src/main.rs"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"4db61f61b25ee85ca8a2072635055da2e41e28e51c0e73ae1ca09f4e2e72c699"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): crates/buzz-cli/src/commands/agents.rs:34-44 | crates/buzz-cli/src/commands/agents.rs:76-86 \u2014 both copies are in the same file, so extract the block 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/buzz-cli/src/commands/agents.rs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a25dfe4467cbbeb692f50c55756727d0f2d0bdb810900bfc1d58c8e0cec8839"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): crates/buzz-db/src/store/channel_members.rs:506-516 | crates/buzz-db/src/store/channel_members.rs:626-636 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/channel_members.rs"},"region":{"startLine":506}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4c44e3faadcf98482728a10c946fddd89bb242e4d5bd8c1cdd2bba5925fc078"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): crates/buzz-db/src/store/channel_members.rs:1420-1430 | crates/buzz-db/src/store/event.rs:1156-1166 \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/buzz-db/src/store/channel_members.rs"},"region":{"startLine":1420}}}],"partialFingerprints":{"codehealthFindingId/v1":"4731bcb3b989434b6d90a053a76a41c6fc4ebe6a827806996b0abf75fbd0d0e9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): crates/buzz-pair-relay/src/lib.rs:299-309 | crates/buzz-pair-relay/src/lib.rs:583-593 \u2014 both copies are in the same file, so extract the block 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/buzz-pair-relay/src/lib.rs"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"85a59e6c917799b3a8474d432dd94b7e0336838e49041a23767087a33580f0f9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201311 lines \u00D7 2): crates/buzz-pair-relay/src/lib.rs:390-399 | crates/buzz-relay/src/handlers/ingest.rs:1922-1932 \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/buzz-pair-relay/src/lib.rs"},"region":{"startLine":390}}}],"partialFingerprints":{"codehealthFindingId/v1":"74ca9c01adf7e59ae4145fe4fa66b10b1378b05f9e5d38367672eaea8f78f8db"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): crates/buzz-relay/src/api/gifs.rs:155-165 | crates/buzz-relay/src/api/workflows.rs:87-97 \u2014 before extracting anything, compare \u0060crates/buzz-relay/src/api/gifs.rs\u0060 and \u0060crates/buzz-relay/src/api/workflows.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 31 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/gifs.rs"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"359487b62f295a872158c225c36398ce3b69b114de4d63aadac0fc75deaf1061"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): crates/buzz-relay/src/handlers/ingest.rs:613-623 | crates/buzz-relay/src/handlers/side_effects.rs:2495-2505 \u2014 before extracting anything, compare \u0060crates/buzz-relay/src/handlers/ingest.rs\u0060 and \u0060crates/buzz-relay/src/handlers/side_effects.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 40 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":613}}}],"partialFingerprints":{"codehealthFindingId/v1":"d495c7db2ed65ab9b1289c00f085fa86e7edb9e28c5763b57d132b320cc49f2f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): crates/buzz-relay/src/handlers/side_effects.rs:3255-3265 | crates/buzz-relay/src/handlers/side_effects.rs:3708-3718 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/side_effects.rs"},"region":{"startLine":3255}}}],"partialFingerprints":{"codehealthFindingId/v1":"30d686c835ae6dd61baa98fa8e71f032e3eead574ddf392069782c320db9195f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): crates/buzz-relay/src/handlers/admin_action_worker.rs:49-59 | crates/buzz-relay/src/handlers/admin_outbox_worker.rs:50-60 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/admin_action_worker.rs"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"c421e7fd41f99a3c3f84ab8b49a6a64c0c79a880d65454894807929d1db8d792"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201311 lines \u00D7 2): crates/buzz-relay/src/handlers/imeta.rs:401-411 | desktop/src-tauri/src/link_preview_tags.rs:31-40 \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/buzz-relay/src/handlers/imeta.rs"},"region":{"startLine":401}}}],"partialFingerprints":{"codehealthFindingId/v1":"4447bc65c2e5d87aaf945803a14d6d61c324d73200e3b43fcaadce1ecca6d9f5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201311 lines \u00D7 2): crates/buzz-relay/src/handlers/count.rs:84-92 | crates/buzz-relay/src/handlers/req.rs:114-124 \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/buzz-relay/src/handlers/count.rs"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"9baecec64be6a02793c1931b03ff38ad1b2a19efffa61160cbd45be77abf9949"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): crates/buzz-voice/src/pocket_april.rs:418-428 | crates/buzz-voice/src/pocket_april.rs:496-506 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-voice/src/pocket_april.rs"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"41893ef0d6ef1d327e79a88955e647ac6cad596f30e68c121dc45762ac5bd22b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): crates/buzz-voice/src/pocket_april.rs:632-642 | crates/buzz-voice/src/pocket_april.rs:921-931 \u2014 both copies are in the same file, so extract the block 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/buzz-voice/src/pocket_april.rs"},"region":{"startLine":632}}}],"partialFingerprints":{"codehealthFindingId/v1":"9af4910039fc4a3a4ad81c0f11d73c947b898364844ba70313db3bc477e13738"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): crates/buzz-ws-client/src/connection.rs:205-215 | crates/buzz-ws-client/src/connection.rs:259-269 \u2014 both copies are in the same file, so extract the block 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/buzz-ws-client/src/connection.rs"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f08258f75df5163057f4ba5b1636a4de346469256b6887cd7b520a04e4bd05f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): desktop/src-tauri/src/commands/agent_discovery.rs:591-601 | desktop/src-tauri/src/commands/global_agent_config.rs:326-336 \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":"desktop/src-tauri/src/commands/agent_discovery.rs"},"region":{"startLine":591}}}],"partialFingerprints":{"codehealthFindingId/v1":"40b540923591fd4cde4b3bb5b26e9a8574f400f99988b5ee98c33bde95047ead"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): desktop/src-tauri/src/commands/messages.rs:273-283 | desktop/src-tauri/src/commands/messages.rs:381-391 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/messages.rs"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"b38783999b9d8f3bcc6c07f21a52fbc332cb61ccf23838975b9706eff1403e29"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): desktop/src-tauri/src/commands/personas/snapshot/import.rs:772-782 | desktop/src-tauri/src/commands/team_snapshot.rs:873-883 \u2014 before extracting anything, compare \u0060desktop/src-tauri/src/commands/personas/snapshot/import.rs\u0060 and \u0060desktop/src-tauri/src/commands/team_snapshot.rs\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 105 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/personas/snapshot/import.rs"},"region":{"startLine":772}}}],"partialFingerprints":{"codehealthFindingId/v1":"86dc29bfea6e75a166ad0e3bb86665b495c529f891051f12f93b22f133e73800"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): desktop/src-tauri/src/commands/project_git_branches.rs:58-68 | desktop/src-tauri/src/commands/project_git_branches.rs:136-146 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/commands/project_git_branches.rs"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"623fd58f78bdbd8d95451879affae0203914f0cdec49329e8b52eafa9427b17f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): desktop/src-tauri/src/managed_agents/agent_snapshot.rs:371-381 | desktop/src-tauri/src/managed_agents/team_snapshot.rs:149-159 \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":"desktop/src-tauri/src/managed_agents/agent_snapshot.rs"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"821f36d5255745cabdc9acc9073be1783ed45a9a97b94161feb805ffd41e515b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u201311 lines \u00D7 2): desktop/src-tauri/src/commands/media_transcode.rs:480-490 | desktop/src-tauri/src/commands/media_transcode.rs:510-516 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/media_transcode.rs"},"region":{"startLine":480}}}],"partialFingerprints":{"codehealthFindingId/v1":"67df508fb167bfd0d117fc797ba6246724d7eb1fd7e7585c5f34a7f1b19f2f2f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): desktop/src-tauri/src/managed_agents/config_bridge/reader.rs:330-340 | desktop/src-tauri/src/managed_agents/config_bridge/reader.rs:489-499 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/config_bridge/reader.rs"},"region":{"startLine":330}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a8b3d844fd6c11cb23a9cd704fec065eeda09ae92e680b59f4e8c42b2a897b8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 4): crates/buzz-relay/src/handlers/command_executor.rs:336-345 | crates/buzz-relay/src/handlers/command_executor.rs:498-507 | crates/buzz-relay/src/handlers/command_executor.rs:604-613 | crates/buzz-relay/src/handlers/command_executor.rs:741-750 \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/buzz-relay/src/handlers/command_executor.rs"},"region":{"startLine":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf38627409b81ab1dc620cb194b37a1fb4593b5888aedcd965c928fa0e59412f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): crates/buzz-relay/src/api/bridge.rs:2661-2670 | crates/buzz-relay/src/api/invites.rs:237-246 | crates/buzz-relay/src/api/workflows.rs:54-63 \u2014 before extracting anything, compare \u0060crates/buzz-relay/src/api/bridge.rs\u0060 and \u0060crates/buzz-relay/src/api/workflows.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 30 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/bridge.rs"},"region":{"startLine":2661}}}],"partialFingerprints":{"codehealthFindingId/v1":"df9f6dabd2c075f4aec726b8f80f38361e3c23e262420156fed06b42495d6cf7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): crates/buzz-relay/src/tunnel/directory.rs:249-258 | crates/buzz-relay/src/tunnel/directory.rs:304-313 | crates/buzz-relay/src/tunnel/directory.rs:349-358 \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/buzz-relay/src/tunnel/directory.rs"},"region":{"startLine":249}}}],"partialFingerprints":{"codehealthFindingId/v1":"229e4d4ea4e0a44203146c53ad0ee3c4a200ba648b80700919fd0e6a59a6c47c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/buzz-acp/src/queue.rs:2083-2092 | crates/buzz-acp/src/queue.rs:2126-2135 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/queue.rs"},"region":{"startLine":2083}}}],"partialFingerprints":{"codehealthFindingId/v1":"57811e283275a970d6ad860612d3a10f2659290ba9beeebdfaf5c84db5fc2c73"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/buzz-acp/src/relay.rs:3734-3743 | crates/buzz-ws-client/src/message.rs:81-90 \u2014 before extracting anything, compare \u0060crates/buzz-acp/src/relay.rs\u0060 and \u0060crates/buzz-ws-client/src/message.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 40 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/relay.rs"},"region":{"startLine":3734}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5dfd467358d1d30773938bf1ec30f55b2c067683f13afce35a303fcf7ad5328"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/buzz-cli/src/commands/social.rs:50-59 | desktop/src-tauri/src/commands/social.rs:108-117 \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/buzz-cli/src/commands/social.rs"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"566364fb920169052f2d8aa746d4768b9b099fa9844e283d64b58a1a4393fe4b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/buzz-db/src/store/deletion.rs:2922-2931 | crates/buzz-db/src/store/deletion.rs:2939-2948 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/deletion.rs"},"region":{"startLine":2922}}}],"partialFingerprints":{"codehealthFindingId/v1":"c745ec31990deb2fbf970f836629548d21dc8bf417ea090098a30d791a0860e9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/buzz-db/src/store/event.rs:713-722 | crates/buzz-db/src/store/event.rs:1347-1356 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/event.rs"},"region":{"startLine":713}}}],"partialFingerprints":{"codehealthFindingId/v1":"29841f22e0fc035c1b77725142aea8b998af4427437193c8a7d3df54e816441d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/buzz-dev-mcp/src/shell.rs:550-559 | desktop/src-tauri/src/managed_agents/git_bash.rs:408-417 \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/buzz-dev-mcp/src/shell.rs"},"region":{"startLine":550}}}],"partialFingerprints":{"codehealthFindingId/v1":"caa380cbe057308bccc64c5566ec60c2dec4a4c94ba43299a31848e4d509acb6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u201310 lines \u00D7 2): crates/buzz-relay/src/api/invites.rs:451-458 | crates/buzz-relay/src/api/invites.rs:529-538 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/api/invites.rs"},"region":{"startLine":451}}}],"partialFingerprints":{"codehealthFindingId/v1":"398b0cff51c0b5fdb2cbb5fcf01177413c3fae8b456dd769edc42fe4babba353"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 2): crates/buzz-relay/src/handlers/event.rs:937-946 | crates/buzz-relay/src/handlers/event.rs:1130-1138 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/event.rs"},"region":{"startLine":937}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ca6e9ea04d9485c95a5b6fdd880b1a033ce23369f67041c68f7c029eaf2e49b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/buzz-relay/src/handlers/identity_archive.rs:143-152 | crates/buzz-relay/src/handlers/relay_admin.rs:236-245 \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/buzz-relay/src/handlers/identity_archive.rs"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"0aa0267248d8882f8726d69326bfcd76e054687a0312bf87da70cc1b84803b4e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/buzz-relay/src/handlers/ingest.rs:643-652 | crates/buzz-relay/src/handlers/side_effects.rs:2446-2455 \u2014 before extracting anything, compare \u0060crates/buzz-relay/src/handlers/ingest.rs\u0060 and \u0060crates/buzz-relay/src/handlers/side_effects.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 40 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":643}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecf3ac67555c4b40681c3b3941495048a61751444f1223b96445b94e3ad7f6fb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/buzz-relay/src/handlers/ingest.rs:1244-1253 | crates/buzz-relay/src/handlers/ingest.rs:1330-1339 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":1244}}}],"partialFingerprints":{"codehealthFindingId/v1":"b75fe6fa3d2ff8286094b300894e4ea73bd5d6f8bed6b6f7cc9fd1ca9401ef83"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/buzz-relay/src/protocol.rs:98-107 | crates/buzz-relay/src/protocol.rs:169-178 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/protocol.rs"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"48d61116382794f8c3555f4832e3b00c8db58f4df8847f97bb6794642b20e949"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/buzz-voice/src/pocket_april.rs:406-415 | crates/buzz-voice/src/pocket_april.rs:484-493 \u2014 both copies are in the same file, so extract the block 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/buzz-voice/src/pocket_april.rs"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"d18be7d29f84d97bf87376e67eb9ff6b2f0d67a82dababd5b15f85dd97db40e1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): desktop/src-tauri/src/commands/admin/mod.rs:969-978 | desktop/src-tauri/src/commands/admin/mod.rs:1005-1014 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/commands/admin/mod.rs"},"region":{"startLine":969}}}],"partialFingerprints":{"codehealthFindingId/v1":"c10cf326472e59780f24e52bcbc9356eac107cc10136298d99a3d2e885aab8b4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): desktop/src-tauri/src/commands/personas/snapshot/import.rs:802-811 | desktop/src-tauri/src/commands/team_snapshot.rs:903-912 \u2014 before extracting anything, compare \u0060desktop/src-tauri/src/commands/personas/snapshot/import.rs\u0060 and \u0060desktop/src-tauri/src/commands/team_snapshot.rs\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 105 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/personas/snapshot/import.rs"},"region":{"startLine":802}}}],"partialFingerprints":{"codehealthFindingId/v1":"756e850f422aba4118268ab7fbeb8d069f77dc2c574c2540796e9976fc6fc649"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): desktop/src-tauri/src/huddle/pipeline.rs:456-465 | desktop/src-tauri/src/huddle/pipeline.rs:582-591 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/huddle/pipeline.rs"},"region":{"startLine":456}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c9bed8384d86fff83cafc705d892e16c755a0c13e310e74f401e1f72c6cb3d6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u201310 lines \u00D7 2): desktop/src-tauri/src/huddle/playout.rs:544-553 | desktop/src-tauri/src/huddle/playout.rs:583-590 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/huddle/playout.rs"},"region":{"startLine":544}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a6e03a844a74988577d5888b02508ec4e46650874b535833ae0363517d21452"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): desktop/src-tauri/src/managed_agents/effective_config/mod.rs:82-91 | desktop/src-tauri/src/managed_agents/effective_config/mod.rs:196-205 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/managed_agents/effective_config/mod.rs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7235a458a96a53c549d245182538188d712fda6b38d24e362ccbb11c3e67da9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): desktop/src-tauri/src/mesh_llm/mod.rs:689-698 | desktop/src-tauri/src/mesh_llm/mod.rs:705-714 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/mesh_llm/mod.rs"},"region":{"startLine":689}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e6dc67648103e5b45eadb28535badf97642b89e338abeb202d7003a96522f0b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): desktop/src-tauri/src/persona_catalog.rs:152-161 | desktop/src-tauri/src/team_catalog.rs:234-243 \u2014 before extracting anything, compare \u0060desktop/src-tauri/src/persona_catalog.rs\u0060 and \u0060desktop/src-tauri/src/team_catalog.rs\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 41 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/persona_catalog.rs"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"cff482c4ed18fd1f260967150e596538317101def93f807bde4cd87d262a73f3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): desktop/src-tauri/src/persona_catalog.rs:166-175 | desktop/src-tauri/src/team_catalog.rs:248-257 \u2014 before extracting anything, compare \u0060desktop/src-tauri/src/persona_catalog.rs\u0060 and \u0060desktop/src-tauri/src/team_catalog.rs\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 41 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/persona_catalog.rs"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"055a8b4765e717322f463948f5a7987d55aa356f7c4e2a724979eef550b75127"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 2): desktop/src-tauri/src/commands/media_transcode.rs:147-156 | desktop/src-tauri/src/commands/relay_reconnect.rs:65-73 \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":"desktop/src-tauri/src/commands/media_transcode.rs"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f91a2c899d6664aba6029660f059bbea543ff50070b02fe5331b9299fed4faf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 6): desktop/src-tauri/src/commands/agent_config.rs:262-270 | desktop/src-tauri/src/commands/agent_models.rs:42-50 | desktop/src-tauri/src/commands/agent_models_update.rs:150-158 | desktop/src-tauri/src/commands/agents.rs:380-388 | desktop/src-tauri/src/commands/agents.rs:451-459 | desktop/src-tauri/src/commands/agents.rs:874-882 \u2014 there are 6 copies across 4 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 6 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/agent_config.rs"},"region":{"startLine":262}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2549d448973e2c8f7de19672b682e76c2fcceb7f31a30dffee93265e6b419e8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 5): crates/buzz-relay/src/handlers/command_executor.rs:337-345 | crates/buzz-relay/src/handlers/command_executor.rs:499-507 | crates/buzz-relay/src/handlers/command_executor.rs:742-750 | crates/buzz-relay/src/handlers/command_executor.rs:1065-1073 | crates/buzz-relay/src/handlers/command_executor.rs:1176-1184 \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/buzz-relay/src/handlers/command_executor.rs"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"260310777b433679df92380a6326b3ea18ba64e8eac2705ce7778c065aa53109"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u20139 lines \u00D7 4): crates/buzz-cli/src/commands/notes.rs:174-182 | crates/buzz-cli/src/commands/notes.rs:357-363 | crates/buzz-cli/src/commands/projects.rs:268-274 | crates/buzz-cli/src/commands/repos.rs:25-31 \u2014 there are 4 copies across 3 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 4 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/notes.rs"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"b595a3ec8ad9267f314a5050b38db9a7983618da9b1dc31d8973c50689f5cef1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 4): crates/buzz-relay/src/api/bridge.rs:2663-2671 | crates/buzz-relay/src/api/gifs.rs:130-138 | crates/buzz-relay/src/api/invites.rs:239-247 | crates/buzz-relay/src/api/workflows.rs:56-64 \u2014 before extracting anything, compare \u0060crates/buzz-relay/src/api/bridge.rs\u0060 and \u0060crates/buzz-relay/src/api/workflows.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 30 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/bridge.rs"},"region":{"startLine":2663}}}],"partialFingerprints":{"codehealthFindingId/v1":"02f2159b0049ce9ad5f1685b7a2715dc525b76b84253bfe7ceb1a3b7f126388e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): crates/buzz-cli/src/commands/issues.rs:582-590 | crates/buzz-cli/src/commands/patches.rs:183-191 | crates/buzz-cli/src/commands/pr.rs:216-224 \u2014 before extracting anything, compare \u0060crates/buzz-cli/src/commands/issues.rs\u0060 and \u0060crates/buzz-cli/src/commands/patches.rs\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 72 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/issues.rs"},"region":{"startLine":582}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b2094ace43d34b417487abdc67472aceb015468a0e5ce79976397dba980c436"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): crates/buzz-cli/src/commands/mem.rs:94-102 | crates/buzz-cli/src/commands/notes.rs:545-553 | crates/buzz-cli/src/commands/notes.rs:733-741 \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/buzz-cli/src/commands/mem.rs"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"9644711c8e9b54a54a6f5bd78bc8897370a9f1a39c5fa13284edde57206298c6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): desktop/src-tauri/src/commands/agents.rs:223-231 | desktop/src-tauri/src/managed_agents/restore.rs:373-381 | desktop/src-tauri/src/shutdown.rs:133-141 \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":"desktop/src-tauri/src/commands/agents.rs"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0622e1653aca028b2e12321bb0dd5ee57b10858fb13de1e6ba18ee419c7bf8b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/buzz-acp/src/lib.rs:2885-2893 | crates/buzz-acp/src/lib.rs:2906-2914 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/lib.rs"},"region":{"startLine":2885}}}],"partialFingerprints":{"codehealthFindingId/v1":"4154a7f7227877678870de05933ca0f45e4d30862aa776eab36a8c3341d9f477"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/buzz-acp/src/relay.rs:3556-3564 | crates/buzz-acp/src/relay.rs:3583-3591 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/relay.rs"},"region":{"startLine":3556}}}],"partialFingerprints":{"codehealthFindingId/v1":"e178fa9eeb5ccc05d716627b89904cb978b85bc4df80e5ac9aae66703b0637ce"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/buzz-agent/src/llm.rs:577-585 | crates/buzz-agent/src/llm.rs:745-753 \u2014 both copies are in the same file, so extract the block 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/buzz-agent/src/llm.rs"},"region":{"startLine":577}}}],"partialFingerprints":{"codehealthFindingId/v1":"aee364f3c7c7d84bba7bda0eceab84fe6707ebf09a9fc4c99dc6938989e4734f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u20139 lines \u00D7 2): crates/buzz-cli/src/commands/projects.rs:490-497 | crates/buzz-cli/src/commands/repos.rs:311-319 \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/buzz-cli/src/commands/projects.rs"},"region":{"startLine":490}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2cc5638a6dd4dc2564f7d2321ff3faaf06c5a7748d9edbebb15de40f686146c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u20139 lines \u00D7 2): crates/buzz-db/src/store/event.rs:519-527 | crates/buzz-db/src/store/event.rs:803-810 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/event.rs"},"region":{"startLine":519}}}],"partialFingerprints":{"codehealthFindingId/v1":"c80c215123780ad21c3f48f26f9c405a0952768839f702bf1e9cf64992fe133e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/buzz-persona/src/validate.rs:211-219 | crates/buzz-persona/src/validate.rs:303-311 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-persona/src/validate.rs"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"2daa9ab834cd7d247ca4e6611f79d802e55d8a0168ece2602e4135ee4d82279b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/buzz-relay/src/api/bridge.rs:2246-2254 | crates/buzz-relay/src/handlers/req.rs:634-648 \u2014 before extracting anything, compare \u0060crates/buzz-relay/src/api/bridge.rs\u0060 and \u0060crates/buzz-relay/src/handlers/req.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 48 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/bridge.rs"},"region":{"startLine":2246}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bc6de2b12f4729401ec06185d89d665342f6a0a112e1c81678e78da7e97c69c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u20139 lines \u00D7 2): crates/buzz-relay/src/api/git/cas_publish.rs:611-618 | crates/buzz-relay/src/api/git/cas_publish.rs:719-727 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/git/cas_publish.rs"},"region":{"startLine":611}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1e6d3a08d76648209bac47560198de11ea3aa616c2f485d80474ec54bd0bc90"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u20139 lines \u00D7 2): crates/buzz-relay/src/handlers/auth.rs:170-177 | crates/buzz-relay/src/handlers/auth.rs:192-200 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/auth.rs"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c24a5b9d56abda241767df91ff1b597124d8e54e66795d4e947acbc67cdd712"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/buzz-relay/src/handlers/ingest.rs:1018-1026 | crates/buzz-relay/src/handlers/ingest.rs:1127-1135 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":1018}}}],"partialFingerprints":{"codehealthFindingId/v1":"421dc87fe2b0a7a551ef816785c990e5f16d8f753d9ea7e55b8023ff913f5751"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/buzz-relay/src/handlers/side_effects.rs:1520-1528 | crates/buzz-relay/src/handlers/side_effects.rs:2180-2188 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/side_effects.rs"},"region":{"startLine":1520}}}],"partialFingerprints":{"codehealthFindingId/v1":"226609e7b7e7a8dfda735a8c9ba0d89a6125cbbf00422e4c9f81afb3d985816b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/buzz-relay/src/main.rs:1658-1666 | crates/buzz-relay/src/main.rs:1683-1691 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/main.rs"},"region":{"startLine":1658}}}],"partialFingerprints":{"codehealthFindingId/v1":"44cf18b8b7fbe5313dce105aebbc64f159a397121fe1d2af2318903e4558b072"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u20139 lines \u00D7 2): crates/buzz-relay/src/handlers/req.rs:418-425 | crates/buzz-relay/src/handlers/req.rs:745-753 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/req.rs"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"a056e1737a1f6d7d50bce2fc3623a8c566332c95da92b50f86ce393914e4898d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/buzz-voice/src/pocket_april.rs:655-663 | crates/buzz-voice/src/pocket_april.rs:946-954 \u2014 both copies are in the same file, so extract the block 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/buzz-voice/src/pocket_april.rs"},"region":{"startLine":655}}}],"partialFingerprints":{"codehealthFindingId/v1":"de692c5a1c8f68b2264f095f8430bde4401d74d2cfa7ce83d6a017bc11cb72f6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/buzz-ws-client/src/connection.rs:134-142 | crates/buzz-ws-client/src/connection.rs:244-252 \u2014 both copies are in the same file, so extract the block 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/buzz-ws-client/src/connection.rs"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"af0b20f860509c44ea70525783246bcb47a140edabcd34d6f3d5a750577cfdee"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/git-sign-nostr/src/lib.rs:662-670 | crates/git-sign-nostr/src/lib.rs:716-724 \u2014 both copies are in the same file, so extract the block 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/git-sign-nostr/src/lib.rs"},"region":{"startLine":662}}}],"partialFingerprints":{"codehealthFindingId/v1":"b72a204ab951ec279d2b8863a765c49d5b5ae03b905631faccd2279daec51188"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/git-sign-nostr/src/lib.rs:1585-1593 | crates/git-sign-nostr/src/lib.rs:1611-1619 \u2014 both copies are in the same file, so extract the block 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/git-sign-nostr/src/lib.rs"},"region":{"startLine":1585}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dcef8f9bfdd2d4e71185d4d2a162e2557f3a5799fff8b70235b31c11a127721"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): desktop/src-tauri/crates/buzz-terminal/src/damage.rs:217-225 | desktop/src-tauri/crates/buzz-terminal/src/damage.rs:277-285 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/crates/buzz-terminal/src/damage.rs"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"887a8b352637f88693438c24f87e732aa9a1e33fb78941071d2921b195122ba4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): desktop/src-tauri/src/archive/store.rs:174-182 | desktop/src-tauri/src/managed_agents/retention.rs:156-164 \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":"desktop/src-tauri/src/archive/store.rs"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"68d173cda9fa834c10c511cab8ba42d9e1d5f1f2e989d18cc6abf12e97760a78"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): desktop/src-tauri/src/commands/channels/fetch.rs:230-238 | desktop/src-tauri/src/commands/channels/fetch.rs:334-342 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/commands/channels/fetch.rs"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"6311b71acb3688db54c94f48ff5ebc21efecea1947725fd6f1647f0036a2b30f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): desktop/src-tauri/src/managed_agents/readiness.rs:588-596 | desktop/src-tauri/src/managed_agents/readiness.rs:607-615 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/managed_agents/readiness.rs"},"region":{"startLine":588}}}],"partialFingerprints":{"codehealthFindingId/v1":"60ce71a9cd997e5d883843be4b9494ceaffe29065b2f95b6cfc46dc9c8c74815"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): desktop/src-tauri/src/managed_agents/runtime_commands.rs:324-332 | desktop/src-tauri/src/shutdown.rs:128-136 \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":"desktop/src-tauri/src/managed_agents/runtime_commands.rs"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1a304f7b24b94dac554aad3322f7b9eb974a0812bc8c53ea84601aa30289208"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): desktop/src-tauri/src/managed_agents/teams.rs:17-25 | desktop/src-tauri/src/templates/storage.rs:23-31 \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":"desktop/src-tauri/src/managed_agents/teams.rs"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c7c90db0316e0a38407eaa32bb42c65178da8e5758e833ae5a8004c7c607282"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): desktop/src-tauri/src/managed_agents/teams.rs:167-175 | desktop/src-tauri/src/managed_agents/teams.rs:185-193 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/teams.rs"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"60144b2423909f431125fe060d26bf6613a63bc0a4d59f6cd9d0e617eb43e074"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): desktop/src-tauri/src/relay.rs:244-252 | desktop/src-tauri/src/relay.rs:289-297 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/relay.rs"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"15712bd390ab8df7399012c0f9f52f4f0bea062f4f5e1302650c3d00d41ce284"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): desktop/src-tauri/src/commands/project_git.rs:264-272 | desktop/src-tauri/src/commands/project_git.rs:334-342 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/commands/project_git.rs"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"21745b536401c2afec6162a7a992ab077b709b57941125bbd35349cd8d3ea98d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): desktop/src-tauri/src/commands/project_git.rs:809-817 | desktop/src-tauri/src/commands/project_git.rs:840-848 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/commands/project_git.rs"},"region":{"startLine":809}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f66264f1b8376926d0771bc37e96722b26b64ab67b77864c805b3c3a7ca366e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): desktop/src-tauri/src/commands/social.rs:387-395 | desktop/src-tauri/src/nostr_convert.rs:385-393 \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":"desktop/src-tauri/src/commands/social.rs"},"region":{"startLine":387}}}],"partialFingerprints":{"codehealthFindingId/v1":"df89f210ee98190e08fb930da8f0e89d1546c40a4ab1369ac9a85589f43d1476"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): crates/buzz-cli/src/client.rs:794-801 | crates/buzz-cli/src/client.rs:824-831 | crates/buzz-cli/src/client.rs:882-889 \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/buzz-cli/src/client.rs"},"region":{"startLine":794}}}],"partialFingerprints":{"codehealthFindingId/v1":"20b3188fd1502add5d5bafce645238caaf96995533a88036c5e4bf47e5e515e1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): crates/buzz-cli/src/commands/issues.rs:515-522 | crates/buzz-cli/src/commands/patches.rs:106-113 | crates/buzz-cli/src/commands/pr.rs:151-158 \u2014 before extracting anything, compare \u0060crates/buzz-cli/src/commands/issues.rs\u0060 and \u0060crates/buzz-cli/src/commands/patches.rs\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 72 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/issues.rs"},"region":{"startLine":515}}}],"partialFingerprints":{"codehealthFindingId/v1":"50cb2ede8cbafaa96b21962a1cdbe5767d70f80e007bfe1091e04f29935cae89"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): desktop/src-tauri/src/managed_agents/nest.rs:227-234 | desktop/src-tauri/src/managed_agents/nest.rs:240-247 | desktop/src-tauri/src/managed_agents/nest.rs:267-274 \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":"desktop/src-tauri/src/managed_agents/nest.rs"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"81df6cb3429beaa4d6589f922dc15c9c738ae82ff6917706bdc09062405d3717"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (3\u20138 lines \u00D7 4): crates/buzz-acp/src/relay.rs:1841-1844 | crates/buzz-acp/src/relay.rs:2444-2451 | crates/buzz-acp/src/relay.rs:2747-2753 | crates/buzz-acp/src/relay/recovery.rs:47-49 \u2014 there are 4 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 4 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/relay.rs"},"region":{"startLine":1841}}}],"partialFingerprints":{"codehealthFindingId/v1":"69d4cae5eda304843cfc6e3c251d3f9d9b71f4b32bcc4e7434e003f5804b2539"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/buzz-acp/src/relay.rs:3369-3376 | crates/buzz-acp/src/relay.rs:3424-3431 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/relay.rs"},"region":{"startLine":3369}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b79dce940e12cdec1d94153910aa22875e038dc9f87ef5593abcd588f42a1e9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/buzz-cli/src/commands/channels.rs:233-240 | crates/buzz-cli/src/commands/channels.rs:256-263 \u2014 both copies are in the same file, so extract the block 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/buzz-cli/src/commands/channels.rs"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a0b52c5e33e3ed2bc2037f18ca4851c64692b81b9b2c37d102df0612ec31840"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/buzz-cli/src/commands/social.rs:34-41 | crates/buzz-cli/src/commands/social.rs:62-69 \u2014 both copies are in the same file, so extract the block 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/buzz-cli/src/commands/social.rs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"57e73f4d1205be4ffc30cfdb5a4dd9b37533d9ba56b5e39b09897d10822cbb93"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/buzz-cli/src/links.rs:115-122 | crates/buzz-relay/src/handlers/side_effects.rs:2649-2656 \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/buzz-cli/src/links.rs"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0644eb7f5fdd3fee7e750c1c54d5baa4fcb56dfe14614043aebc07535966312"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/buzz-cli/src/validate.rs:169-176 | crates/buzz-cli/src/validate.rs:187-194 \u2014 both copies are in the same file, so extract the block 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/buzz-cli/src/validate.rs"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"baf0418ff15b179e6147ce19b97b133bbbf5d936bb7b2bee3e8f85c1ca6fdce1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/buzz-core/src/engram.rs:306-313 | crates/buzz-core/src/private_managed_agent.rs:742-749 \u2014 before extracting anything, compare \u0060crates/buzz-core/src/engram.rs\u0060 and \u0060crates/buzz-core/src/private_managed_agent.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 31 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-core/src/engram.rs"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"d24ad48de53f9b0bc3270df963b483f6e8e439897d6ce27de2b2053c74906dfa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/buzz-relay/src/audio/handler.rs:151-158 | crates/buzz-relay/src/connection.rs:269-276 \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/buzz-relay/src/audio/handler.rs"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"63c7f30241eddf31417baf1dd6933f513309f6b45451ee60197550b6bf5dec5e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/buzz-relay/src/handlers/moderation_commands.rs:541-548 | crates/buzz-relay/src/handlers/moderation_commands.rs:556-563 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/moderation_commands.rs"},"region":{"startLine":541}}}],"partialFingerprints":{"codehealthFindingId/v1":"afdfa7ec49357bc0f7f014663df55d5ba1b53c1d87ce961b4184b47ba2b4a2e9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): desktop/src-tauri/src/commands/agents_profile.rs:113-120 | desktop/src-tauri/src/commands/agents_profile.rs:158-165 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/commands/agents_profile.rs"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"15e44be52b30039f1e0d2deba98f2ac79fdfb998665b48d74c36680897cb8bd0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): desktop/src-tauri/src/commands/personas/card.rs:499-506 | desktop/src-tauri/src/commands/personas/card.rs:557-564 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/personas/card.rs"},"region":{"startLine":499}}}],"partialFingerprints":{"codehealthFindingId/v1":"89c7496969698f499dfe8d438d242deede05c6972dcfe836d1249fde99fa4682"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): desktop/src-tauri/src/commands/personas/sharing.rs:36-43 | desktop/src-tauri/src/commands/teams/sharing.rs:52-59 \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":"desktop/src-tauri/src/commands/personas/sharing.rs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"9eeb05295cf5ac358015bae8264392de794be0b5354066f217656a63beb632dc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): desktop/src-tauri/src/commands/project_git_workflow.rs:253-260 | desktop/src-tauri/src/commands/project_git_workflow.rs:295-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":"desktop/src-tauri/src/commands/project_git_workflow.rs"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdb43af6a9c9034c67e325e2ddf6a693d09864e20b8e2f87151a484c393a7780"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): desktop/src-tauri/src/deep_link.rs:318-325 | desktop/src-tauri/src/deep_link.rs:345-352 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/deep_link.rs"},"region":{"startLine":318}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa0e789656cbda4b0e14622c4ba535897f0910a07299cd547e3543727ee50125"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): desktop/src-tauri/src/events.rs:570-577 | desktop/src-tauri/src/events.rs:591-598 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/events.rs"},"region":{"startLine":570}}}],"partialFingerprints":{"codehealthFindingId/v1":"956ff7b6b32a0abf2d37bb9f7ad2e133601e3a6282a505c3e6a0e1bcb3e1cd62"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): desktop/src-tauri/src/managed_agents/nest.rs:421-428 | desktop/src-tauri/src/managed_agents/nest.rs:470-477 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/nest.rs"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cc7482e0c0cf475e56c685817ea75f96316bd4fbc202515d33c1f1bf8cd2ea9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): desktop/src-tauri/src/mesh_llm/mod.rs:375-382 | desktop/src-tauri/src/mesh_llm/mod.rs:412-419 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/mesh_llm/mod.rs"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"620629f6dc332ba34717951ef2e075de9dcd835f332aefa6125eccdff27afb3e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): desktop/src-tauri/src/commands/media_transcode.rs:157-164 | desktop/src-tauri/src/commands/relay_reconnect.rs:69-76 \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":"desktop/src-tauri/src/commands/media_transcode.rs"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa340d9045d5089d16224272bf1a1ce79c0721429c7bc7aef2d25747333e4bce"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): desktop/src-tauri/src/commands/personas/mod.rs:80-87 | desktop/src-tauri/src/commands/personas/mod.rs:298-305 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/commands/personas/mod.rs"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"501c5e1bb1ee8747fc5a44499dc2b7cb6ce96b0c7e49fea5032512c5b6924536"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): desktop/src-tauri/src/commands/messages/forum.rs:50-57 | desktop/src-tauri/src/commands/messages/forum.rs:93-100 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/commands/messages/forum.rs"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9a8fd7f119661ae77d95b4d87dd1d1f307021b61acc6b604d94244d77736370"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): desktop/src-tauri/src/commands/agents.rs:151-158 | desktop/src-tauri/src/commands/agents.rs:966-973 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/agents.rs"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"f53d505af5c7d677c1970b1887905aa52b1cf7964725183d069851f0cbc9819e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): desktop/src-tauri/src/commands/agents.rs:293-300 | desktop/src-tauri/src/commands/agents.rs:1015-1022 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/commands/agents.rs"},"region":{"startLine":293}}}],"partialFingerprints":{"codehealthFindingId/v1":"26f35e35d2f2d28a0f0240c77cc942a02d0d6f42611b11fd930ccbeca3ad530f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): desktop/src-tauri/src/commands/agent_settings.rs:55-62 | desktop/src-tauri/src/commands/agent_settings.rs:99-106 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/commands/agent_settings.rs"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb9bab6f7d1bb05c62cec7a6146216b50cfcfa5f16ee80c882f8dc1399f00bec"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): desktop/src-tauri/src/commands/social.rs:208-215 | desktop/src-tauri/src/commands/social.rs:284-291 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/social.rs"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"31156aed3d4e1f624bdee7e0a52dc933272bb17e5c91340d55f47148ad78bf6c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): crates/buzz-cli/src/commands/emoji.rs:107-113 | crates/buzz-cli/src/commands/emoji.rs:247-253 | crates/buzz-cli/src/commands/emoji.rs:363-369 \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/buzz-cli/src/commands/emoji.rs"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"acd5d6c907643da230caae51895f505d7ddd1b8e53f4c8ec355c24f500d5f1d7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): crates/buzz-db/src/store/event.rs:1863-1871 | crates/buzz-db/src/store/event.rs:1916-1922 | crates/buzz-db/src/store/event.rs:2227-2233 \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/buzz-db/src/store/event.rs"},"region":{"startLine":1863}}}],"partialFingerprints":{"codehealthFindingId/v1":"f92d410fef6d903846db041b4dd1e00f67ca19d70ad30e26382f02c000a7fd80"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/buzz-acp/src/relay.rs:487-493 | crates/buzz-acp/src/relay.rs:500-506 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/relay.rs"},"region":{"startLine":487}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac931cbe1b9b2f71cd3c6fba2516da8fedee01925f051e12ad80a00ea112d1be"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/buzz-acp/src/relay.rs:3745-3751 | crates/buzz-ws-client/src/message.rs:92-98 \u2014 before extracting anything, compare \u0060crates/buzz-acp/src/relay.rs\u0060 and \u0060crates/buzz-ws-client/src/message.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 40 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/relay.rs"},"region":{"startLine":3745}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1d6c35f7e708260ef2c7af19c2aa284fff9b5898e6c4ad09e644a46ebbd9286"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/buzz-cli/src/commands/dms.rs:42-48 | crates/buzz-cli/src/commands/users.rs:480-486 \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/buzz-cli/src/commands/dms.rs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"8586f5b6f5f2cf8d504ccc577466598842e3a9e87708e5519e04d01edcd5cb09"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/buzz-cli/src/commands/pack.rs:16-22 | crates/buzz-cli/src/commands/pack.rs:53-59 \u2014 both copies are in the same file, so extract the block 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/buzz-cli/src/commands/pack.rs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f1fd73204bce3ce1d8d780991bec99f4559151e4205783bb410c59ce7ef156f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/buzz-db/src/store/api_token.rs:28-35 | crates/buzz-db/src/store/api_token.rs:82-88 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/api_token.rs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e6c71b09cc1b875eddd3feb0e7893e662a7dc8b5771c54b429c7e95503b88f5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/buzz-db/src/store/channel.rs:460-466 | crates/buzz-db/src/store/dm.rs:493-499 \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/buzz-db/src/store/channel.rs"},"region":{"startLine":460}}}],"partialFingerprints":{"codehealthFindingId/v1":"24625d8428585dc9939e8185a25a8c3bb7d612d3551ecee8ec80cd7731feb979"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/buzz-db/src/store/deletion.rs:2604-2610 | crates/buzz-db/src/store/deletion.rs:2673-2679 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/deletion.rs"},"region":{"startLine":2604}}}],"partialFingerprints":{"codehealthFindingId/v1":"57d0aa43c4afdde11d867322ba5b141a91f51e224801d7f94f1faa768d5bc767"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/buzz-db/src/store/deletion.rs:2674-2680 | crates/buzz-db/src/store/deletion.rs:2739-2745 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/deletion.rs"},"region":{"startLine":2674}}}],"partialFingerprints":{"codehealthFindingId/v1":"524fe3ebe32674f45f742f00bf6cc3aad8a194da948013b8b932f07686d0a037"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/buzz-db/src/store/event.rs:2227-2233 | crates/buzz-db/src/store/relay_members.rs:813-819 \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/buzz-db/src/store/event.rs"},"region":{"startLine":2227}}}],"partialFingerprints":{"codehealthFindingId/v1":"e844ce3b8984e766d16b2c516637d1ed4e21764bdda3e9c99bbc067af8b5327a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6\u20137 lines \u00D7 2): crates/buzz-db/src/store/operator_listener.rs:68-74 | desktop/src-tauri/src/huddle/relay_api.rs:631-636 \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/buzz-db/src/store/operator_listener.rs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4df0c8de491b535d4bf61ea9974287e769e8a5bb03ead680138c4eb5c7b9cf1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6\u20137 lines \u00D7 2): crates/buzz-db/src/store/push.rs:774-779 | crates/buzz-db/src/store/push.rs:797-803 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/push.rs"},"region":{"startLine":774}}}],"partialFingerprints":{"codehealthFindingId/v1":"38576fc71a53b282b7732e03fcdf0bb3ae6e4fc28ce85b1f3ed3e4530e6ced49"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/buzz-dev-mcp/src/view_image.rs:263-269 | desktop/src-tauri/src/commands/media.rs:325-331 \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/buzz-dev-mcp/src/view_image.rs"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcad8157e6c36e4f0bdb7ed817f0a11fa4f3552f4bf1157427cb23b2f123b5b8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/buzz-media/src/bucket_index.rs:158-164 | crates/buzz-media/src/bucket_index.rs:182-188 \u2014 both copies are in the same file, so extract the block 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/buzz-media/src/bucket_index.rs"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"b76865f4d4dbb431af1562ff3259158f72e4cc9266ec38d6f434ab2e33899123"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/buzz-relay/src/handlers/community_provisioning.rs:107-117 | crates/buzz-relay/src/handlers/community_provisioning.rs:191-197 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/community_provisioning.rs"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"4740e934e1f9291206d2d1220cad0b56b4c0b652c910e4f809f1487d4d698642"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/buzz-relay/src/handlers/ingest.rs:1234-1240 | crates/buzz-relay/src/handlers/ingest.rs:1315-1321 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":1234}}}],"partialFingerprints":{"codehealthFindingId/v1":"a23d83d07514ac53f1800106877cd9994df2065277c93fc4f01543026c183f0d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/buzz-relay/src/handlers/moderation_commands.rs:585-591 | crates/buzz-relay/src/handlers/relay_admin.rs:51-57 \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/buzz-relay/src/handlers/moderation_commands.rs"},"region":{"startLine":585}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d3991f33216caf2bbe0a6a03893a1a29f7b7d3f2c56fdcdee94e8cb5c0e4356"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/buzz-workflow/src/executor.rs:802-808 | crates/buzz-workflow/src/executor.rs:810-816 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-workflow/src/executor.rs"},"region":{"startLine":802}}}],"partialFingerprints":{"codehealthFindingId/v1":"d883a79e465d95393eb9e697b1165a765f07f6d09bbb8c5172a3ab3cfe70b0c8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): desktop/src-tauri/src/commands/agent_auth.rs:114-120 | desktop/src-tauri/src/commands/agent_auth.rs:250-256 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/commands/agent_auth.rs"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"a78aea94d6e15d19123285ed87c4ea1c1da0ae27c96bbcb287fc8afad344b88a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): desktop/src-tauri/src/commands/personas/snapshot/import.rs:526-532 | desktop/src-tauri/src/commands/team_snapshot.rs:552-558 \u2014 before extracting anything, compare \u0060desktop/src-tauri/src/commands/personas/snapshot/import.rs\u0060 and \u0060desktop/src-tauri/src/commands/team_snapshot.rs\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 105 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/personas/snapshot/import.rs"},"region":{"startLine":526}}}],"partialFingerprints":{"codehealthFindingId/v1":"22b1026c3c83c42c15d27be6b61e27e0fcd936aecd59ec0bb77ae2161e30cc53"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): desktop/src-tauri/src/commands/personas/snapshot/import.rs:707-713 | desktop/src-tauri/src/commands/team_snapshot.rs:799-805 \u2014 before extracting anything, compare \u0060desktop/src-tauri/src/commands/personas/snapshot/import.rs\u0060 and \u0060desktop/src-tauri/src/commands/team_snapshot.rs\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 105 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/personas/snapshot/import.rs"},"region":{"startLine":707}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1d271053e07a260a0bc0c2eb88ddf9753539767176a1625da31ef76592b5f1c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): desktop/src-tauri/src/managed_agents/discovery/login_shell.rs:288-294 | desktop/src-tauri/src/managed_agents/discovery/login_shell.rs:297-303 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/discovery/login_shell.rs"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"404ca64ea20cbd79244e5615bd4225f65fd7911e5c88937908b9e7156fc5a0ef"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): desktop/src-tauri/src/mesh_llm/recovery.rs:402-408 | desktop/src-tauri/src/mesh_llm/recovery.rs:415-421 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/mesh_llm/recovery.rs"},"region":{"startLine":402}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ff1d51f85e528a7561e22c6703e04095cbd57681798fbfe9463532fae433755"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): desktop/src-tauri/src/native_relay_client.rs:698-704 | desktop/src-tauri/src/native_relay_client.rs:725-731 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/native_relay_client.rs"},"region":{"startLine":698}}}],"partialFingerprints":{"codehealthFindingId/v1":"8614db5bad345e880195b0b011cfc738259a8ef0f4d62b9dd03baa2591646d33"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): desktop/src-tauri/src/commands/profile.rs:242-248 | desktop/src-tauri/src/commands/social.rs:134-140 \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":"desktop/src-tauri/src/commands/profile.rs"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c20e5cfe8397ed6d293d974651087115c5b0d5f3a7d4ac437956505db067e06"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): desktop/src-tauri/src/commands/agent_settings.rs:26-32 | desktop/src-tauri/src/commands/agent_settings.rs:70-76 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/commands/agent_settings.rs"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"dedf95b81407bd3277bc0c1cfcd08e1ecaaeecd095b156786ce0a63da16ef7a3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): desktop/src-tauri/src/migration/backfill.rs:52-58 | desktop/src-tauri/src/migration/team_suffix.rs:68-74 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/migration/backfill.rs"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"525aa65cdc754277bbd0c601f4acf5d3e30ad84ce773b5b8714c6ca62e459bce"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 4): crates/buzz-cli/src/commands/dms.rs:15-20 | crates/buzz-cli/src/commands/users.rs:470-475 | crates/buzz-cli/src/commands/workflows.rs:18-23 | crates/buzz-cli/src/commands/workflows.rs:77-82 \u2014 there are 4 copies across 3 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 4 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/dms.rs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"034e229bbbae49db2cba7d1e4703569c2bb8463c9c7ad96edfefa8a476dcbee1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): crates/buzz-cli/src/client.rs:1437-1443 | crates/buzz-cli/src/client.rs:1458-1464 | crates/buzz-cli/src/commands/channels.rs:639-644 \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/buzz-cli/src/client.rs"},"region":{"startLine":1437}}}],"partialFingerprints":{"codehealthFindingId/v1":"72ab0f6da6ba74b3770ca8cacf9ad2b7953403d974bab3e40774cde718bb81c9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): crates/buzz-relay/src/connection.rs:872-879 | crates/buzz-relay/src/connection.rs:907-912 | crates/buzz-relay/src/connection.rs:929-934 \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/buzz-relay/src/connection.rs"},"region":{"startLine":872}}}],"partialFingerprints":{"codehealthFindingId/v1":"141139389c6b694b6cc8ce80fcab124210822a42cfc93ce713298c08d0603615"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): crates/buzz-relay/src/handlers/command_executor.rs:437-442 | crates/buzz-relay/src/handlers/command_executor.rs:574-579 | crates/buzz-relay/src/handlers/command_executor.rs:647-652 \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/buzz-relay/src/handlers/command_executor.rs"},"region":{"startLine":437}}}],"partialFingerprints":{"codehealthFindingId/v1":"031e4031c971b6e2b8710816075792b2214ed220c264878edcf141638081cf13"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): crates/buzz-relay/src/handlers/identity_archive.rs:142-147 | crates/buzz-relay/src/handlers/ingest.rs:2683-2688 | crates/buzz-relay/src/handlers/relay_admin.rs:235-240 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 3 call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/identity_archive.rs"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"eef17df394be8ac208c936c9302a173633c0c4639990c38e530eee422740b7d2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): crates/buzz-sdk/src/builders.rs:1230-1235 | crates/buzz-sdk/src/builders.rs:1683-1688 | crates/buzz-sdk/src/builders.rs:1762-1767 \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/buzz-sdk/src/builders.rs"},"region":{"startLine":1230}}}],"partialFingerprints":{"codehealthFindingId/v1":"b96a6df269557e1ddd13cb74faf4d5ca10a6128c566019b4727a4552cdd5dd4f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-acp/src/filter.rs:283-289 | crates/buzz-workflow/src/executor.rs:251-256 \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/buzz-acp/src/filter.rs"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f45fe95dd066fc7b9ba78a99efddcd84d177ae36567e06e651c81ea69d282f5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-acp/src/filter.rs:295-301 | crates/buzz-workflow/src/executor.rs:262-267 \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/buzz-acp/src/filter.rs"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"a05f610d6226673e17cacc84e916ce8265e22d531fcbd8da2257ce9d2f7ee161"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-agent/src/llm.rs:1989-1994 | crates/buzz-agent/src/llm.rs:2428-2433 \u2014 both copies are in the same file, so extract the block 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/buzz-agent/src/llm.rs"},"region":{"startLine":1989}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4d8722ccc785f95c09dcdd1c4af7a94b7615296292f4b458a56d708dd2e37cb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5\u20136 lines \u00D7 2): crates/buzz-agent/src/llm.rs:2227-2231 | crates/buzz-agent/src/llm.rs:2386-2391 \u2014 both copies are in the same file, so extract the block 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/buzz-agent/src/llm.rs"},"region":{"startLine":2227}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbad2f5f8dac0cb867a6308b1fcf73fd67537246dec2d307b433a3645ce3a989"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-cli/src/client.rs:326-331 | crates/buzz-cli/src/client.rs:356-361 \u2014 both copies are in the same file, so extract the block 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/buzz-cli/src/client.rs"},"region":{"startLine":326}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7d6e6d6e31ce1eb9edd6cbccdbba336fdcc94fed907a3330d507aea996b78eb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-cli/src/client.rs:1089-1094 | crates/buzz-cli/src/client.rs:1369-1374 \u2014 both copies are in the same file, so extract the block 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/buzz-cli/src/client.rs"},"region":{"startLine":1089}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc7d83e20757e2240dd26dbe37e1156c5395d90271eb086b9ed1d220ab42095a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-cli/src/commands/workflows.rs:40-45 | crates/buzz-cli/src/commands/workflows.rs:129-134 \u2014 both copies are in the same file, so extract the block 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/buzz-cli/src/commands/workflows.rs"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"8df1623568f13387c5cae13f61e041722f74b6befb1c58cff53bb2b3d8fdf2d6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-cli/src/commands/projects.rs:175-180 | crates/buzz-cli/src/commands/projects.rs:527-533 \u2014 both copies are in the same file, so extract the block 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/buzz-cli/src/commands/projects.rs"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"145920d1d4ac46834f91e72c7f3882343ac48fc0e1de8964eeb0b9533271e726"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-cli/src/commands/mem.rs:238-246 | desktop/src-tauri/src/commands/engrams.rs:223-228 \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/buzz-cli/src/commands/mem.rs"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"62d620a16ab042c0f4942a330a11a1906c83e40c50a036eb772be068469e2520"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-db/src/store/api_token.rs:228-234 | crates/buzz-db/src/store/api_token.rs:540-545 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/api_token.rs"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca95d489516e35399e4d5f4f87ab1e5e1329eaf932d0ffbe5ba032065281f625"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-db/src/store/relay_admin_actions.rs:1690-1695 | crates/buzz-db/src/store/relay_admin_actions.rs:1707-1712 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/relay_admin_actions.rs"},"region":{"startLine":1690}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbe9bd3b6ee3c233b28c14b8cf6694af11fcb7a629a623112a02fca4d86458e5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-dev-mcp/src/shell.rs:363-369 | crates/buzz-dev-mcp/src/shell.rs:408-413 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-dev-mcp/src/shell.rs"},"region":{"startLine":363}}}],"partialFingerprints":{"codehealthFindingId/v1":"c27d613d01e5208095fc69902c0e98731d07c7730166aab996dee0f61d082f99"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-pairing-cli/src/main.rs:482-487 | desktop/src-tauri/src/commands/pairing.rs:751-756 \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/buzz-pairing-cli/src/main.rs"},"region":{"startLine":482}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fc0bb4ad769e1f8be6d072c07ce0b04a5c0a02c5dfe19b74fa851aa430c4615"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-relay/src/api/bridge.rs:1748-1753 | crates/buzz-relay/src/handlers/req.rs:379-384 \u2014 before extracting anything, compare \u0060crates/buzz-relay/src/api/bridge.rs\u0060 and \u0060crates/buzz-relay/src/handlers/req.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 48 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/bridge.rs"},"region":{"startLine":1748}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a2342e631c159f1a1fb3463dd8d152f559730efd07dd9b96449311af5ee5a23"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-relay/src/api/bridge.rs:2491-2496 | crates/buzz-relay/src/handlers/command_executor.rs:933-938 \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/buzz-relay/src/api/bridge.rs"},"region":{"startLine":2491}}}],"partialFingerprints":{"codehealthFindingId/v1":"e91e1add5a3b0eb5041ed4ef6e8d274861c5b65eb2553a066f8fc61f3defca05"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-relay/src/api/git/transport.rs:1375-1380 | crates/buzz-relay/src/api/git/transport.rs:1779-1784 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/api/git/transport.rs"},"region":{"startLine":1375}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d8550e98dda1bbb7d46f8caf0cb75807e1e645aae5083a0e167fae08d9b218e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-relay/src/main.rs:692-697 | crates/buzz-relay/src/main.rs:1175-1180 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/main.rs"},"region":{"startLine":692}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec43d93bfef51ad4382a5d85666aad6759a968dfe268597ec814c4fb46d4b542"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-relay/src/readiness.rs:602-607 | crates/buzz-relay/src/readiness.rs:635-640 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/readiness.rs"},"region":{"startLine":602}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9d183e13c2abb64aa2e8a119a1f55f98daa6b6d6b56d5bf55084261dfeae3e5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-sdk/src/builders.rs:413-418 | crates/buzz-sdk/src/builders.rs:484-489 \u2014 both copies are in the same file, so extract the block 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/buzz-sdk/src/builders.rs"},"region":{"startLine":413}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d7a9dcb34c0944d4a36ee41f2d001cb3dcf186e9fac1a014635d00d84902d7d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): desktop/src-tauri/src/mesh_llm/mod.rs:620-625 | desktop/src-tauri/src/mesh_llm/mod.rs:651-656 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/mesh_llm/mod.rs"},"region":{"startLine":620}}}],"partialFingerprints":{"codehealthFindingId/v1":"d19dc1a1fe89ba0c13fd6481d5030fb82a2920923d7ca9e186a9b7fd53f6c49e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): desktop/src-tauri/src/persona_catalog.rs:198-203 | desktop/src-tauri/src/team_catalog.rs:316-321 \u2014 before extracting anything, compare \u0060desktop/src-tauri/src/persona_catalog.rs\u0060 and \u0060desktop/src-tauri/src/team_catalog.rs\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 41 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/persona_catalog.rs"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"254cd1e68feb5e36fba6e72ba06897fab777b506ce7230e4722d2571fb3fce25"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): desktop/src-tauri/src/secret_store.rs:321-326 | desktop/src-tauri/src/secret_store.rs:413-418 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/secret_store.rs"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"99be1821dd82d76eed2c8962ab66e3d4aec66155d5efb5ea47e34539919bbfde"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): desktop/src-tauri/src/migration/detach.rs:37-42 | desktop/src-tauri/src/migration/team_membership.rs:99-104 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/migration/detach.rs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ae2676a443306f6c32075644368a7add6b0810fb604b3287965b19e982aefa7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): desktop/src-tauri/src/relay/profile_avatar.rs:112-117 | desktop/src-tauri/src/relay/profile_avatar.rs:144-152 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/relay/profile_avatar.rs"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb9470ed559a7b5d14b920517677d71de8e4cc0633330d8c9f7aa7f989f2de62"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): desktop/src-tauri/src/commands/teams/mod.rs:422-427 | desktop/src-tauri/src/commands/teams/mod.rs:472-477 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/teams/mod.rs"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"3439a5d316f088460952fa0f57abe1978793407a7f453b49b09df41a94cbfca8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 4): crates/buzz-relay/src/handlers/identity_archive.rs:142-146 | crates/buzz-relay/src/handlers/ingest.rs:2683-2687 | crates/buzz-relay/src/handlers/moderation_commands.rs:112-116 | crates/buzz-relay/src/handlers/relay_admin.rs:235-239 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 4 call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/identity_archive.rs"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dcbf085e8cc6738010b7f70ce89a33ae38a131e844c6f7b08ae5d03f1336bb2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): crates/buzz-cli/src/commands/mem.rs:363-367 | crates/buzz-cli/src/commands/mem.rs:689-693 | crates/buzz-cli/src/commands/mem.rs:726-730 \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/buzz-cli/src/commands/mem.rs"},"region":{"startLine":363}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b1ab8d6634cd84a863af86e9ae44b6a7c7eeff370baddf86171b6c967aed899"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): crates/buzz-sdk/src/builders.rs:1238-1242 | crates/buzz-sdk/src/builders.rs:1691-1695 | crates/buzz-sdk/src/builders.rs:1770-1774 \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/buzz-sdk/src/builders.rs"},"region":{"startLine":1238}}}],"partialFingerprints":{"codehealthFindingId/v1":"7177e720aac34dcac69c43928a0fc42ec761a2cb4f9e2210ac3f20bbea3efca3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): crates/buzz-ws-client/src/message.rs:88-92 | crates/buzz-ws-client/src/message.rs:116-122 | crates/buzz-ws-client/src/message.rs:148-154 \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/buzz-ws-client/src/message.rs"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"722d33474ae3aef4eef00f7496edea9a85e563d1b34b1ef5e902ef175074b0f4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): desktop/src-tauri/src/commands/admin/mod.rs:542-546 | desktop/src-tauri/src/commands/admin/mod.rs:569-573 | desktop/src-tauri/src/commands/admin/mod.rs:596-600 \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":"desktop/src-tauri/src/commands/admin/mod.rs"},"region":{"startLine":542}}}],"partialFingerprints":{"codehealthFindingId/v1":"504e7ea337f8df2febd9aabf57dcf59848b31cd8a64665b542fbe47848175027"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): desktop/src-tauri/src/commands/project_git_recipient_notes.rs:230-234 | desktop/src-tauri/src/commands/project_git_recipient_notes.rs:272-276 | desktop/src-tauri/src/commands/project_git_workflow.rs:449-453 \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":"desktop/src-tauri/src/commands/project_git_recipient_notes.rs"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab1ac20a24c4539f44cb3d12e18ba8fae2cc64e6a25ff0f878342ab02ee214e2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): desktop/src-tauri/src/persona_catalog.rs:204-208 | desktop/src-tauri/src/persona_catalog.rs:217-221 | desktop/src-tauri/src/team_catalog.rs:322-326 \u2014 before extracting anything, compare \u0060desktop/src-tauri/src/persona_catalog.rs\u0060 and \u0060desktop/src-tauri/src/team_catalog.rs\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 41 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/persona_catalog.rs"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8fce77f8521be41db169784fa7d985837fd8030a46b268905d35a4a0ce12034"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/buzz-acp/src/relay.rs:3741-3745 | crates/buzz-acp/src/relay.rs:3769-3775 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/relay.rs"},"region":{"startLine":3741}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1df5314fe918e67dd64abbfb362841bbc85fc3896561a1b8dcdabfa0cf36089"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/buzz-cli/src/commands/agents.rs:27-31 | crates/buzz-cli/src/commands/agents.rs:69-73 \u2014 both copies are in the same file, so extract the block 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/buzz-cli/src/commands/agents.rs"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8b7cfe45749bd027a05d19237a23503c49b67d33adecf8bb08f7349fd4ead67"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (3\u20135 lines \u00D7 3): crates/buzz-db/src/store/api_token.rs:184-188 | crates/buzz-db/src/store/api_token.rs:246-248 | crates/buzz-db/src/store/api_token.rs:387-391 \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/buzz-db/src/store/api_token.rs"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e7ca5c25abdf09c3ec8f18e9d111d42ab19785a818a71f5790e195de28f4dfd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/buzz-media/src/storage.rs:296-300 | crates/buzz-media/src/storage.rs:309-313 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-media/src/storage.rs"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"95497b195de7a88933c273b700c060cc8a6da1fb8c95d242f20a0b0c297a0e17"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/buzz-media/src/validation.rs:685-689 | crates/buzz-media/src/validation.rs:718-722 \u2014 both copies are in the same file, so extract the block 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/buzz-media/src/validation.rs"},"region":{"startLine":685}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0ea37e0b31f1279766eefbc4875f367d243376d343945898314ba39ca14aef0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/buzz-relay/src/api/bridge.rs:815-819 | crates/buzz-relay/src/api/bridge/thread_roots.rs:78-82 \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/buzz-relay/src/api/bridge.rs"},"region":{"startLine":815}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a947d9cf3e448fc5d41ab7c7b45a4f47cca086a594645eeb4b215b6cc733718"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/buzz-relay/src/handlers/side_effects.rs:375-379 | crates/buzz-relay/src/handlers/side_effects.rs:2281-2285 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/side_effects.rs"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"6eb3067a423e4b4de921e2fd0acf1b579a4eb16992e99e09f4ac32f212d1ba77"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/buzz-sdk/src/mentions.rs:70-74 | desktop/src-tauri/src/huddle/preprocessing.rs:200-204 \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/buzz-sdk/src/mentions.rs"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9ee9913593a48f201ec3595226ea254f85b1e6e8f6e0e0fe0ca93607c31c4ee"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/buzz-voice/src/pocket_april.rs:648-652 | crates/buzz-voice/src/pocket_april.rs:939-943 \u2014 both copies are in the same file, so extract the block 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/buzz-voice/src/pocket_april.rs"},"region":{"startLine":648}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a4628edecbcbd8ad8c06c8554b3b45bcd5283dcdf2529a934e28f2b3b95bdef"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): desktop/src-tauri/src/commands/personas/card.rs:549-553 | desktop/src-tauri/src/commands/personas/snapshot.rs:265-269 \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":"desktop/src-tauri/src/commands/personas/card.rs"},"region":{"startLine":549}}}],"partialFingerprints":{"codehealthFindingId/v1":"7084f2756ca89e1ae7fb2e5100874faf018f54f8a9db9977ddd4d5d9fdd0912d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): desktop/src-tauri/src/managed_agents/agent_snapshot.rs:459-463 | desktop/src-tauri/src/managed_agents/agent_snapshot.rs:546-550 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/agent_snapshot.rs"},"region":{"startLine":459}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f911e4741c1711625d82f7293b46b522f00468f327837edd5e61f5441e67659"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): desktop/src-tauri/src/managed_agents/nest.rs:176-182 | desktop/src-tauri/src/managed_agents/nest.rs:202-206 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/nest.rs"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"6303d36fbb265c79a0c058af34b7feee755150b101506cb9d2e9b5b5725ad3a5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): desktop/src-tauri/src/commands/project_git.rs:632-636 | desktop/src-tauri/src/commands/project_git_file_content.rs:136-140 \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":"desktop/src-tauri/src/commands/project_git.rs"},"region":{"startLine":632}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdb737febb7efd941d3aac1b4fede5f9992f86221489373964180212d83d2750"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): crates/buzz-acp/src/acp.rs:2399-2407 | crates/buzz-agent/src/mcp.rs:1038-1046 | crates/buzz-dev-mcp/src/lib.rs:203-211 \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/buzz-acp/src/acp.rs"},"region":{"startLine":2399}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d6813ad9148aeebc73a664d3ff345f49dd98338a94667fded266363ac2d1fb3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-acp/src/git.rs:278-283 | crates/buzz-dev-mcp/src/shim.rs:33-38 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/git.rs"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5a38bcad646370a85d98cb7511c33b5c989dffbd6b59b45b0e5ae8211e1feaf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-acp/src/git.rs:296-301 | crates/buzz-dev-mcp/src/shim.rs:51-56 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/git.rs"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"92ba70cb1c640fe8a306eeb69a3a6ef7c445844aa86140f021a47a38043c8b00"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/buzz-agent/src/mcp.rs:909-918 | crates/buzz-dev-mcp/src/str_replace.rs:166-175 \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/buzz-agent/src/mcp.rs"},"region":{"startLine":909}}}],"partialFingerprints":{"codehealthFindingId/v1":"86dd3977a03b0912408a002c630f24c4d0723a2f2e62bf685c46a23105b226f5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): crates/buzz-backend-kubernetes/src/env.rs:66-73 | desktop/src-tauri/crates/buzz-terminal/src/context.rs:74-81 | desktop/src-tauri/src/managed_agents/env_vars.rs:58-65 \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/buzz-backend-kubernetes/src/env.rs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b50594bd5aed627f6c229233c5a872e4207c0e5384b3d2f4e0219f8c4d0f64a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): crates/buzz-cli/src/commands/issues.rs:480-489 | crates/buzz-cli/src/commands/patches.rs:75-84 | crates/buzz-cli/src/commands/pr.rs:116-125 \u2014 before extracting anything, compare \u0060crates/buzz-cli/src/commands/issues.rs\u0060 and \u0060crates/buzz-cli/src/commands/patches.rs\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 72 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/issues.rs"},"region":{"startLine":480}}}],"partialFingerprints":{"codehealthFindingId/v1":"5026fd7ef322246ca52f4ca2fdfc5914f26b7afb3a1b46db1717a3c9988fb836"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-cli/src/commands/mem.rs:81-86 | crates/buzz-cli/src/commands/notes.rs:475-480 \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/buzz-cli/src/commands/mem.rs"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a08d41c4edd755868a71478834b1d818362a100916d981d00503fa46610019f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): crates/buzz-cli/src/commands/project_channel.rs:60-64 | crates/buzz-cli/src/commands/project_channel.rs:154-161 | crates/buzz-cli/src/commands/projects.rs:153-160 \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/buzz-cli/src/commands/project_channel.rs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"524b7da946e5c4245f7fd64b07bdd463c62c222bc6fa04ecf0014ece6f762cdf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/buzz-dev-mcp/src/lib.rs:189-198 | desktop/src-tauri/src/util.rs:212-221 \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/buzz-dev-mcp/src/lib.rs"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"f19940b0e9dcf5989eb9fa0b7b471a89c470bc41e98972a54999b4d72a06dfa7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/buzz-media/src/bucket_index.rs:75-79 | crates/buzz-push-gateway/src/http.rs:70-74 \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/buzz-media/src/bucket_index.rs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d0509a9053f22486e3723688a332eaf34de007e350cc001e6e71808ca06eb24"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-relay/src/handlers/ingest.rs:361-366 | desktop/src-tauri/src/link_preview_tags.rs:9-14 \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/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":361}}}],"partialFingerprints":{"codehealthFindingId/v1":"f84cb8d58948a5c3b9a28bb84d90ed2a0126a78ef99186044d288b1ad52133dc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): desktop/src-tauri/src/archive/store.rs:184-193 | desktop/src-tauri/src/managed_agents/retention.rs:166-175 \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":"desktop/src-tauri/src/archive/store.rs"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"cee2c3812d67784b911872274c7e8920c93e1c8a73ef6ad84e73b7b792e5210b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): desktop/src-tauri/src/channel_head_cache.rs:34-40 | desktop/src-tauri/src/observed_unread.rs:49-55 \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":"desktop/src-tauri/src/channel_head_cache.rs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"5303356f24ad293abed34b7f1e777f8d54626ad5447f1907b8d9c4a003dc52db"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): desktop/src-tauri/src/channel_head_cache.rs:303-309 | desktop/src-tauri/src/observed_unread.rs:667-673 \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":"desktop/src-tauri/src/channel_head_cache.rs"},"region":{"startLine":303}}}],"partialFingerprints":{"codehealthFindingId/v1":"a630d9577fdf0c988fd29094948d84000d1584edd68635bf1410083991b1959f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): desktop/src-tauri/src/commands/agent_discovery/relay_directory.rs:88-94 | desktop/src-tauri/src/commands/channels/fetch.rs:19-25 \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":"desktop/src-tauri/src/commands/agent_discovery/relay_directory.rs"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"35588375188f7f23bd3f6eb2bc42eb5f23620e8647a67564bb28d96bc49d778c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): desktop/src-tauri/src/commands/link_preview_cancellation.rs:14-22 | desktop/src-tauri/src/commands/media_fetch_cancellation.rs:21-28 | desktop/src-tauri/src/commands/media_upload_progress.rs:17-24 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 3 call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/link_preview_cancellation.rs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"e81a67a57f93fe9a1bbb7a62d3095e52996f1bf3ad2893785e5687a773b63483"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): desktop/src-tauri/src/commands/personas/pending.rs:88-94 | desktop/src-tauri/src/commands/teams/pending.rs:55-61 \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":"desktop/src-tauri/src/commands/personas/pending.rs"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"d44943a56af8e9ffca195a525d6ce42a723e8d9911827696fd8de42af9517ab9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): desktop/src-tauri/src/commands/personas/snapshot.rs:164-173 | desktop/src-tauri/src/commands/team_snapshot.rs:87-96 \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":"desktop/src-tauri/src/commands/personas/snapshot.rs"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"69900a6b7dd2f9449b7647b7846cc303b8683d61aabdf564d2bb029258900276"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): desktop/src-tauri/src/commands/teams/adopt/apply.rs:420-424 | desktop/src-tauri/src/managed_agents/team_catalog.rs:369-373 \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":"desktop/src-tauri/src/commands/teams/adopt/apply.rs"},"region":{"startLine":420}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f0b1e1f006a1643c7173e15c05157394864132b0983c277cef3b3a105633888"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): desktop/src-tauri/src/commands/channel_templates.rs:13-19 | desktop/src-tauri/src/commands/personas/mod.rs:14-20 | desktop/src-tauri/src/commands/teams/mod.rs:14-20 \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":"desktop/src-tauri/src/commands/channel_templates.rs"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ce031afac9d4ddc2dcfd4c2150b28f475e3ebbf702a25c8090b25ac19d551de"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): desktop/src-tauri/src/commands/channel_templates.rs:21-26 | desktop/src-tauri/src/commands/personas/mod.rs:22-27 | desktop/src-tauri/src/commands/teams/mod.rs:22-27 \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":"desktop/src-tauri/src/commands/channel_templates.rs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"e545cf56d1aa8c198120f0a8138d188243db4d53b46a4c339f071dd02c38c0f4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): desktop/src-tauri/src/managed_agents/config_bridge/claude.rs:70-76 | desktop/src-tauri/src/managed_agents/config_bridge/codex.rs:108-114 | desktop/src-tauri/src/managed_agents/config_bridge/codex.rs:116-123 \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":"desktop/src-tauri/src/managed_agents/config_bridge/claude.rs"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"5dd031c141de80e480959d752e838ed76f820f67ac8d1ed859305fc443bb00f2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/buzz-acp/src/config.rs:791-798 | desktop/src-tauri/src/managed_agents/discovery.rs:323-330 \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/buzz-acp/src/config.rs"},"region":{"startLine":791}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1bc60f189bf104cd0ce8f93eebabcb84bd9b3eb0d526be360019d35cf6c08e0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/buzz-agent/src/catalog.rs:771-780 | crates/buzz-db/src/store/deletion.rs:3367-3376 \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/buzz-agent/src/catalog.rs"},"region":{"startLine":771}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa05321d5a70f34571f521f2bc051819716868e4c20e6ad626e4fb2254859e79"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 4): crates/buzz-db/src/store/feed.rs:136-151 | crates/buzz-db/src/store/feed.rs:224-239 | crates/buzz-db/src/store/thread.rs:286-301 | crates/buzz-db/src/store/thread.rs:560-575 \u2014 there are 4 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 4 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/feed.rs"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"94c221919cfa376b104637ae29a0ae8dccf608dfdf3f14fd0e926bd645434173"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): desktop/src-tauri/src/commands/link_preview_cancellation.rs:39-45 | desktop/src-tauri/src/commands/media_fetch_cancellation.rs:45-51 | desktop/src-tauri/src/commands/media_upload_progress.rs:39-45 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 3 call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/link_preview_cancellation.rs"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c01c375c42962729bc63bbbe773f453fe6327bbfb9f164d28892d464ed02143"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): desktop/src-tauri/src/commands/link_preview_cancellation.rs:53-60 | desktop/src-tauri/src/commands/media_fetch_cancellation.rs:53-60 | desktop/src-tauri/src/commands/media_upload_progress.rs:53-60 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 3 call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/link_preview_cancellation.rs"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"d56492579bc22713227d62cd562b56e77c2a1fd325808c0eb66398f2d2f4819a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): desktop/src-tauri/src/relay.rs:687-692 | desktop/src-tauri/src/relay/submit.rs:66-71 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/relay.rs"},"region":{"startLine":687}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd76790e5613e75a011a4ce9694d4d6baa24c06170ccb71929f9d4d0528139c5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): crates/buzz-db/src/store/thread.rs:478-495 | crates/buzz-db/src/store/thread.rs:778-804 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/thread.rs"},"region":{"startLine":478}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf9315e28c5cdff324e6ecccd1d59aa1d0c28ddc7fea19fa0da76f6bbafb54da"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): desktop/src-tauri/src/archive/store.rs:637-661 | desktop/src-tauri/src/archive/store.rs:796-818 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/archive/store.rs"},"region":{"startLine":637}}}],"partialFingerprints":{"codehealthFindingId/v1":"05b5f90852ca315aa6cd50608d7696bbda63badd330341581e33a7b2a3e27421"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): crates/buzz-db/src/store/channel_members.rs:950-966 | crates/buzz-db/src/store/channel_members.rs:980-1001 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/channel_members.rs"},"region":{"startLine":950}}}],"partialFingerprints":{"codehealthFindingId/v1":"db07ad248be9f5dce810a0b19b65827cb6c5e4f314e320da9e704ee48950f0a1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): crates/buzz-db/src/store/channel.rs:262-283 | crates/buzz-db/src/store/dm.rs:200-220 \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/buzz-db/src/store/channel.rs"},"region":{"startLine":262}}}],"partialFingerprints":{"codehealthFindingId/v1":"767e3968d28208f6071cf42a1eeadd116b9303fac11551ce9123044f48d2ca76"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 4): crates/buzz-db/src/store/archived_identities.rs:68-82 | crates/buzz-db/src/store/event.rs:969-982 | crates/buzz-db/src/store/reaction.rs:250-270 | crates/buzz-db/src/store/reaction.rs:317-338 \u2014 there are 4 copies across 3 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 4 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/archived_identities.rs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"1aca566a662a378d19cec6c688732520d223271304152ad04872cfc41532ae5b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): crates/buzz-db/src/store/deletion.rs:3244-3263 | crates/buzz-db/src/store/deletion.rs:3272-3291 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/deletion.rs"},"region":{"startLine":3244}}}],"partialFingerprints":{"codehealthFindingId/v1":"783ca9fda0a05df9b2a55d4de70b56e80681338df891d443f63a06cff11c22ab"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): crates/buzz-db/src/store/channel.rs:146-165 | crates/buzz-db/src/store/relay_admin_actions.rs:490-508 \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/buzz-db/src/store/channel.rs"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfb0da5b55252a19f2a9c2a568fe7f70bb9d64f43cc3d2a2ba2584443823b6e0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): crates/buzz-db/src/store/allowlist.rs:118-128 | crates/buzz-db/src/store/channel_members.rs:1266-1285 \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/buzz-db/src/store/allowlist.rs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fb750db42624517379e1140ffd908e0a2903924501ba4c533d800fee9e74a32"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): crates/buzz-db/src/store/community.rs:106-124 | crates/buzz-db/src/store/community.rs:621-637 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/community.rs"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"daf84c37355b4561764fb4e90e146c9216fee5bc4f4c0c978417e123b1d1505d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): crates/buzz-db/src/store/event.rs:1085-1100 | crates/buzz-db/src/store/thread.rs:238-256 \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/buzz-db/src/store/event.rs"},"region":{"startLine":1085}}}],"partialFingerprints":{"codehealthFindingId/v1":"b092ce9071e8b3b1666c95377850892c4147be559eeb0dde46759764c37d6d27"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3): crates/buzz-db/src/store/channel_members.rs:1447-1460 | crates/buzz-db/src/store/event.rs:1227-1242 | crates/buzz-db/src/store/git_repo.rs:94-112 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 3 call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/channel_members.rs"},"region":{"startLine":1447}}}],"partialFingerprints":{"codehealthFindingId/v1":"136fd1f6d736ee4c5c7d65f7813175efc90b2fd0b97b80ea602fe40dece76c0b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 3): crates/buzz-db/src/store/moderation.rs:409-426 | crates/buzz-db/src/store/moderation.rs:461-476 | crates/buzz-db/src/store/relay_admin_actions.rs:323-338 \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/buzz-db/src/store/moderation.rs"},"region":{"startLine":409}}}],"partialFingerprints":{"codehealthFindingId/v1":"993432f9558b1bcfa8f5764b0f22d167f98311bd66f83a038c127c211ed698b8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): crates/buzz-db/src/store/channel_members.rs:867-880 | crates/buzz-db/src/store/channel_members.rs:947-964 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/channel_members.rs"},"region":{"startLine":867}}}],"partialFingerprints":{"codehealthFindingId/v1":"840c53c4c36b87e5d05dc34d7d4763199b63f9897bd222600182808bb184eb37"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): crates/buzz-db/src/store/relay_members.rs:503-519 | crates/buzz-db/src/store/relay_members.rs:715-731 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/relay_members.rs"},"region":{"startLine":503}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4ad5e9283704784e706e53cac5a85bbe4cd79495793c1aa52cb0e074cc605e0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): crates/git-sign-nostr/src/lib.rs:802-818 | crates/git-sign-nostr/src/lib.rs:1591-1605 \u2014 both copies are in the same file, so extract the block 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/git-sign-nostr/src/lib.rs"},"region":{"startLine":802}}}],"partialFingerprints":{"codehealthFindingId/v1":"77341cbc4f53c64308d21e3416c509a9b4bd0abee103af9fd07026d0483cd4e3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): crates/buzz-db/src/store/git_repo.rs:53-64 | crates/buzz-db/src/store/moderation.rs:574-590 | crates/buzz-db/src/store/user.rs:371-381 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 3 call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/git_repo.rs"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"8765e3366bc32b6076cf065b153fc4079f2d81d12c709485a62401494261eb9d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 4): desktop/src-tauri/src/commands/agents_pending.rs:102-117 | desktop/src-tauri/src/commands/personas/pending.rs:251-267 | desktop/src-tauri/src/commands/teams/mod.rs:351-366 | desktop/src-tauri/src/managed_agents/team_catalog.rs:815-824 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 4 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 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/agents_pending.rs"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"45fbd8a5b06f194049651ca5d0d21269e544f9adc3ffd8d72df763c8f014c604"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): crates/buzz-db/src/store/relay_admin_actions.rs:222-238 | crates/buzz-db/src/store/relay_admin_actions.rs:1210-1226 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/relay_admin_actions.rs"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"1487d65aa00031f8f9941401d01202859aff3eaf64350cbb5bc99007bd4c8d3b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): crates/buzz-db/src/store/usage.rs:145-159 | crates/buzz-db/src/store/usage.rs:248-261 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/usage.rs"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"707f3cb8a2d4a453449134c20c1ac9e5d44c009ae2e19ed815d3400f936ca2b5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 3): crates/buzz-db/src/store/usage.rs:110-124 | crates/buzz-db/src/store/usage.rs:181-193 | crates/buzz-db/src/store/usage.rs:216-228 \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/buzz-db/src/store/usage.rs"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7e3300cd023348fd2e8f044939339a3906ffe9193afd4290924f21f37f6332e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): crates/buzz-db/src/store/reaction.rs:184-196 | crates/buzz-db/src/store/relay_invite.rs:232-246 \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/buzz-db/src/store/reaction.rs"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"2359f50546b7694b6d504a8db1a7c567d15420ff31bb75f66b3ebbc01d213921"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): crates/buzz-db/src/store/event.rs:1199-1212 | crates/buzz-db/src/store/event.rs:1276-1289 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/event.rs"},"region":{"startLine":1199}}}],"partialFingerprints":{"codehealthFindingId/v1":"2373683a0931d3b7ef4e8c3471cb2f6b678ac29f66070e728071f8ca42dab03d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): crates/buzz-acp/src/lib.rs:1802-1814 | crates/buzz-acp/src/lib.rs:1894-1907 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/lib.rs"},"region":{"startLine":1802}}}],"partialFingerprints":{"codehealthFindingId/v1":"0269efdbfabaa340169243abb8e7c6a63547bdb2f436e4f2b3a55eb6ec594595"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): desktop/src-tauri/src/archive/store_migrations.rs:46-59 | desktop/src-tauri/src/archive/store_migrations.rs:195-206 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/archive/store_migrations.rs"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f9d9682e5610d2e260ae7b27cd7843fb4de0e50962445ff3325da19010988f3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): desktop/src-tauri/src/app_state.rs:519-530 | desktop/src-tauri/src/app_state.rs:603-616 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/app_state.rs"},"region":{"startLine":519}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bd18a10f748f9ae9b7a3860d0cea4fcaea241d789f7df30d1ca51f5952f98b9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): desktop/src-tauri/src/commands/media_transcode.rs:377-389 | desktop/src-tauri/src/commands/media_transcode.rs:463-476 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/commands/media_transcode.rs"},"region":{"startLine":377}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4f76076178972a50bc34cd11569f5e94fce7a1a99a70f1b06d7cf3ab005483d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): crates/buzz-db/src/store/push.rs:1048-1059 | crates/buzz-db/src/store/push.rs:1075-1087 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/push.rs"},"region":{"startLine":1048}}}],"partialFingerprints":{"codehealthFindingId/v1":"b69d6fbb598f71e147e9c5340676c656083dd911f4b464b2de95a931347861d3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): crates/buzz-db/src/store/deletion.rs:2370-2382 | crates/buzz-db/src/store/deletion.rs:2437-2449 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/deletion.rs"},"region":{"startLine":2370}}}],"partialFingerprints":{"codehealthFindingId/v1":"17a5d387ba63bd7e02a6035a5bd1149538eb2531876c94d3e5ea899995aa2fdb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): desktop/src-tauri/src/media_proxy.rs:278-284 | desktop/src-tauri/src/media_proxy.rs:294-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":"desktop/src-tauri/src/media_proxy.rs"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"68a05f22f4937259ab69766b1721274202da37a1e8e9780e9a108fb568de6713"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): crates/buzz-cli/src/commands/agents.rs:114-126 | crates/buzz-cli/src/commands/agents.rs:152-164 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/agents.rs"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d8bbc708f2080139704c0379647df4bbe3b95ad25bae1defe09cffe466901f0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): crates/buzz-relay/src/handlers/ingest.rs:1433-1442 | crates/buzz-relay/src/handlers/ingest.rs:1978-1990 | crates/buzz-relay/src/handlers/ingest.rs:1996-2005 \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/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":1433}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ef7c2928908bb708a834473f15b546f737dbe0b4fbf66a62d3c661cfcc9eb78"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): crates/buzz-db/src/store/relay_members.rs:263-275 | crates/buzz-db/src/store/relay_members.rs:312-324 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/store/relay_members.rs"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8766a919656f235523c4314bf4d7a4eb58313bb121e58ed7d8df03a61bbe234"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): crates/buzz-db/src/store/push.rs:1250-1262 | crates/buzz-db/src/store/push.rs:1301-1313 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/push.rs"},"region":{"startLine":1250}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c0084140f8eb92a5dffaecfa5976085de0d40078e38038ef89cc3208ad56b13"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 3): desktop/src-tauri/src/commands/agents_pending.rs:158-170 | desktop/src-tauri/src/commands/personas/pending.rs:288-300 | desktop/src-tauri/src/commands/teams/mod.rs:389-401 \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":"desktop/src-tauri/src/commands/agents_pending.rs"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"18fb71ac4f3b1c2346d928c7081b2baa35994dab24e81a0f083c0ce92f426bb5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): crates/buzz-db/src/store/push.rs:1226-1238 | crates/buzz-db/src/store/push.rs:1274-1286 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/store/push.rs"},"region":{"startLine":1226}}}],"partialFingerprints":{"codehealthFindingId/v1":"1002463d516a54eae92d67dd047cb70191de15e4f4b9e676622c06bbe6a74d11"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): crates/buzz-relay/src/api/operator.rs:347-358 | crates/buzz-relay/src/api/operator.rs:481-492 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/api/operator.rs"},"region":{"startLine":347}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf86b4a2b016f2943e77297b29e5fa8f6fc63ddb9ae866d83d7d0bebb8b87a09"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): crates/buzz-db/src/store/channel_members.rs:1382-1392 | crates/buzz-db/src/store/git_repo.rs:159-170 \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/buzz-db/src/store/channel_members.rs"},"region":{"startLine":1382}}}],"partialFingerprints":{"codehealthFindingId/v1":"21e47a2c4f63eb40bb6a269a164985bb3625e8cfab53302d19f7261c7ac50ad8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/buzz-db/src/store/allowlist.rs:76-87 | crates/buzz-db/src/store/relay_members.rs:155-164 \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/buzz-db/src/store/allowlist.rs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"c05ee78a8af8d146091afd5f548c4afda1db8fb93ed4691cb8cfed5b257cbe27"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): desktop/src-tauri/src/media_proxy.rs:276-281 | desktop/src-tauri/src/media_proxy.rs:286-297 | desktop/src-tauri/src/media_proxy.rs:302-307 \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":"desktop/src-tauri/src/media_proxy.rs"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"5eceb300f29591f1f5a8202514cb7f014ddc3dec29b85a8174a3d16a98028282"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): crates/buzz-agent/src/llm.rs:2038-2049 | crates/buzz-agent/src/llm.rs:2472-2483 \u2014 both copies are in the same file, so extract the block 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/buzz-agent/src/llm.rs"},"region":{"startLine":2038}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b4c7ce62f20f3ab8652d970cec387f17296809c9937f99ce09d571c7db45c6c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/buzz-sdk/src/builders.rs:989-998 | crates/buzz-sdk/src/builders.rs:1052-1063 \u2014 both copies are in the same file, so extract the block 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/buzz-sdk/src/builders.rs"},"region":{"startLine":989}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b083644c6f6b85d52d3735d3bdfa22c6efb4524d8c8c25f4465e170f689deca"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): crates/buzz-relay/src/api/git/store.rs:675-686 | crates/buzz-relay/src/api/git/store.rs:770-781 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/api/git/store.rs"},"region":{"startLine":675}}}],"partialFingerprints":{"codehealthFindingId/v1":"9326ca10a081184155f54da0e41519e45bcd20c417a4cd82c5c7f2dcd55c9589"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): desktop/src-tauri/src/commands/project_git.rs:511-522 | desktop/src-tauri/src/commands/project_git.rs:525-536 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/commands/project_git.rs"},"region":{"startLine":511}}}],"partialFingerprints":{"codehealthFindingId/v1":"31dd4f194a82998ca5fb6dc4ad31ac6c70ddeb2bda2014421837673e043c9514"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/buzz-acp/src/relay.rs:2697-2708 | crates/buzz-acp/src/relay.rs:2871-2879 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/relay.rs"},"region":{"startLine":2697}}}],"partialFingerprints":{"codehealthFindingId/v1":"77ffe7f40fbae2f2d1b12868aedfec035f15282dac1e0d73b3c32e2935ae638b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): crates/buzz-relay/src/api/admin/mod.rs:780-790 | crates/buzz-relay/src/api/admin/mod.rs:856-866 | crates/buzz-relay/src/api/admin/mod.rs:1001-1011 \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/buzz-relay/src/api/admin/mod.rs"},"region":{"startLine":780}}}],"partialFingerprints":{"codehealthFindingId/v1":"611b232c151b4710cc882c53cc97064903f7d92efe1decec691f881965078725"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): crates/buzz-relay/src/api/admin/mod.rs:917-927 | crates/buzz-relay/src/api/admin/mod.rs:1080-1090 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/api/admin/mod.rs"},"region":{"startLine":917}}}],"partialFingerprints":{"codehealthFindingId/v1":"5019f731bcb94ba87a215c8a8743a504e3fefcf0819f54bd199fcfc6ec96260f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/buzz-relay/src/protocol.rs:85-95 | crates/buzz-relay/src/protocol.rs:158-166 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/protocol.rs"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a0636d79ecd5d0dd2470738067515b361ae838465147f2330ffef5a963aaf08"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/git-sign-nostr/src/lib.rs:523-533 | crates/git-sign-nostr/src/lib.rs:534-542 \u2014 both copies are in the same file, so extract the block 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/git-sign-nostr/src/lib.rs"},"region":{"startLine":523}}}],"partialFingerprints":{"codehealthFindingId/v1":"55ae565b64f1c178fccc0d4fd509de369024ee83fcb76e63b56c66b9c8cc641d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-acp/src/relay.rs:3168-3178 | crates/buzz-acp/src/relay.rs:3315-3320 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/relay.rs"},"region":{"startLine":3168}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb744bd01ff801ecd5b22f0d735e5af46469667d7905234b361ceee65ed733e3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/buzz-relay/src/handlers/side_effects.rs:457-467 | crates/buzz-relay/src/handlers/side_effects.rs:2087-2095 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/side_effects.rs"},"region":{"startLine":457}}}],"partialFingerprints":{"codehealthFindingId/v1":"47bc1204d278aa5e322ccafd82b77d168f9f999c4a8265822d0805c169bd514a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 4): desktop/src-tauri/src/archive/mod.rs:242-252 | desktop/src-tauri/src/archive/mod.rs:256-266 | desktop/src-tauri/src/commands/channels/fetch.rs:352-358 | desktop/src-tauri/src/commands/profile.rs:362-372 \u2014 there are 4 copies across 3 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 4 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/archive/mod.rs"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"963ac5a6d593087d09ad223a936ebfffbe570cfc39d8fdc7426ccb61828eb371"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/buzz-acp/src/lib.rs:4450-4459 | crates/buzz-acp/src/lib.rs:4504-4513 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/lib.rs"},"region":{"startLine":4450}}}],"partialFingerprints":{"codehealthFindingId/v1":"63ad3ca5d8408a21c1d59536ae162f35439400993f885e2b119f1bf307a85567"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/buzz-relay/src/handlers/ingest.rs:1223-1232 | crates/buzz-relay/src/handlers/ingest.rs:1304-1313 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":1223}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5eac11bb105c823d7f7e06e8664b30a68611ce374e9ef17ca765e923563b922"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/buzz-relay/src/main.rs:2093-2102 | crates/buzz-relay/src/main.rs:2139-2148 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/main.rs"},"region":{"startLine":2093}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e7f5ceb01acc034cacb073e872b28c70c358427816de50867f020f541852647"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/buzz-db/src/runtime/mod.rs:981-990 | crates/buzz-db/src/runtime/mod.rs:1025-1033 \u2014 both copies are in the same file, so extract the block 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/buzz-db/src/runtime/mod.rs"},"region":{"startLine":981}}}],"partialFingerprints":{"codehealthFindingId/v1":"12524eec08176794dae4ec2569c6ed459b0279a503be7a79b9df9d86ed52f5f2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/buzz-acp/src/relay.rs:3434-3441 | crates/buzz-acp/src/relay.rs:3467-3476 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/relay.rs"},"region":{"startLine":3434}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ff70bc6e385cbea6d99ef99a71f504bf8e242f33b770b01d33722a1b1135be1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/git-sign-nostr/src/lib.rs:407-416 | crates/git-sign-nostr/src/lib.rs:427-436 \u2014 both copies are in the same file, so extract the block 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/git-sign-nostr/src/lib.rs"},"region":{"startLine":407}}}],"partialFingerprints":{"codehealthFindingId/v1":"440ef16dc5a4537069472a145a19cc0d2e5b429ac8749bc8b35afda20d288a5f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): crates/buzz-relay/src/handlers/side_effects.rs:1006-1015 | crates/buzz-relay/src/handlers/side_effects.rs:3257-3265 | crates/buzz-relay/src/handlers/side_effects.rs:3710-3718 \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/buzz-relay/src/handlers/side_effects.rs"},"region":{"startLine":1006}}}],"partialFingerprints":{"codehealthFindingId/v1":"b256aedd0feac88a6e3d9f37884ab79922dbf3f80e4192c6a338c625c08c04d7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): desktop/src-tauri/src/persona_catalog.rs:111-120 | desktop/src-tauri/src/team_catalog.rs:94-103 \u2014 before extracting anything, compare \u0060desktop/src-tauri/src/persona_catalog.rs\u0060 and \u0060desktop/src-tauri/src/team_catalog.rs\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 41 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/persona_catalog.rs"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"14daacfe0c149a9500d88d006b04810499f55589b4f19974a9215e9c71c4818e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): desktop/src-tauri/src/migration.rs:494-502 | desktop/src-tauri/src/migration.rs:600-608 | desktop/src-tauri/src/migration/pollen.rs:23-31 \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":"desktop/src-tauri/src/migration.rs"},"region":{"startLine":494}}}],"partialFingerprints":{"codehealthFindingId/v1":"96191a151f71c501f8cae454276607beb96f0bb1a33090346b0d9c17137f91c3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): desktop/src-tauri/src/secret_store.rs:784-790 | desktop/src-tauri/src/secret_store.rs:808-816 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/secret_store.rs"},"region":{"startLine":784}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8c2c3e7b9dfd2095e91f4d2f1c631e318da7134a01a120d7c09e14177b14098"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): crates/buzz-db/src/store/event.rs:1863-1871 | crates/buzz-db/src/store/event.rs:1916-1922 | crates/buzz-db/src/store/event.rs:1974-1980 \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/buzz-db/src/store/event.rs"},"region":{"startLine":1863}}}],"partialFingerprints":{"codehealthFindingId/v1":"624c4db3a996f55b57b8022689db3dbcf3bc13b3ddd8358249c9cc41f06128cb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/buzz-acp/src/pool.rs:5365-5373 | crates/buzz-acp/src/pool.rs:5497-5505 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/pool.rs"},"region":{"startLine":5365}}}],"partialFingerprints":{"codehealthFindingId/v1":"1610acf6c8676cfec743b1ff9ff85206a015a2721ca9a906cc2e80b71dc26f31"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): desktop/src-tauri/src/commands/project_git_exec.rs:108-116 | desktop/src-tauri/src/managed_agents/backend.rs:194-202 \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":"desktop/src-tauri/src/commands/project_git_exec.rs"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"83cc1b892877c62a51048182f039217dffe5fc0db097ac52c2bca41bc667ef00"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/buzz-cli/src/client.rs:337-345 | crates/buzz-cli/src/client.rs:369-377 \u2014 both copies are in the same file, so extract the block 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/buzz-cli/src/client.rs"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7ebaf66e5e9f96e6572639bf1d7c7c55dbf07605f51d81627042c00476c08e7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/buzz-agent/src/llm.rs:1033-1041 | crates/buzz-agent/src/llm.rs:1076-1083 \u2014 both copies are in the same file, so extract the block 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/buzz-agent/src/llm.rs"},"region":{"startLine":1033}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e3a8ec72196d07a54f40cab7da82b31bf800d9f5dab3112f0b013c39a37d27e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): crates/buzz-relay/src/handlers/command_executor.rs:453-461 | crates/buzz-relay/src/handlers/command_executor.rs:583-591 | crates/buzz-relay/src/handlers/command_executor.rs:661-669 \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/buzz-relay/src/handlers/command_executor.rs"},"region":{"startLine":453}}}],"partialFingerprints":{"codehealthFindingId/v1":"251112955d6d2db3109c566ac86434c5e4def032a5dc4338a63e5dd7b31bc016"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): desktop/src-tauri/src/archive/store_migrations.rs:117-124 | desktop/src-tauri/src/archive/store_migrations.rs:240-247 | desktop/src-tauri/src/archive/store_migrations.rs:317-323 \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":"desktop/src-tauri/src/archive/store_migrations.rs"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d1060c29f568d46ab896d593f07876b38a394dde8506cda5074cc6272c23b62"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/buzz-acp/src/lib.rs:265-272 | crates/buzz-acp/src/lib.rs:275-282 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/lib.rs"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5a5d085d6191c5e26f4727d5a2bd41be6ac96bdf0d627e753b098edd5596474"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): desktop/src-tauri/src/app_state.rs:979-986 | desktop/src-tauri/src/key_backup.rs:151-158 \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":"desktop/src-tauri/src/app_state.rs"},"region":{"startLine":979}}}],"partialFingerprints":{"codehealthFindingId/v1":"896a61caeec3ba5f99e0bafd911fda909c1519ad6bb40e6f01f7aba77258ad9f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/buzz-cli/src/commands/channels.rs:317-323 | crates/buzz-cli/src/commands/channels.rs:590-597 \u2014 both copies are in the same file, so extract the block 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/buzz-cli/src/commands/channels.rs"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac51e18f5dfcb2366f0e1a71b3183abe386759cd2101f1322d0cf88232571ac4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/buzz-relay/src/main.rs:2073-2080 | crates/buzz-relay/src/main.rs:2186-2193 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/main.rs"},"region":{"startLine":2073}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ffe69995245e46fa6a112aff4e43957a239f90dcf028943833b270b1a841c21"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): crates/buzz-acp/src/lib.rs:5636-5643 | crates/buzz-acp/src/lib.rs:5684-5691 | crates/buzz-acp/src/lib.rs:5759-5766 \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/buzz-acp/src/lib.rs"},"region":{"startLine":5636}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cadd6651544f23c05b3b337a57e2e3331866aeac174b96586ded7816a2dfc79"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): crates/buzz-acp/src/lib.rs:2483-2490 | crates/buzz-acp/src/lib.rs:2495-2500 | crates/buzz-acp/src/lib.rs:2505-2510 \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/buzz-acp/src/lib.rs"},"region":{"startLine":2483}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab96960b3100941efec9efc43d625119213b162cc54f688b52e2b39476b71260"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): desktop/src-tauri/src/commands/messages.rs:624-631 | desktop/src-tauri/src/commands/messages.rs:711-718 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/messages.rs"},"region":{"startLine":624}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff035902b103c63efb06a90c694a2b3b62f56bac1a480befaf63891def0b8e3f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/buzz-acp/src/lib.rs:1787-1794 | crates/buzz-acp/src/lib.rs:1838-1845 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/lib.rs"},"region":{"startLine":1787}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd2030a925d5320e28dc65f2e7f2dbb69d3380064e33579472f1c3055fbb3194"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): desktop/src-tauri/src/commands/agent_models.rs:512-519 | desktop/src-tauri/src/commands/agent_models_openrouter.rs:64-71 \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":"desktop/src-tauri/src/commands/agent_models.rs"},"region":{"startLine":512}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a8bd3f74badf270e988a4b7b2d2f1d1da8f79f789e29e81ad0a4769e8e52f4a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/buzz-cli/src/commands/messages.rs:382-389 | crates/buzz-cli/src/commands/social.rs:102-109 \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/buzz-cli/src/commands/messages.rs"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"897539480d83f2ab6f5f91ecc68b2053af12b9abfad2c966983751238e42c5b8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/buzz-relay/src/api/git/cas_publish.rs:540-544 | crates/buzz-relay/src/api/git/cas_publish.rs:724-731 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/git/cas_publish.rs"},"region":{"startLine":540}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5a9e074c76b35a25d9562b9af553e5d08f3acec57d5284d0aa35da8a7824371"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/buzz-acp/src/pool.rs:2203-2209 | crates/buzz-acp/src/pool.rs:2243-2249 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/pool.rs"},"region":{"startLine":2203}}}],"partialFingerprints":{"codehealthFindingId/v1":"e39c67358cbb17055f36891fbf73172e267e596cdd9b30c14b73f0b221b6b492"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/buzz-cli/src/commands/users.rs:385-391 | crates/buzz-cli/src/commands/users.rs:397-403 \u2014 both copies are in the same file, so extract the block 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/buzz-cli/src/commands/users.rs"},"region":{"startLine":385}}}],"partialFingerprints":{"codehealthFindingId/v1":"1254e8dc0054ef66883b0e6c695e671a844fe39e5dca3bb96652b79908f05c64"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/buzz-relay/src/handlers/event.rs:914-920 | crates/buzz-relay/src/handlers/event.rs:942-948 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/event.rs"},"region":{"startLine":914}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce734292c31d42be9e2e1facacc2a14b9d30f5a5eeb3272b5c9fa297dd7d73eb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): crates/buzz-relay/src/config.rs:701-707 | crates/buzz-relay/src/config.rs:898-904 | crates/buzz-relay/src/main.rs:619-624 \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/buzz-relay/src/config.rs"},"region":{"startLine":701}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d741d45076bb2b68dceabda810fa4f4b7329efea50acf34265efe414a39fc03"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/buzz-voice/src/imported.rs:286-290 | desktop/src-tauri/src/managed_agents/storage.rs:631-637 \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/buzz-voice/src/imported.rs"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"75413244657ca4a1f95cb02370b72e7da65aafa95605b9158168f3a778cb6b38"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/buzz-core/src/engram.rs:299-305 | crates/buzz-core/src/private_managed_agent.rs:737-741 \u2014 before extracting anything, compare \u0060crates/buzz-core/src/engram.rs\u0060 and \u0060crates/buzz-core/src/private_managed_agent.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 31 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-core/src/engram.rs"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"56e2f200b435e34aa53b50bc71483cbd8d24ed0082e1f5171b027faa8f02d171"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): crates/buzz-relay/src/api/operator.rs:339-345 | crates/buzz-relay/src/api/operator.rs:401-407 | crates/buzz-relay/src/api/operator.rs:473-479 \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/buzz-relay/src/api/operator.rs"},"region":{"startLine":339}}}],"partialFingerprints":{"codehealthFindingId/v1":"d977aae0e67ee41a34797280bdf08315544a3c1a20cb5efdfbc94bf1a43dd43a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 20): crates/buzz-cli/src/commands/channels.rs:1630-1635 | crates/buzz-cli/src/commands/channels.rs:1646-1651 | crates/buzz-cli/src/commands/channels.rs:1662-1667 | crates/buzz-cli/src/commands/channels.rs:1674-1679 | crates/buzz-cli/src/commands/channels.rs:1686-1691 | crates/buzz-cli/src/commands/channels.rs:1698-1703 | crates/buzz-cli/src/commands/channels.rs:1710-1715 | crates/buzz-cli/src/commands/channels.rs:1722-1727 | crates/buzz-cli/src/commands/channels.rs:1753-1758 | crates/buzz-cli/src/commands/channels.rs:1770-1775 | crates/buzz-cli/src/commands/channels.rs:1855-1860 | crates/buzz-cli/src/commands/emoji.rs:149-153 | crates/buzz-cli/src/commands/messages.rs:839-845 | crates/buzz-cli/src/commands/messages.rs:870-876 | crates/buzz-cli/src/commands/messages.rs:893-899 | crates/buzz-cli/src/commands/messages.rs:924-930 | crates/buzz-cli/src/commands/reactions.rs:71-77 | crates/buzz-cli/src/commands/social.rs:34-40 | crates/buzz-cli/src/commands/social.rs:62-68 | crates/buzz-cli/src/commands/users.rs:416-422 \u2014 there are 20 copies across 6 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 20 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/channels.rs"},"region":{"startLine":1630}}}],"partialFingerprints":{"codehealthFindingId/v1":"48155e9df264d0b6def95eb03f054c49aab8573cf99b5905e0198db853454b71"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): crates/buzz-relay/src/main.rs:2072-2076 | crates/buzz-relay/src/main.rs:2185-2189 | crates/buzz-relay/src/main.rs:2259-2265 \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/buzz-relay/src/main.rs"},"region":{"startLine":2072}}}],"partialFingerprints":{"codehealthFindingId/v1":"badc7dfb6a700335620165bc3bc6317c5ed69532171f0699b9a9283162ba6dbd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/buzz-dev-mcp/src/shell.rs:277-283 | crates/buzz-dev-mcp/src/shell.rs:285-291 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-dev-mcp/src/shell.rs"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"78240621fe20b6aa3f3a313075a3b9b51dc651b8aa1fa37e4c9f5dc0feecbe0d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/buzz-relay/src/handlers/side_effects.rs:1090-1096 | crates/buzz-relay/src/handlers/side_effects.rs:3535-3541 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/side_effects.rs"},"region":{"startLine":1090}}}],"partialFingerprints":{"codehealthFindingId/v1":"de63be9fb9d6fea41609fc36fe4d6a0d690c2e9d099d3699528cd457e96373e4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/buzz-relay/src/handlers/identity_archive.rs:172-176 | crates/buzz-relay/src/handlers/identity_archive.rs:202-208 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/handlers/identity_archive.rs"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"5488d15aeb5c4cf37d2ad99848706356b3c0100e1f0daa98bb83fb2f3a4da20a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/buzz-cli/src/commands/channels.rs:295-301 | crates/buzz-cli/src/commands/channels.rs:319-325 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/channels.rs"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"367b4c50111f9a6a1023d2d7ee514aa08cebfd86ccc16c4f663c874216fa9589"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): desktop/src-tauri/src/macos_notifications.rs:225-231 | desktop/src-tauri/src/macos_notifications.rs:285-291 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/macos_notifications.rs"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"406653ac364b04745fa848c8a70d0b50e56d405ca171647b7916de59cb288c77"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): desktop/src-tauri/src/commands/media.rs:718-723 | desktop/src-tauri/src/commands/media.rs:737-743 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/commands/media.rs"},"region":{"startLine":718}}}],"partialFingerprints":{"codehealthFindingId/v1":"97bdec6de8f7b191b15ac2e21f89b4ec4afe7e0d96c5686a0637034c31dc1f03"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-voice/src/pocket_april.rs:739-744 | crates/buzz-voice/src/pocket_april.rs:798-803 \u2014 both copies are in the same file, so extract the block 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/buzz-voice/src/pocket_april.rs"},"region":{"startLine":739}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdbecc7b1eb5812750037fe20f74b5336698db82dd5b1fcf90e21d2f5d83dcf2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): desktop/src-tauri/src/observed_unread.rs:467-472 | desktop/src-tauri/src/observed_unread.rs:536-541 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/observed_unread.rs"},"region":{"startLine":467}}}],"partialFingerprints":{"codehealthFindingId/v1":"7727a075809b579baf8ce0b7514936779b07b269743fa4aaae6870bbe6b3191b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-relay/src/config.rs:664-669 | crates/buzz-relay/src/config.rs:670-675 \u2014 both copies are in the same file, so extract the block 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/buzz-relay/src/config.rs"},"region":{"startLine":664}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8da8796686c190753cea14c9e349e130c6ea54542691bdb829f5de51e8aa564"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): desktop/src-tauri/src/managed_agents/retention.rs:499-504 | desktop/src-tauri/src/managed_agents/retention.rs:623-628 | desktop/src-tauri/src/managed_agents/retention/legacy_migration.rs:138-143 \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":"desktop/src-tauri/src/managed_agents/retention.rs"},"region":{"startLine":499}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf703b49254306ff4779980219bf7cb649637d31daac21bda4565c9bc22a55db"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): desktop/src-tauri/src/migration/fold.rs:109-114 | desktop/src-tauri/src/migration/fold.rs:134-139 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/migration/fold.rs"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"bda53fffc461758101e8b8101bb9a7e8381c9f7c4cce900bc92fe12b21e26833"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): crates/buzz-acp/src/relay.rs:488-493 | crates/buzz-acp/src/relay.rs:501-506 | crates/buzz-acp/src/relay.rs:559-564 \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/buzz-acp/src/relay.rs"},"region":{"startLine":488}}}],"partialFingerprints":{"codehealthFindingId/v1":"76743a4b381105b510e798dcb9d701355482c0bf2b09e1e90ca481dbe7e7bf75"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-admin/src/main.rs:730-735 | crates/buzz-admin/src/main.rs:764-769 \u2014 both copies are in the same file, so extract the block 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/buzz-admin/src/main.rs"},"region":{"startLine":730}}}],"partialFingerprints":{"codehealthFindingId/v1":"48acc1187d27b582d86a57685f3e9b6bcf5735f3c9376697bb97f6915cba0627"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 4): crates/buzz-cli/src/commands/reactions.rs:82-87 | crates/buzz-cli/src/commands/workflows.rs:15-20 | crates/buzz-cli/src/commands/workflows.rs:40-45 | crates/buzz-cli/src/commands/workflows.rs:129-134 \u2014 there are 4 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 4 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/reactions.rs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"951f781a8c39c921a60a4957ccfc3418f2dcda6b35ebd61a76bc38f395fae749"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-acp/src/pool.rs:2229-2234 | crates/buzz-acp/src/pool.rs:2269-2274 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/pool.rs"},"region":{"startLine":2229}}}],"partialFingerprints":{"codehealthFindingId/v1":"689a761f3223e89b080126c659d42e02bba715d8e10e982482e6c26c6c1cf753"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-auth/src/nip_fi/verifier.rs:689-694 | crates/buzz-relay/src/nip_fi_config.rs:253-258 \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/buzz-auth/src/nip_fi/verifier.rs"},"region":{"startLine":689}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a7202ea968693e5dfea59d3ad2bc7929a092b1e22801bf9d3a08684d5b7dd97"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): desktop/src-tauri/src/secret_store.rs:793-798 | desktop/src-tauri/src/secret_store.rs:819-824 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/secret_store.rs"},"region":{"startLine":793}}}],"partialFingerprints":{"codehealthFindingId/v1":"93576d0869848e0a9faff5fdbf11d519bf3131f6e014420466aefe9a0d2773dc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): desktop/src-tauri/src/commands/link_preview.rs:322-327 | desktop/src-tauri/src/commands/link_preview.rs:661-666 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/commands/link_preview.rs"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"e36fd976927c470772e516dfb63aa30b849d2e43b6e2e7f9fd42e088b9a7bf19"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/buzz-acp/src/lib.rs:278-283 | crates/buzz-acp/src/lib.rs:296-301 \u2014 both copies are in the same file, so extract the block 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/buzz-acp/src/lib.rs"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"3352a1f8d4d1d2f035fa6f44d5b753a35728ec89d1563df84d2cbe0c1c2357d0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): desktop/src-tauri/src/events/message_tags.rs:77-82 | desktop/src-tauri/src/events/message_tags.rs:94-99 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/events/message_tags.rs"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"40fbbe388eb123c739a64627184e2fbf36f9523dafb9717c6db3f7cfa8e25626"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): desktop/src-tauri/src/commands/agent_models.rs:515-520 | desktop/src-tauri/src/commands/agent_models.rs:622-627 | desktop/src-tauri/src/commands/agent_models_openrouter.rs:67-72 \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":"desktop/src-tauri/src/commands/agent_models.rs"},"region":{"startLine":515}}}],"partialFingerprints":{"codehealthFindingId/v1":"f84c5ac7228caf4903041ea208a2183bf275bca3489476aed5c276c1d3bf4444"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): desktop/src-tauri/src/commands/agent_models.rs:734-739 | desktop/src-tauri/src/commands/agent_models.rs:757-761 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/commands/agent_models.rs"},"region":{"startLine":734}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b2a7185e12fee8a81d69670eba572430776a2ffbe4ad364f0d0582f6d8cc679"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): desktop/src-tauri/src/archive/store_migrations.rs:212-216 | desktop/src-tauri/src/archive/store_migrations.rs:285-289 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/archive/store_migrations.rs"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f0155e997912872ab28c4749f8c49fbd147d0fd5afb18dce387babb726c58d1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/buzz-cli/src/commands/agents.rs:371-375 | crates/buzz-cli/src/commands/agents.rs:433-437 \u2014 both copies are in the same file, so extract the block 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/buzz-cli/src/commands/agents.rs"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cd78771b44d7112bd8fbeb7d16ae6bb8c63408c045076fc2de4e5d2a4ddba06"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/buzz-cli/src/commands/channels.rs:371-375 | crates/buzz-cli/src/commands/workflows.rs:80-84 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/channels.rs"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"4727705be594580ac0235bd9b3fe66414e1fa8a4e2897b096ae2813ec851605f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 4): desktop/src-tauri/src/events/message_tags.rs:82-86 | desktop/src-tauri/src/events/message_tags.rs:99-103 | desktop/src-tauri/src/events/message_tags.rs:119-123 | desktop/src-tauri/src/link_preview_tags.rs:92-96 \u2014 there are 4 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 4 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/events/message_tags.rs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a79f8ffecdfbe54bb7f052abeb57506ccaf49971068ee65fbd5214e2aa6038f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/buzz-cli/src/commands/channels.rs:781-785 | crates/buzz-cli/src/commands/emoji.rs:128-132 \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/buzz-cli/src/commands/channels.rs"},"region":{"startLine":781}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9ee9bb9dc39ecaf1ffe7b43321be6369c53fbd7414ae8df9959c76d4683c1ca"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): desktop/src-tauri/src/archive/store.rs:683-687 | desktop/src-tauri/src/archive/store.rs:834-838 \u2014 both copies are in the same file, so extract the block 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":"desktop/src-tauri/src/archive/store.rs"},"region":{"startLine":683}}}],"partialFingerprints":{"codehealthFindingId/v1":"8eb53f2cd77c121adfb0af5394c637b97967cbc6138e531b6bc2c457d871f178"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 5): crates/buzz-cli/src/commands/moderation.rs:45-49 | crates/buzz-cli/src/commands/moderation.rs:55-59 | crates/buzz-cli/src/commands/moderation.rs:73-77 | crates/buzz-cli/src/commands/moderation.rs:83-87 | crates/buzz-cli/src/commands/moderation.rs:99-103 \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/buzz-cli/src/commands/moderation.rs"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"b693e2549a65fc90465127d447f1b12be6218d3e03359a5f9c1c353bfb689e80"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/buzz-core/src/engram.rs:504-508 | crates/buzz-core/src/engram.rs:523-527 \u2014 both copies are in the same file, so extract the block 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/buzz-core/src/engram.rs"},"region":{"startLine":504}}}],"partialFingerprints":{"codehealthFindingId/v1":"4852c1163834ff5ec8bd02c63b71c8fee53ebcd098cc8a22f8ff9c0aae8a9e93"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): desktop/src-tauri/src/archive/store_migrations.rs:65-69 | desktop/src-tauri/src/archive/store_migrations.rs:213-217 | desktop/src-tauri/src/archive/store_migrations.rs:286-290 \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":"desktop/src-tauri/src/archive/store_migrations.rs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"b90960a00f0a8f0d21c9af4a73be9a6bcfb4ee495c0e9851ed749d77eec4c1f4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): crates/buzz-acp/src/pool.rs:1913-1917 | crates/buzz-acp/src/pool.rs:2001-2005 | crates/buzz-acp/src/pool.rs:2106-2110 \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/buzz-acp/src/pool.rs"},"region":{"startLine":1913}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cf8229ea85303cc4c9e93d9ccbf4c1c6d760b9e82af8f4e556b66588ba10434"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): desktop/src-tauri/src/managed_agents/storage.rs:678-682 | desktop/src-tauri/src/migration/pollen.rs:364-368 \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":"desktop/src-tauri/src/managed_agents/storage.rs"},"region":{"startLine":678}}}],"partialFingerprints":{"codehealthFindingId/v1":"98075bbaf264c36f1e7494347ed59145d180fb5cdf210ebd71a48423f7dfe087"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/buzz-media/src/validation.rs:431-435 | crates/buzz-media/src/validation.rs:936-940 \u2014 both copies are in the same file, so extract the block 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/buzz-media/src/validation.rs"},"region":{"startLine":431}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e4b448da6407c1de9ac17c921cf2ab41ab22ae346c82628a1851888a16c2c36"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201327 lines \u00D7 2): docs/formal/nip-rs-unread/model.py:299-325 | docs/formal/nip-rs-unread/mutation.py:429-442 \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":"docs/formal/nip-rs-unread/model.py"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"47d836dba1a58625072bf4042632770121b1ca85771d3c53ac258b8daa469520"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): docs/formal/nip-rs-unread/exhaustive.py:1269-1276 | docs/formal/nip-rs-unread/exhaustive.py:1289-1296 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060docs/formal/nip-rs-unread/exhaustive.py:1269\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/formal/nip-rs-unread/exhaustive.py"},"region":{"startLine":1269}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fde69c064268ad330fbfc6b8680f850dc51c02fb488c32497570adcbf8f0dea"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): docs/formal/nip-rs-unread/model.py:340-345 | docs/formal/nip-rs-unread/mutation.py:447-452 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060docs/formal/nip-rs-unread/model.py:340\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/formal/nip-rs-unread/model.py"},"region":{"startLine":340}}}],"partialFingerprints":{"codehealthFindingId/v1":"43668e296b5ae595bfb21980e663e10897293cc90571442300315cb509ed30da"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22\u201323 lines \u00D7 2): mobile/ios/Runner/AppDelegate.swift:659-681 | mobile/ios/Runner/AppDelegate.swift:704-725 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060mobile/ios/Runner/AppDelegate.swift:659\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/AppDelegate.swift"},"region":{"startLine":659}}}],"partialFingerprints":{"codehealthFindingId/v1":"179e126858b0c74fa20da41d2aa41bc649cfbb9c823c26288a45eaabe08148af"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22\u201323 lines \u00D7 2): mobile/ios/Runner/InlinePhotoPicker.swift:148-169 | mobile/ios/Runner/NativeAttachmentPopover.swift:596-618 \u2014 before extracting anything, compare \u0060mobile/ios/Runner/InlinePhotoPicker.swift\u0060 and \u0060mobile/ios/Runner/NativeAttachmentPopover.swift\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 71 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060mobile/ios/Runner/InlinePhotoPicker.swift:148\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/InlinePhotoPicker.swift"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7724e6e31bead542d67dd91a4150d74861c5debe93a49f85af72be4d2ae5e97"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201322 lines \u00D7 2): mobile/ios/Runner/AppDelegate.swift:887-908 | mobile/ios/Runner/VoiceNotePackager.swift:249-265 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060mobile/ios/Runner/AppDelegate.swift:887\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/AppDelegate.swift"},"region":{"startLine":887}}}],"partialFingerprints":{"codehealthFindingId/v1":"18022f5ada49a5bef45ad8c380b7a9efe7e8237c764ac4cff6d210a2fb7f9049"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201320 lines \u00D7 2): mobile/ios/Runner/AppDelegate.swift:911-930 | mobile/ios/Runner/VoiceNotePackager.swift:290-305 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060mobile/ios/Runner/AppDelegate.swift:911\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/AppDelegate.swift"},"region":{"startLine":911}}}],"partialFingerprints":{"codehealthFindingId/v1":"45c96dc67dd2c46295f379436f6ef290894a331e8c4101715c9d63d1bed11451"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201319 lines \u00D7 2): mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushNotificationResolver.swift:135-146 | mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushNotificationResolver.swift:346-364 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushNotificationResolver.swift:135\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushNotificationResolver.swift"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"26db1246551cf3cbf9b5f0e1834129b530062e492081061a98b79ba3e26d3fc2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201317 lines \u00D7 2): mobile/ios/Runner/HuddleAudioEngine.swift:185-200 | mobile/ios/Runner/HuddleAudioEngine.swift:787-803 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060mobile/ios/Runner/HuddleAudioEngine.swift:185\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/HuddleAudioEngine.swift"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf2ba11de9b52baf14f0cfa9106694be0ec804e0eb1193f5fa63d364effaaaf7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201317 lines \u00D7 2): mobile/ios/Runner/InlinePhotoPicker.swift:196-212 | mobile/ios/Runner/NativeAttachmentPopover.swift:504-517 \u2014 before extracting anything, compare \u0060mobile/ios/Runner/InlinePhotoPicker.swift\u0060 and \u0060mobile/ios/Runner/NativeAttachmentPopover.swift\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 71 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060mobile/ios/Runner/InlinePhotoPicker.swift:196\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/InlinePhotoPicker.swift"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"17dca9bbec2f7c2d636df0c47034c13824660ea5af47d87446cc331135768fd2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): mobile/ios/Runner/InlinePhotoPicker.swift:92-107 | mobile/ios/Runner/NativeAttachmentPopover.swift:182-197 \u2014 before extracting anything, compare \u0060mobile/ios/Runner/InlinePhotoPicker.swift\u0060 and \u0060mobile/ios/Runner/NativeAttachmentPopover.swift\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 71 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/InlinePhotoPicker.swift"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"44d188452e42abe5225864798721e583c7d3768732c018106cd15d3acca6c13a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201315 lines \u00D7 2): mobile/ios/Runner/NativeAttachmentPopoverCoordinator.swift:76-90 | mobile/ios/Runner/NativeProfileTextEditor.swift:12-25 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/NativeAttachmentPopoverCoordinator.swift"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"2657a17fdeff9bdabc587a756bc91614d9c743abb6e43f75e252f383acdd20a1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): mobile/ios/Runner/NativeAttachmentPopoverCoordinator.swift:250-264 | mobile/ios/Runner/NativeEmojiPicker.swift:178-192 \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":"mobile/ios/Runner/NativeAttachmentPopoverCoordinator.swift"},"region":{"startLine":250}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e894655eb15029206873d0f03a7fc5e34b77af56b9d6ba0d4d2c6d84153e653"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): mobile/ios/Runner/HuddleAudioEngine.swift:182-195 | mobile/ios/Runner/HuddleAudioEngine.swift:272-285 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/HuddleAudioEngine.swift"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5640a7cbceac807eb53f2572a75e2862462d2adb323e4d6e67b0915677fbcc5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 2): mobile/ios/Runner/NativeAttachmentPopoverCoordinator.swift:107-119 | mobile/ios/Runner/NativeProfileTextEditor.swift:42-55 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/NativeAttachmentPopoverCoordinator.swift"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"145caca4058fb40795b90f28bd6ede0000e6919021ac5cc509e263ff41b2ba5f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3): mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzDevPushEnrollmentDriver.swift:62-73 | mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushPendingEnrollmentRecord.swift:54-65 | mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushPresentationCache.swift:81-92 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 3 call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzDevPushEnrollmentDriver.swift:62\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzDevPushEnrollmentDriver.swift"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"cac22825436d04f41717cbb5d1cca39e0d822d2cca8c1622bb0748ae3e663523"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzDevPushEnrollmentDriver.swift:248-257 | mobile/ios/Runner/PushEndpointGrantStore.swift:136-145 \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":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzDevPushEnrollmentDriver.swift"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a6acb48584b96b0808dd51ff5a7e7b565c26912f370efa650d2c2354fa112b6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): mobile/ios/Runner/PushEndpointGrantStore.swift:20-28 | mobile/ios/Runner/PushEndpointGrantStore.swift:85-93 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060mobile/ios/Runner/PushEndpointGrantStore.swift:20\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/PushEndpointGrantStore.swift"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d014e463e0a29422dc6ef23b7a3d51f5a96765ffae9fed9950d67ceec30503c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): mobile/ios/Runner/InlinePhotoPicker.swift:127-134 | mobile/ios/Runner/NativeAttachmentPopover.swift:572-581 \u2014 before extracting anything, compare \u0060mobile/ios/Runner/InlinePhotoPicker.swift\u0060 and \u0060mobile/ios/Runner/NativeAttachmentPopover.swift\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 71 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060mobile/ios/Runner/InlinePhotoPicker.swift:127\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/InlinePhotoPicker.swift"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d76376e0db140f3368551cc6ad2066d33093fefdeeb7b78bcaa30fabed7a2a1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): mobile/ios/Runner/NativeAttachmentPopover.swift:319-326 | mobile/ios/Runner/NativeAttachmentPopover.swift:342-349 \u2014 both copies are in the same file, so extract the block 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":"mobile/ios/Runner/NativeAttachmentPopover.swift"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"d45901b4f04f3a5b8ff0635a1109e19dd7e685bd3760061a94f884d04758739d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): mobile/ios/Runner/NativeSkinToneControl.swift:127-134 | mobile/ios/Runner/ThemePaginationGlassControl.swift:220-227 \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":"mobile/ios/Runner/NativeSkinToneControl.swift"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"760b1937f80c9f7b47e0e84ce0e838cae00bcdb887534554c5dd5800f6cbb45a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:60-67 | mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:86-93 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:60\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e00384bc80220f3b1e90970836ac2359a5dbf8195572a3370a63016689c6bfb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:61-67 | mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:87-93 | mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:161-170 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:61\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2123b13779b51cb319e26bbad2e234366ccc345b3f0db0db0483a4fc715eab5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): mobile/ios/Runner/NativeEmojiPickerModel.swift:245-251 | mobile/ios/Runner/NativeEmojiPickerModel.swift:259-265 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060mobile/ios/Runner/NativeEmojiPickerModel.swift:245\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/NativeEmojiPickerModel.swift"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e960d63cedd3737e9e5305404d1052a8970c733e6ed82615b5b82a315f8cc19"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 4): mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:62-67 | mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:88-93 | mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:138-146 | mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:162-170 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:62\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"007023078512c0cb725b8334284560d7c932c316d70e63636dd5b549cdeb674f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 5): mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:63-67 | mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:89-93 | mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:114-121 | mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:139-146 | mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:163-170 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:63\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"0804fec0e4196612de482f644852f62c7fe251f413776f1d8da0506b3577b3db"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): mobile/ios/Runner/InlinePhotoPicker.swift:171-175 | mobile/ios/Runner/NativeAttachmentPopover.swift:620-624 \u2014 before extracting anything, compare \u0060mobile/ios/Runner/InlinePhotoPicker.swift\u0060 and \u0060mobile/ios/Runner/NativeAttachmentPopover.swift\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 71 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/InlinePhotoPicker.swift"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"d49f8547ebf013e4d781368f817d133d368b9fbd151cf4b4a94ffd1ebbd1329c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): mobile/ios/Runner/NativeAttachmentPopoverCoordinator.swift:240-248 | mobile/ios/Runner/NativeEmojiPicker.swift:168-176 | mobile/ios/Runner/NativeProfileTextEditor.swift:164-172 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 3 call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/NativeAttachmentPopoverCoordinator.swift"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc5de9f33a1eaa098fbf008ef1bd0800aeae7d0d60441ce7abedf1aaf8650725"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): mobile/ios/Runner/ConcentricSheetSurface.swift:16-27 | mobile/ios/Runner/NativeMessageActionSurface.swift:262-273 \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":"mobile/ios/Runner/ConcentricSheetSurface.swift"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdc21153f41e8f43e8c811d4d67e4bba0c6cc19dda3e6b25c6105853a1a30c41"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 6): mobile/ios/Runner/JumpToLatestGlassButton.swift:16-27 | mobile/ios/Runner/JumpToLatestGlassButton.swift:157-168 | mobile/ios/Runner/JumpToLatestGlassButton.swift:520-531 | mobile/ios/Runner/NativeSkinToneControl.swift:16-27 | mobile/ios/Runner/StickyDateGlassHeader.swift:23-34 | mobile/ios/Runner/ThemePaginationGlassControl.swift:16-27 \u2014 there are 6 copies across 4 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 6 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/JumpToLatestGlassButton.swift"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"557df5a5194f06214181b85fb63f9bb295841023a5cbf70f8bf1ffabfe9af6b9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): mobile/ios/Runner/ConcentricSheetSurface.swift:188-192 | mobile/ios/Runner/JumpToLatestGlassButton.swift:495-499 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060mobile/ios/Runner/ConcentricSheetSurface.swift:188\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/ios/Runner/ConcentricSheetSurface.swift"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"75104b01a604ceb2e96ffcfac9cfc963335d30330ccbd9f4988114003048f6d2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:94-98 | mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift:122-126 \u2014 both copies are in the same file, so extract the block 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":"mobile/ios/BuzzPushKit/Sources/BuzzPushKit/BuzzPushTranscript.swift"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"9af8d9992f618111b8c2350a4b2f3e48ee21653cb7ac68c4e8d6678768a051da"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (87 lines \u00D7 2): mobile/lib/features/channels/channel_detail_page/message_bubble.dart:167-253 | mobile/lib/features/channels/thread_detail_page/thread_message.dart:162-248 \u2014 before extracting anything, compare \u0060mobile/lib/features/channels/channel_detail_page/message_bubble.dart\u0060 and \u0060mobile/lib/features/channels/thread_detail_page/thread_message.dart\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 182 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_detail_page/message_bubble.dart"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a6b142c3f008630e304f7b0bc6451f6d6f3087c284a8acb5a195bc73637699a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (56 lines \u00D7 2): mobile/lib/features/channels/channel_detail_page/system_rows.dart:595-650 | mobile/lib/features/channels/thread_detail_page/nested_thread_summary_row.dart:58-113 \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":"mobile/lib/features/channels/channel_detail_page/system_rows.dart"},"region":{"startLine":595}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3bb2d859c75afaa4689e42585779638ca5f2dbf91d69e5810852afa9a20f4cd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (39 lines \u00D7 2): mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart:336-374 | mobile/lib/features/channels/channel_stars/channel_stars_manager.dart:336-374 \u2014 \u0060mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart\u0060 and \u0060mobile/lib/features/channels/channel_stars/channel_stars_manager.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 14 separate duplicated blocks between them, totalling at least 225 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart"},"region":{"startLine":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"02a27be7fbd2f9d9cb6567144f218486787b23ca26f8f794f96fe4c6a2af2d54"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (39 lines \u00D7 2): mobile/lib/features/profile/avatar_editor_option_button.dart:101-139 | mobile/lib/shared/widgets/editor_option_button.dart:83-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":"mobile/lib/features/profile/avatar_editor_option_button.dart"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a82e79963ea965a8524b224feefa2927e31a213e2dff77b4b07b51cdf0a1761"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (34\u201336 lines \u00D7 2): mobile/lib/features/channels/channel_actions_sheet.dart:404-437 | mobile/lib/features/channels/message_actions.dart:653-688 \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":"mobile/lib/features/channels/channel_actions_sheet.dart"},"region":{"startLine":404}}}],"partialFingerprints":{"codehealthFindingId/v1":"609c8abd5ad1995339f54ce99ca8ae444e993f6a2d05fd1534f74121a7ecc6b0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (36 lines \u00D7 2): mobile/lib/features/profile/profile_edit_page.dart:651-686 | mobile/lib/features/profile/profile_text_editor.dart:164-199 \u2014 before extracting anything, compare \u0060mobile/lib/features/profile/profile_edit_page.dart\u0060 and \u0060mobile/lib/features/profile/profile_text_editor.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 81 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/profile/profile_edit_page.dart"},"region":{"startLine":651}}}],"partialFingerprints":{"codehealthFindingId/v1":"b717097617e8f3713de2f41c7b42e9839cf42e8fd5daf3465c351cc943cf9d6b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22\u201328 lines \u00D7 2): mobile/lib/features/channels/channel_detail_page/app_bar.dart:213-234 | mobile/lib/features/channels/channels_page/channel_tile.dart:172-199 \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":"mobile/lib/features/channels/channel_detail_page/app_bar.dart"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7d344d92fccbb5e44303406242177c248eb7c3814ab1a6c455b1d61e22ae477"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 4): mobile/lib/features/channels/channel_mutes/channel_mutes_provider.dart:63-89 | mobile/lib/features/channels/channel_sections/channel_sections_provider.dart:63-89 | mobile/lib/features/channels/channel_sort/channel_sort_provider.dart:71-97 | mobile/lib/features/channels/channel_stars/channel_stars_provider.dart:63-89 \u2014 \u0060mobile/lib/features/channels/channel_mutes/channel_mutes_provider.dart\u0060 and \u0060mobile/lib/features/channels/channel_sections/channel_sections_provider.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 3 separate duplicated blocks between them, totalling at least 45 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_mutes/channel_mutes_provider.dart"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"04a2270cb16c062da20445341e3cca3745a9803855fa6b748d26374ece7be153"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21\u201327 lines \u00D7 3): mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart:137-157 | mobile/lib/features/channels/channel_sections/channel_sections_manager.dart:157-183 | mobile/lib/features/channels/channel_stars/channel_stars_manager.dart:137-157 \u2014 \u0060mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart\u0060 and \u0060mobile/lib/features/channels/channel_sections/channel_sections_manager.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 5 separate duplicated blocks between them, totalling at least 89 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"f92a22bc76027c646c3c598bbaa906fc3f80a5e05a30cf5b5c41184a54a3a653"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 3): mobile/lib/features/profile/profile_edit_page.dart:676-701 | mobile/lib/features/profile/profile_text_edit_sheet.dart:114-139 | mobile/lib/features/profile/profile_text_editor.dart:189-214 \u2014 before extracting anything, compare \u0060mobile/lib/features/profile/profile_edit_page.dart\u0060 and \u0060mobile/lib/features/profile/profile_text_edit_sheet.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 45 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/profile/profile_edit_page.dart"},"region":{"startLine":676}}}],"partialFingerprints":{"codehealthFindingId/v1":"21edc9993f42c336e9032f0ff6965154ddc14c5034894f0809794683e3da67f5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2): mobile/lib/features/channels/channel_detail_page/message_bubble.dart:77-102 | mobile/lib/features/channels/thread_detail_page/thread_message.dart:57-82 \u2014 before extracting anything, compare \u0060mobile/lib/features/channels/channel_detail_page/message_bubble.dart\u0060 and \u0060mobile/lib/features/channels/thread_detail_page/thread_message.dart\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 182 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_detail_page/message_bubble.dart"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"5227316db2c1568b977bf7680d1c666ff5ccab6d6c04519c3e39c688f5bd3c3b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2): mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart:240-264 | mobile/lib/features/channels/channel_stars/channel_stars_manager.dart:240-264 \u2014 \u0060mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart\u0060 and \u0060mobile/lib/features/channels/channel_stars/channel_stars_manager.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 14 separate duplicated blocks between them, totalling at least 225 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"e78992f8a7242e89d4580bdc8d06552b60ecead05ff2a40c8b58c12b8c0cde65"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2): mobile/lib/features/channels/channels_page/sheets.dart:69-93 | mobile/lib/features/channels/channels_page/sheets.dart:507-531 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channels_page/sheets.dart"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c743b27b1be4288d296607ca87ff705351c5887142b6f2e200368f2c885e6be"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2): mobile/lib/features/activity/activity_page.dart:80-103 | mobile/lib/features/channels/channels_page.dart:215-238 \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":"mobile/lib/features/activity/activity_page.dart"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5b9c367dcdde0d597cb64db5562c0ee7cfe9659abab8601988023f83ed137ce"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): mobile/lib/features/channels/agent_activity/transcript_item_widget.dart:97-118 | mobile/lib/features/channels/agent_activity/transcript_item_widget.dart:195-216 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/agent_activity/transcript_item_widget.dart"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"8937ae31e1ca20d7a21ec60710bbb19a714d44423224adb191511d0286f6568b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21\u201322 lines \u00D7 2): mobile/lib/features/channels/channel_detail_page/message_bubble.dart:297-317 | mobile/lib/features/channels/thread_detail_page/thread_message.dart:292-313 \u2014 before extracting anything, compare \u0060mobile/lib/features/channels/channel_detail_page/message_bubble.dart\u0060 and \u0060mobile/lib/features/channels/thread_detail_page/thread_message.dart\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 182 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_detail_page/message_bubble.dart"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe0854f3f6b02a016ab47efff04743fd6feb4ac740e98e660ebd1b90e97c2fb3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 3): mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart:353-373 | mobile/lib/features/channels/channel_sections/channel_sections_manager.dart:478-498 | mobile/lib/features/channels/channel_stars/channel_stars_manager.dart:353-373 \u2014 \u0060mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart\u0060 and \u0060mobile/lib/features/channels/channel_sections/channel_sections_manager.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 5 separate duplicated blocks between them, totalling at least 89 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart"},"region":{"startLine":353}}}],"partialFingerprints":{"codehealthFindingId/v1":"7213b41bb3280c240a65eba86ef65212b0f6f1ef0a5603c95e1b54616374e3b4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 3): mobile/lib/features/forum/forum_post_card.dart:242-262 | mobile/lib/features/forum/forum_thread_page.dart:118-138 | mobile/lib/features/forum/forum_thread_page.dart:545-565 \u2014 before extracting anything, compare \u0060mobile/lib/features/forum/forum_post_card.dart\u0060 and \u0060mobile/lib/features/forum/forum_thread_page.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 64 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/forum/forum_post_card.dart"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f4af8d1518ed116c6a6f6e1f7b388f3103d92ca098f65b01e1059b903915879"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): mobile/lib/features/forum/forum_post_card.dart:129-149 | mobile/lib/features/forum/forum_thread_page.dart:376-396 \u2014 before extracting anything, compare \u0060mobile/lib/features/forum/forum_post_card.dart\u0060 and \u0060mobile/lib/features/forum/forum_thread_page.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 64 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/forum/forum_post_card.dart"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"48df1896455d261266533d7ec4980e66c79d0e636d7782cc63da80db09d406d7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): mobile/lib/features/forum/forum_posts_view.dart:67-87 | mobile/lib/features/forum/forum_thread_page.dart:81-101 \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":"mobile/lib/features/forum/forum_posts_view.dart"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"f614468744d393d3c70b1676c0ab7dc0afc466171fcf1cfb026d99a0a230ff16"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): mobile/lib/features/channels/compose_bar/suggestions.dart:18-37 | mobile/lib/features/channels/compose_bar/suggestions.dart:173-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":"mobile/lib/features/channels/compose_bar/suggestions.dart"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca383ea0fac8d28911566c40ed7b0e407b0d820e987693fe263245ed1208885f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): mobile/lib/features/pairing/pairing_socket.dart:175-194 | mobile/lib/shared/relay/relay_socket.dart:173-192 \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":"mobile/lib/features/pairing/pairing_socket.dart"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f27704fdefba354a6817a5dd0e4b4bb3292f56995359bb763470b74adfbd6e6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): mobile/lib/shared/widgets/buzz_titled_sheet_layout.dart:37-56 | mobile/lib/shared/widgets/frosted_scaffold.dart:56-75 \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":"mobile/lib/shared/widgets/buzz_titled_sheet_layout.dart"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"51b87e2c3cce5ae6fc99e8f288743a0fae9e27118ed296adb8b0ce6350b6793d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): mobile/lib/features/profile/avatar_editor_option_button.dart:81-99 | mobile/lib/shared/widgets/editor_option_button.dart:63-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":"mobile/lib/features/profile/avatar_editor_option_button.dart"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2ca4e2a203d9c64cb8b3014d98c85b6eaf95247c9ff1f3cbe124aa48bf9cf0c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): mobile/lib/shared/widgets/buzz_sheet_header.dart:119-136 | mobile/lib/shared/widgets/modal_presentation.dart:155-172 \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":"mobile/lib/shared/widgets/buzz_sheet_header.dart"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"887dda9d1f0e1d1ee6d875fdbf71372f2e51d4d4f5f298a104a039034bc41ecd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): mobile/lib/features/channels/channel_detail_page/message_bubble.dart:149-165 | mobile/lib/features/channels/thread_detail_page/thread_message.dart:144-160 \u2014 before extracting anything, compare \u0060mobile/lib/features/channels/channel_detail_page/message_bubble.dart\u0060 and \u0060mobile/lib/features/channels/thread_detail_page/thread_message.dart\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 182 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_detail_page/message_bubble.dart"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"d91d3b64f6635775bfa3dfd7a15be690bc4ab49882c72313462e5edbec292ff4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart:159-175 | mobile/lib/features/channels/channel_stars/channel_stars_manager.dart:159-175 \u2014 \u0060mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart\u0060 and \u0060mobile/lib/features/channels/channel_stars/channel_stars_manager.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 14 separate duplicated blocks between them, totalling at least 225 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"b03a3232c688fed9493452e9b66721125705e78665758af00a34f5d252a017da"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): mobile/lib/features/profile/image_avatar_capture.dart:504-520 | mobile/lib/features/profile/image_avatar_capture.dart:579-595 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/profile/image_avatar_capture.dart"},"region":{"startLine":504}}}],"partialFingerprints":{"codehealthFindingId/v1":"92ef7f946bfef46da04d3e5854139b33359f02789b557239ca629c5c75c742f2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 3): mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart:162-177 | mobile/lib/features/channels/channel_sections/channel_sections_manager.dart:189-204 | mobile/lib/features/channels/channel_stars/channel_stars_manager.dart:162-177 \u2014 \u0060mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart\u0060 and \u0060mobile/lib/features/channels/channel_sections/channel_sections_manager.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 5 separate duplicated blocks between them, totalling at least 89 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6bd2fd075510e6341ba32a48fd975a875fd4723ab10b9a1099d17cc2ae18db9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): mobile/lib/features/channels/agent_activity/transcript_item_widget.dart:127-142 | mobile/lib/features/channels/agent_activity/transcript_item_widget.dart:225-240 \u2014 both copies are in the same file, so extract the block 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":"mobile/lib/features/channels/agent_activity/transcript_item_widget.dart"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"de8365cce59c08da50cb45132871e4890b8e52d292532475913e0ed4fbd95763"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart:120-135 | mobile/lib/features/channels/channel_stars/channel_stars_manager.dart:120-135 \u2014 \u0060mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart\u0060 and \u0060mobile/lib/features/channels/channel_stars/channel_stars_manager.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 14 separate duplicated blocks between them, totalling at least 225 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf17b2a541cb90e2fda5ee74456d1dc2af783ea20770a228c5881d8337a26450"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201316 lines \u00D7 2): mobile/lib/features/channels/channels_page/channel_tile.dart:98-112 | mobile/lib/features/search/search_page.dart:680-695 \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":"mobile/lib/features/channels/channels_page/channel_tile.dart"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"71ebb46aa901aebca871d19b379e52183bd8a7f460ad469c56992e8b58145cb4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): mobile/lib/features/channels/channels_page/sections.dart:124-139 | mobile/lib/features/channels/channels_page/sections.dart:527-542 \u2014 both copies are in the same file, so extract the block 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":"mobile/lib/features/channels/channels_page/sections.dart"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b25cbe657b2c2ca4631c079c760783ffbbdaac2f7c8d79cbae4b9aab7eea899"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): mobile/lib/features/activity/activity_provider.dart:604-618 | mobile/lib/features/channels/channels_provider.dart:470-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":"mobile/lib/features/activity/activity_provider.dart"},"region":{"startLine":604}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d7b0f90222f610525a6aecbb1df4cf5d9c4d8300090221ca384a9a144426db1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): mobile/lib/features/channels/channel_detail_page/message_list.dart:561-575 | mobile/lib/features/channels/thread_detail_page.dart:787-801 \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":"mobile/lib/features/channels/channel_detail_page/message_list.dart"},"region":{"startLine":561}}}],"partialFingerprints":{"codehealthFindingId/v1":"34af2cdad25cb049de1a10c98fb97f6cc8b7975b5bc284f6236fc171e051caf1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): mobile/lib/features/channels/compose_bar/compose_bar_widget.dart:844-858 | mobile/lib/features/channels/compose_bar/compose_bar_widget.dart:929-943 \u2014 both copies are in the same file, so extract the block 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":"mobile/lib/features/channels/compose_bar/compose_bar_widget.dart"},"region":{"startLine":844}}}],"partialFingerprints":{"codehealthFindingId/v1":"37d00f4e3b6c3c9a89a0355b42e086bc5c9f05c1973c80be1c618fb8216484a0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201315 lines \u00D7 2): mobile/lib/features/pulse/compose_note_page.dart:190-204 | mobile/lib/features/pulse/note_card.dart:70-82 \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":"mobile/lib/features/pulse/compose_note_page.dart"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"019adfe6818ec776539eff48114cb419ad73ca5a6013c89e2561243a9c19609d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201315 lines \u00D7 2): mobile/lib/shared/push/push_bootstrap.dart:235-248 | mobile/lib/shared/push/push_bootstrap.dart:307-321 \u2014 both copies are in the same file, so extract the block 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":"mobile/lib/shared/push/push_bootstrap.dart"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"18c4bfc776cd1ed1ac5f57f2bd627f3769e8d3335790bb8454225a93e653761e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): mobile/lib/shared/widgets/bouncing_dots_indicator.dart:31-45 | mobile/lib/shared/widgets/buzz_loading_indicator.dart:30-44 \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":"mobile/lib/shared/widgets/bouncing_dots_indicator.dart"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"e066880946a3f9b570fa870c1a5733c31291dde7cdc276166552292e215e38a6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3): mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart:203-216 | mobile/lib/features/channels/channel_sections/channel_sections_manager.dart:303-316 | mobile/lib/features/channels/channel_stars/channel_stars_manager.dart:203-216 \u2014 \u0060mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart\u0060 and \u0060mobile/lib/features/channels/channel_sections/channel_sections_manager.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 5 separate duplicated blocks between them, totalling at least 89 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c57f79563afd7e94886b40d696e897f97b1ade0517475fc57ef9ef93f076f1a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201314 lines \u00D7 2): mobile/lib/features/activity/activity_page/inbox_row.dart:295-308 | mobile/lib/features/search/search_page.dart:897-905 \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":"mobile/lib/features/activity/activity_page/inbox_row.dart"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"81d2d1b0c08edff49bfca8d51ec47617c0b1a0c6f42c056522d6cf3f59ed6f4d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): mobile/lib/features/settings/theme_picker_page/theme_home_preview.dart:224-238 | mobile/lib/features/settings/theme_picker_page/theme_home_preview.dart:300-313 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/settings/theme_picker_page/theme_home_preview.dart"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"2785d72020e363ca155a41e3a25475b5a261acd4b5adf8b09b97c97aeeff76c1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): mobile/lib/features/activity/activity_page.dart:274-286 | mobile/lib/features/activity/activity_page.dart:305-317 \u2014 both copies are in the same file, so extract the block 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":"mobile/lib/features/activity/activity_page.dart"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"8506e3ea7eab31d87e6532255ef85628511f6b40665cbf8d28afd4478485aa95"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): mobile/lib/features/channels/channel_detail_page.dart:575-587 | mobile/lib/features/channels/thread_detail_page.dart:827-839 \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":"mobile/lib/features/channels/channel_detail_page.dart"},"region":{"startLine":575}}}],"partialFingerprints":{"codehealthFindingId/v1":"34747ecea6f1322435658d5a8dfa8c55ab742c4de142d65699e58d7437a23210"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): mobile/lib/features/channels/channel_detail_page/message_bubble.dart:104-116 | mobile/lib/features/channels/thread_detail_page/thread_message.dart:84-96 \u2014 before extracting anything, compare \u0060mobile/lib/features/channels/channel_detail_page/message_bubble.dart\u0060 and \u0060mobile/lib/features/channels/thread_detail_page/thread_message.dart\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 182 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_detail_page/message_bubble.dart"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e099e171fd291719a0fe50ab7731068ad9461a22d814aae6716fd54e6782cd7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201313 lines \u00D7 2): mobile/lib/features/channels/compose_bar/markdown_editing_controller.dart:530-538 | mobile/lib/features/channels/compose_bar/markdown_editing_controller.dart:578-590 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/compose_bar/markdown_editing_controller.dart"},"region":{"startLine":530}}}],"partialFingerprints":{"codehealthFindingId/v1":"c596e9a2a300f01066f21939e3a8d0962c44378b4886bbbd31d69b672a9ad700"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): mobile/lib/features/forum/forum_thread_page.dart:168-180 | mobile/lib/features/forum/forum_thread_page.dart:596-608 \u2014 both copies are in the same file, so extract the block 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":"mobile/lib/features/forum/forum_thread_page.dart"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9647335b0fd593195d56fa4a66b27eee5bca7f5921784d60de4e577a932edcd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201313 lines \u00D7 2): mobile/lib/shared/widgets/ios_glass_navigation_action.dart:59-70 | mobile/lib/shared/widgets/ios_glass_navigation_button.dart:125-137 \u2014 before extracting anything, compare \u0060mobile/lib/shared/widgets/ios_glass_navigation_action.dart\u0060 and \u0060mobile/lib/shared/widgets/ios_glass_navigation_button.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 30 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/widgets/ios_glass_navigation_action.dart"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"de77eb26cb1bd6a3d486dd68080256ec09d072f5de7689b5028172346355c0f9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201313 lines \u00D7 2): mobile/lib/shared/widgets/ios_glass_theme_pagination.dart:40-52 | mobile/lib/shared/widgets/ios_native_skin_tone_control.dart:41-52 \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":"mobile/lib/shared/widgets/ios_glass_theme_pagination.dart"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"783daa75b498d3f62168cf1319bc5f4b6068d4d67f4369719b95e7b07588dba2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3): mobile/lib/features/profile/profile_edit_page.dart:706-717 | mobile/lib/features/profile/profile_text_edit_sheet.dart:147-158 | mobile/lib/features/profile/profile_text_editor.dart:219-230 \u2014 before extracting anything, compare \u0060mobile/lib/features/profile/profile_edit_page.dart\u0060 and \u0060mobile/lib/features/profile/profile_text_edit_sheet.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 45 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/profile/profile_edit_page.dart"},"region":{"startLine":706}}}],"partialFingerprints":{"codehealthFindingId/v1":"01f655fb6ce2acc79cf95bdb928155ba9bfd7a916203f582b78d521950c5673e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 2): mobile/lib/features/channels/channel_actions_sheet.dart:217-228 | mobile/lib/features/channels/channel_details_page.dart:200-210 \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":"mobile/lib/features/channels/channel_actions_sheet.dart"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2496d26a7ceca32e8246ee7be8e286bdd12e81b1b45bc1768fa801908e2b48f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): mobile/lib/features/channels/channel_detail_page/banners.dart:66-77 | mobile/lib/features/channels/channel_detail_page/banners.dart:162-173 \u2014 both copies are in the same file, so extract the block 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":"mobile/lib/features/channels/channel_detail_page/banners.dart"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d6064c4a053feac31db585323916df51791da5a618a70f9df90573f1cd9a4a4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 2): mobile/lib/features/channels/channel_detail_page/message_bubble.dart:120-130 | mobile/lib/features/channels/thread_detail_page/thread_message.dart:130-141 \u2014 before extracting anything, compare \u0060mobile/lib/features/channels/channel_detail_page/message_bubble.dart\u0060 and \u0060mobile/lib/features/channels/thread_detail_page/thread_message.dart\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 182 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_detail_page/message_bubble.dart"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"575148e70c556184447dc60f8ee452d7ed28e6cbb35139add89ea6d169478927"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): mobile/lib/features/channels/channel_detail_page/message_list.dart:683-694 | mobile/lib/features/forum/forum_posts_view.dart:199-210 \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":"mobile/lib/features/channels/channel_detail_page/message_list.dart"},"region":{"startLine":683}}}],"partialFingerprints":{"codehealthFindingId/v1":"7627120a1b333c1e06b806db2139121b7ad378269ae0b8631120dd59fb7fc961"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): mobile/lib/features/pairing/pairing_provider.dart:226-237 | mobile/lib/features/pairing/pairing_provider.dart:248-259 \u2014 both copies are in the same file, so extract the block 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":"mobile/lib/features/pairing/pairing_provider.dart"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d86cc721f877f35480d4be9e8a54e408312a4080b142a1b135bdd1425863c75"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201312 lines \u00D7 2): mobile/lib/features/settings/theme_picker_page/theme_preview_sheet.dart:179-190 | mobile/lib/features/settings/theme_picker_page/theme_preview_sheet.dart:597-605 \u2014 both copies are in the same file, so extract the block 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":"mobile/lib/features/settings/theme_picker_page/theme_preview_sheet.dart"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"5db862cb349f7699959af025f05d45b964d814c33d454d5b5a90c31eac3c7549"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): mobile/lib/features/channels/channels_page/body.dart:246-256 | mobile/lib/features/channels/channels_page/body.dart:358-368 | mobile/lib/features/channels/channels_page/body.dart:373-383 \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":"mobile/lib/features/channels/channels_page/body.dart"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"e592b4652f0731fbad102f3a43e42920bfa25b4acc84c30152b72514d6fee2a9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): mobile/lib/features/forum/forum_post_card.dart:290-300 | mobile/lib/features/forum/forum_thread_page.dart:165-175 | mobile/lib/features/forum/forum_thread_page.dart:593-603 \u2014 before extracting anything, compare \u0060mobile/lib/features/forum/forum_post_card.dart\u0060 and \u0060mobile/lib/features/forum/forum_thread_page.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 64 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/forum/forum_post_card.dart"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"343635b6eb7586c84100f681e1adab86dcc2aa7d0aa814e7ebc008b354d8e1bf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201311 lines \u00D7 2): mobile/lib/features/channels/channel_detail_page.dart:504-514 | mobile/lib/features/channels/channels_page.dart:276-285 \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":"mobile/lib/features/channels/channel_detail_page.dart"},"region":{"startLine":504}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e102985450dfc17b4a1d592a65edb26c5d2c9f649b98a22454f5205d986f7a7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): mobile/lib/features/channels/message_actions/message_action_popover.dart:523-533 | mobile/lib/features/channels/message_actions/reaction_popover.dart:105-115 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/message_actions/message_action_popover.dart"},"region":{"startLine":523}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f359cb6d5036d430fe2130a3715740418862022302241283b0303340ed81fd7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): mobile/lib/features/forum/forum_post_card.dart:267-277 | mobile/lib/features/forum/forum_thread_page.dart:570-580 \u2014 before extracting anything, compare \u0060mobile/lib/features/forum/forum_post_card.dart\u0060 and \u0060mobile/lib/features/forum/forum_thread_page.dart\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 64 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/forum/forum_post_card.dart"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e1616f4eab2a493a3cf254e0cb8d5c16e486ab48538daa762abbd777b4b83b1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): mobile/lib/features/profile/profile_text_edit_sheet.dart:91-101 | mobile/lib/shared/widgets/buzz_sheet_header.dart:102-112 \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":"mobile/lib/features/profile/profile_text_edit_sheet.dart"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfe3341f5b54f088a3effbc6a8440ce784ab35b2d66b529151124734c4a8d225"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): mobile/lib/shared/widgets/buzz_titled_sheet_layout.dart:87-97 | mobile/lib/shared/widgets/frosted_scaffold.dart:78-88 \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":"mobile/lib/shared/widgets/buzz_titled_sheet_layout.dart"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4fdf0425f8b8b2e7d9064461ff7426724884685803b492ba658d156cea34b51"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 4): mobile/lib/shared/theme/app_theme.dart:142-151 | mobile/lib/shared/theme/app_theme.dart:155-164 | mobile/lib/shared/theme/app_theme.dart:170-179 | mobile/lib/shared/theme/app_theme.dart:183-192 \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":"mobile/lib/shared/theme/app_theme.dart"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7ea255759837c3a9c7c2d271f4f87bbbcc6fed82ab3ecd170f20b03985f8fa2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): mobile/lib/features/channels/channel_mutes/channel_mutes_provider.dart:30-39 | mobile/lib/features/channels/channel_sections/channel_sections_provider.dart:30-39 | mobile/lib/features/channels/channel_stars/channel_stars_provider.dart:30-39 \u2014 \u0060mobile/lib/features/channels/channel_mutes/channel_mutes_provider.dart\u0060 and \u0060mobile/lib/features/channels/channel_sections/channel_sections_provider.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 3 separate duplicated blocks between them, totalling at least 45 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_mutes/channel_mutes_provider.dart"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ebcad695d2255f36c1038750fdd865f3e0fe3a9a44d067f12b85dc727eddee6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): mobile/lib/features/channels/channel.dart:51-60 | mobile/lib/features/channels/channel.dart:209-218 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel.dart"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"9afcee6b631a17e3ff7fc5b0d46fa2cb1b29d913eb63261834ea05ed9685a426"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): mobile/lib/features/channels/channel_detail_page.dart:504-513 | mobile/lib/features/channels/channels_page.dart:294-303 \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":"mobile/lib/features/channels/channel_detail_page.dart"},"region":{"startLine":504}}}],"partialFingerprints":{"codehealthFindingId/v1":"dccac7db3ff9e697f4a3dd774fc0228b5fe2a66b215c9ade38445b43b84f2b32"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): mobile/lib/features/channels/channel_detail_page/system_rows.dart:584-593 | mobile/lib/features/channels/thread_detail_page/nested_thread_summary_row.dart:45-56 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_detail_page/system_rows.dart"},"region":{"startLine":584}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5b2a88a7a2e22697447466768365e65833725b0eceb0fa71ee5be836ffc67ef"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): mobile/lib/features/channels/message_content.dart:875-884 | mobile/lib/features/channels/message_content/token_pill.dart: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":"mobile/lib/features/channels/message_content.dart"},"region":{"startLine":875}}}],"partialFingerprints":{"codehealthFindingId/v1":"7258668376d7a9e6061987b6d79608c4a4060769700f185452afcfa0113cdf1b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 4): mobile/lib/shared/widgets/ios_glass_navigation_action.dart:59-66 | mobile/lib/shared/widgets/ios_glass_navigation_button.dart:125-133 | mobile/lib/shared/widgets/ios_glass_theme_pagination.dart:48-56 | mobile/lib/shared/widgets/ios_native_segmented_control.dart:51-58 \u2014 before extracting anything, compare \u0060mobile/lib/shared/widgets/ios_glass_navigation_action.dart\u0060 and \u0060mobile/lib/shared/widgets/ios_glass_navigation_button.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 30 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/widgets/ios_glass_navigation_action.dart"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbe4a8a129d431f69317912d1595884eaa2e8540483c05de0095c51c1cd97a53"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart:320-327 | mobile/lib/features/channels/channel_stars/channel_stars_manager.dart:320-327 \u2014 \u0060mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart\u0060 and \u0060mobile/lib/features/channels/channel_stars/channel_stars_manager.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 14 separate duplicated blocks between them, totalling at least 225 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart"},"region":{"startLine":320}}}],"partialFingerprints":{"codehealthFindingId/v1":"5be9f6e4cd45306228e944cc36fd42973e1e02dc6e4991144dc0bdf4e1df30f3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): mobile/lib/shared/huddle/huddle_media.dart:472-479 | mobile/lib/shared/huddle/huddle_media.dart:500-509 \u2014 both copies are in the same file, so extract the block 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":"mobile/lib/shared/huddle/huddle_media.dart"},"region":{"startLine":472}}}],"partialFingerprints":{"codehealthFindingId/v1":"e99a1491fe569e940354c176ffa2615c45d635134689345f8b3727773e28cfd2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): mobile/lib/shared/widgets/ios_glass_navigation_action.dart:43-50 | mobile/lib/shared/widgets/ios_glass_navigation_button.dart:106-113 \u2014 before extracting anything, compare \u0060mobile/lib/shared/widgets/ios_glass_navigation_action.dart\u0060 and \u0060mobile/lib/shared/widgets/ios_glass_navigation_button.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 30 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/widgets/ios_glass_navigation_action.dart"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"869b493eef3fa27c1c6ecb38d106e79b1c12ba7a147f2b0de9eeb04cea9f734f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): mobile/lib/features/profile/profile_edit_page.dart:649-655 | mobile/lib/features/profile/profile_text_edit_sheet.dart:39-45 | mobile/lib/features/profile/profile_text_editor.dart:162-168 \u2014 before extracting anything, compare \u0060mobile/lib/features/profile/profile_edit_page.dart\u0060 and \u0060mobile/lib/features/profile/profile_text_edit_sheet.dart\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 45 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/profile/profile_edit_page.dart"},"region":{"startLine":649}}}],"partialFingerprints":{"codehealthFindingId/v1":"44930b9d762d04d65aa13ab971aa3267d65a39926eb9ba1d44430ce1a890a897"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): mobile/lib/features/forum/forum_models.dart:31-37 | mobile/lib/features/forum/forum_models.dart:124-130 \u2014 both copies are in the same file, so extract the block 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":"mobile/lib/features/forum/forum_models.dart"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"342213759367011f4c6288d5108c99c63d6e0b29abbcbae01405fa347ebc5b8f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): mobile/lib/features/channels/add_members_sheet.dart:33-38 | mobile/lib/features/channels/channels_page/sheets.dart:452-459 \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":"mobile/lib/features/channels/add_members_sheet.dart"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"adefeb047bed1ecc3f5010767d7a721eeb524f6f24c3b9094de2c3f19f57df22"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): mobile/lib/shared/community/community_provider.dart:375-380 | mobile/lib/shared/community/community_provider.dart:464-469 \u2014 both copies are in the same file, so extract the block 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":"mobile/lib/shared/community/community_provider.dart"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"34ba9c1893890c7d406c6c57136b779b082efd3997a39c4591f37e78d59aa0be"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 4): mobile/lib/shared/community/community_provider.dart:375-380 | mobile/lib/shared/community/community_provider.dart:464-469 | mobile/lib/shared/community/community_provider.dart:536-540 | mobile/lib/shared/community/community_provider.dart:576-580 \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":"mobile/lib/shared/community/community_provider.dart"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"653fb193c766502b5ca5b05ede9cf7290f311e410d03a58784f053792f49bf89"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): mobile/lib/features/channels/channel_detail_page/message_bubble.dart:48-52 | mobile/lib/features/channels/thread_detail_page/thread_message.dart:39-43 \u2014 before extracting anything, compare \u0060mobile/lib/features/channels/channel_detail_page/message_bubble.dart\u0060 and \u0060mobile/lib/features/channels/thread_detail_page/thread_message.dart\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 182 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_detail_page/message_bubble.dart"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"efae4b2e97e21a9e3af3b3134fc783cc7f05b492c3d3670d3b46e51b0866cd1c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart:80-90 | mobile/lib/features/channels/channel_sections/channel_sections_manager.dart:83-93 | mobile/lib/features/channels/channel_stars/channel_stars_manager.dart:80-90 \u2014 \u0060mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart\u0060 and \u0060mobile/lib/features/channels/channel_sections/channel_sections_manager.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 5 separate duplicated blocks between them, totalling at least 89 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fa726b623b4beb0cf4251c1e3a5dcb67fbf52c8dbb145ceb020b473b7c386dd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart:231-238 | mobile/lib/features/channels/channel_stars/channel_stars_manager.dart:231-238 \u2014 \u0060mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart\u0060 and \u0060mobile/lib/features/channels/channel_stars/channel_stars_manager.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 14 separate duplicated blocks between them, totalling at least 225 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"67eab144a6d092ee80dbdf648d1dcf83ed2215a3dd2bbfb0c399da7a1eb6cdff"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart:266-273 | mobile/lib/features/channels/channel_stars/channel_stars_manager.dart:266-273 \u2014 \u0060mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart\u0060 and \u0060mobile/lib/features/channels/channel_stars/channel_stars_manager.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 14 separate duplicated blocks between them, totalling at least 225 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"7345b68c61e6d031ac2b885798f9ee9ea14fc505eddc72c57dc75a250bd92eec"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart:313-318 | mobile/lib/features/channels/channel_stars/channel_stars_manager.dart:313-318 \u2014 \u0060mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart\u0060 and \u0060mobile/lib/features/channels/channel_stars/channel_stars_manager.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 14 separate duplicated blocks between them, totalling at least 225 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"29ae9414fdf4dcc1ecb36fa3d0dbcf2aa6a6d8a5dfeb0dc5b6736d889697ebf0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart:381-389 | mobile/lib/features/channels/channel_stars/channel_stars_manager.dart:381-389 \u2014 \u0060mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart\u0060 and \u0060mobile/lib/features/channels/channel_stars/channel_stars_manager.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 14 separate duplicated blocks between them, totalling at least 225 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_mutes/channel_mutes_manager.dart"},"region":{"startLine":381}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3d78ed7917f36903da4581fdabaddc0aba0dee61c34ad16f3c6c9429244eb3b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): mobile/lib/features/channels/channels_page/channel_tile.dart:243-249 | mobile/lib/features/profile/profile_avatar.dart:108-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":"mobile/lib/features/channels/channels_page/channel_tile.dart"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"9147ecbf2078ada934477bc7c8c03202512f9061062dee22af8f80d00948c542"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): mobile/lib/features/channels/members_sheet.dart:459-467 | mobile/lib/features/channels/reaction_row.dart:499-507 \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":"mobile/lib/features/channels/members_sheet.dart"},"region":{"startLine":459}}}],"partialFingerprints":{"codehealthFindingId/v1":"80226897f0392cb47cd72e38c1dd2d1e5b5bf5388b946a2d5c51776455571892"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): mobile/lib/features/invites/invite_create_page/invite_link_section.dart:236-243 | mobile/lib/features/settings/settings_page.dart:267-274 \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":"mobile/lib/features/invites/invite_create_page/invite_link_section.dart"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"123ffc5138f1e91bc675b0555999775739d8ca82de89ea2c43c3266d609a0054"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 4): mobile/lib/features/channels/channel_mutes/channel_mutes_provider.dart:98-105 | mobile/lib/features/channels/channel_sections/channel_sections_provider.dart:116-123 | mobile/lib/features/channels/channel_sort/channel_sort_provider.dart:109-116 | mobile/lib/features/channels/channel_stars/channel_stars_provider.dart:98-105 \u2014 \u0060mobile/lib/features/channels/channel_mutes/channel_mutes_provider.dart\u0060 and \u0060mobile/lib/features/channels/channel_sections/channel_sections_provider.dart\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 3 separate duplicated blocks between them, totalling at least 45 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/channels/channel_mutes/channel_mutes_provider.dart"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb54e3a14095730e7529e4dcc0c9b540af561a17cd5151c8f0cc2732a1b8d12e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): mobile/lib/features/channels/channel_mutes/channel_mutes_storage.dart:15-19 | mobile/lib/features/channels/channel_stars/channel_stars_storage.dart:15-19 \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":"mobile/lib/features/channels/channel_mutes/channel_mutes_storage.dart"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e4f7fbfb0f056d5a0c8c7e91d6ee254c8ece1908fc47cb26b4d475d671707c2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): mobile/lib/features/channels/channel_mutes/channel_mutes_storage.dart:36-40 | mobile/lib/features/channels/channel_stars/channel_stars_storage.dart:36-40 \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":"mobile/lib/features/channels/channel_mutes/channel_mutes_storage.dart"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"661ca0f47de95f7e04bfeee7e360f75b2182befce09fa2b920104cbe56f87e5a"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: buzz-core: buzz-core: abstractness 0.00, instability 0.00, distance 1.00 \u2014 zone of pain \u2014 concrete and depended on by 18 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"53bf603235e3cf47c2090d3e5066986895d9d05184848d1b0a0374c3359af9fd"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: buzz-persona: buzz-persona: abstractness 0.00, instability 0.00, distance 1.00 \u2014 zone of pain \u2014 concrete and depended on by 3 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ec05eda9fbb8ff2c21a2ee094e1b15c7bcfb93abd4fe8a66355ee0a259cf331d"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: buzz-voice: buzz-voice: abstractness 0.00, instability 0.00, distance 1.00 \u2014 zone of pain \u2014 concrete and depended on by 1 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"58bee8c02b990c90c45143634d93562ff755a89284f3a0908d3bc7936e46dca2"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: buzz-ws-client: buzz-ws-client: abstractness 0.00, instability 0.00, distance 1.00 \u2014 zone of pain \u2014 concrete and depended on by 3 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"0cf11cb061154c47dd0b493de5d3bb0d070769139691c67106c52105906a8627"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: git-credential-nostr: git-credential-nostr: abstractness 0.00, instability 0.00, distance 1.00 \u2014 zone of pain \u2014 concrete and depended on by 1 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d8afdea3917e5bb015a573bc15534ffbd749065e41870d85527b023c2d014abd"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: git-sign-nostr: git-sign-nostr: abstractness 0.00, instability 0.00, distance 1.00 \u2014 zone of pain \u2014 concrete and depended on by 1 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"a0477b9a9e48a97ef157c21bcfb297466047570277094d13fe77a2bdaed5636e"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: buzz-agent: buzz-agent: abstractness 0.03, instability 0.00, distance 0.97 \u2014 zone of pain \u2014 concrete and depended on by 2 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ccf17e5ee2fd569d90bff1cc8a32567352cb5b717c1bd58b1678b84885c788de"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: buzz-conformance: buzz-conformance: abstractness 0.09, instability 0.00, distance 0.91 \u2014 zone of pain \u2014 concrete and depended on by 1 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"04fa753719dbf25332a932ca82ca18fde2069409b9961e5772d746a9bd12197a"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: buzz-terminal: buzz-terminal: abstractness 0.10, instability 0.00, distance 0.90 \u2014 zone of pain \u2014 concrete and depended on by 1 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"29e644936d3ffc002ffcb9863cb18b18815ac0c2c311ab1d9885d24aa5c30f4d"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: buzz-relay-mesh: buzz-relay-mesh: abstractness 0.14, instability 0.00, distance 0.86 \u2014 zone of pain \u2014 concrete and depended on by 1 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ca213aa068017f04523075eac1d59e692550e09317000faefa84fed61037b8f5"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: buzz-sdk: buzz-sdk: abstractness 0.05, instability 0.20, distance 0.75 \u2014 zone of pain \u2014 concrete and depended on by 4 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"72b4158422dd607ba1c8624c9aa6a6f4e59fbd370eb96966f9f1d2241eb825eb"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: buzz-media: buzz-media: abstractness 0.00, instability 0.25, distance 0.75 \u2014 zone of pain \u2014 concrete and depended on by 3 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"aca59d486612894701dca3325e447046089ae5567b88573c9ab6ad8d0372c55e"}},{"ruleId":"D8","level":"warning","message":{"text":"Coverage not measured \u2014 JavaScript/TypeScript suite: Coverage NOT MEASURED: the JavaScript/TypeScript half could not be measured \u2014 admin-web/ runs vitest but declares no coverage provider, so the suite can run and still produce no lcov \u2014 add \u0060@vitest/coverage-v8\u0060 (or \u0060@vitest/coverage-istanbul\u0060) as a devDependency. Coverage is excluded from the score rather than counted as a near-zero. The named suite step is one the repository\u0027s maintainers can perform; once it passes, the real number is measured on the next scan. Alternatively, commit the lcov/Cobertura report your CI produces and it is read without a re-run."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"62e63e619c28f057e129f2997c965d32a457366a9ce18ca019ffb6bdfba85c99"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: ${row.name}: ${row.desc}: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/adminConsolePanel.test.mjs"},"region":{"startLine":1066}}}],"partialFingerprints":{"codehealthFindingId/v1":"d805e313084a3ea3dc69a1aab2f4444e7c030ddeeae0b337e923962df96f708f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: draining is a no-op when nothing is pending: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/mentionPasteBinding.test.mjs"},"region":{"startLine":442}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebd6a077bb859dd3643f652f85afff20f3b0219ce72b78a9c527d12801b21de4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: reveal resolves without the timer when the invoke chain settles: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/notifications/lib/desktopActivations.test.mjs"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"1882ad03bfd4d6d48737782ec7e8fc822fda6feedb783239197f6d028cc0cceb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: closeWebSocket is idempotent when the native socket is gone: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/api/relayWebSocketClose.test.mjs"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"92339116cde962cd7f4dde680a70c57ef4961782948d24c342b02c076795245b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: settle releases every operation waiting on a successful reconnect: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/api/relayReconnectWaiters.test.mjs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5eb331a67cee65bb7211238d0efea6789df8cff3693e11427a607e812f3a090"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: stalled early AUTH signing times out and starts a replacement dial: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/tests/e2e/relay-reconnect.spec.ts"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"8726c31077a7588de58579177e512380d0ba7045291fdb3c85c372b6fdafe33f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: storage clear resets composed font size and keyboard zoom across windows: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/tests/e2e/profile.spec.ts"},"region":{"startLine":2606}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5b7f941113a2500983cb78e68049e24cfda5b202318b3c00fb1312ae2e3b180"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: owner can add multiple admins directly by npub from live Invites UI: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/tests/e2e/invites-settings-screenshots.spec.ts"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"e029f66919ed69bba527aed1f1e4fa0adcc308fd896d96aa63188cfdb92f4a71"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: picker survives cancel, same-file retry, and multiple selection: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/tests/e2e/file-attachment.spec.ts"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"df8424d8c3f0a2e9847370122f3445c697650467069477a657ae0f25ba414c42"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: switches the active community on click: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/tests/e2e/community-rail.spec.ts"},"region":{"startLine":460}}}],"partialFingerprints":{"codehealthFindingId/v1":"b74dfaedb7f82dc13dfc162885613b480af8ed9f588467929832e05a71673f89"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: capture: add-channel default state: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/tests/e2e/channel-add-screenshots.spec.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a6ad6bfc1beee2dfc8f6be8d9e779e51c491266521a6c45fbc1d9c8fe749bc5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: capture: create row on partial match: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/tests/e2e/channel-add-screenshots.spec.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a5b21862edd94b9e8e279e41f444c18b0ed97a8e66c33902ef46f499793540f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: capture: create row on no match: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/tests/e2e/channel-add-screenshots.spec.ts"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"9076ace2866ee4d649c0525c2cd79dcb66a615ee689bcfc13912308852d7ee5b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: capture: prefilled create form: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/tests/e2e/channel-add-screenshots.spec.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff596d6c5017767a03628bd993e973399b4e0487dbf6ffe6ec6a25e0ea0a6fba"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: capture: add-community choices: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/tests/e2e/add-community-screenshots.spec.ts"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee9f1d825973839870ad3949942b30a9822cb19de87cb2b84442998d2467b652"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: capture: join an existing community: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/tests/e2e/add-community-screenshots.spec.ts"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"37f4eabd77ee44e4dde7aad3ee6f3a16d2224ddad4f7ae1362427b27305fee9b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: capture: create a new community: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/tests/e2e/add-community-screenshots.spec.ts"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d3e32123fd58479354349b93ebc88e85e0e9d777ded2e99c0a72c440c75e2b7"}},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c0779609acc98904a4cab23e525a0884ae3981daee04688a3194712c5f93ba8a"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3ee61082d2908892f4a148c0d936f873a14bff49fdfdee02008ef36498d3dace"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c6d7f19e9cf7969fcdd030d3dee8cb14f63a5578476934735e6d8162a81b13e3"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f798c35d43f1c85399abfe942a08dde5328907b9d5e6929d17915cafa8619f32"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c95b43329ce14ad3160442a227658ccd70d4f59f4341098f6e9c13aedf6f12c4"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/testing/e2eBridge.ts: desktop/src/testing/e2eBridge.ts changed 225 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 592 in e2eBridge.maybeInstallE2eTauriMocks at line 11397. 80 of those changes were fix/bug commits, and the other 145 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/testing/e2eBridge.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/testing/e2eBridge.ts"},"region":{"startLine":11397}}}],"partialFingerprints":{"codehealthFindingId/v1":"16119b0a03f3ee1eea1f2c4bff54249930ca4a4fed4be6cc9d2f99c295cf8f87"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-acp/src/lib.rs: crates/buzz-acp/src/lib.rs changed 55 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 169 in buzz_acp::run_harness at line 2575. 24 of those changes were fix/bug commits, and the other 31 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-acp/src/lib.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/lib.rs"},"region":{"startLine":2575}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8f081998bdf497c295ad90bddb6e573078bbac033369b6cdfc18c6fb4b8acb3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/channels/ui/ChannelPane.tsx: desktop/src/features/channels/ui/ChannelPane.tsx changed 57 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 128 in ChannelPane.ChannelPane at line 78. 24 of those changes were fix/bug commits, and the other 33 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/channels/ui/ChannelPane.tsx\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":"desktop/src/features/channels/ui/ChannelPane.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"61f76a6b993ae9ef63d82450779a03cbcf6fcde22f00693fe7c356dfe33e1499"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-relay/src/handlers/ingest.rs: crates/buzz-relay/src/handlers/ingest.rs changed 38 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 149 in buzz_relay::handlers::ingest::ingest_event_inner at line 2252. 6 of those changes were fix/bug commits, and the other 32 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-relay/src/handlers/ingest.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/buzz-relay/src/handlers/ingest.rs"},"region":{"startLine":2252}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0456d1d73e75aec6fbf04867a07f1502d5742722a25ab1bd33a33abb5a2ee69"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/lib.rs: desktop/src-tauri/src/lib.rs changed 117 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 46 in buzz_desktop::run at line 101. 34 of those changes were fix/bug commits, and the other 83 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/lib.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/lib.rs"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"49bfedeb3b12dd5c42771971d9ac857be4006b4c35a98ea195ee9e9ef96c9aae"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/AgentDefinitionDialog.tsx: desktop/src/features/agents/ui/AgentDefinitionDialog.tsx changed 36 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 124 in AgentDefinitionDialog.AgentDefinitionDialog at line 124. 8 of those changes were fix/bug commits, and the other 28 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/AgentDefinitionDialog.tsx\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":"desktop/src/features/agents/ui/AgentDefinitionDialog.tsx"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"b056cf91304b460e2406dff8abf9f346f1dc3f668e24f2f0ef787d9a6664570c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/thread_detail_page.dart: mobile/lib/features/channels/thread_detail_page.dart changed 31 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 138 in ThreadDetailPage.build at line 93. 13 of those changes were fix/bug commits, and the other 18 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/thread_detail_page.dart\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":"mobile/lib/features/channels/thread_detail_page.dart"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"420b133771ce64c1c161df005d74b68745d935c0d2fce93b2c838a8597c53af1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/MessageComposer.tsx: desktop/src/features/messages/ui/MessageComposer.tsx changed 38 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 109 in MessageComposer.MessageComposerImpl at line 70. 19 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/MessageComposer.tsx\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":"desktop/src/features/messages/ui/MessageComposer.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"14a4b558733e08abfc1fd7f676050ff3366c04e99f3bdb857ca71c1b8ffdf4e8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/profile/ui/UserProfilePanel.tsx: desktop/src/features/profile/ui/UserProfilePanel.tsx changed 27 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 147 in UserProfilePanel.UserProfilePanel at line 104. 14 of those changes were fix/bug commits, so the churn is repair rather than feature work. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/profile/ui/UserProfilePanel.tsx\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":"desktop/src/features/profile/ui/UserProfilePanel.tsx"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"f288199420bf56a39aaa71027d27bcdf75265202cdd27c86a12fb1dec1ecb815"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/shared/ui/markdown.tsx: desktop/src/shared/ui/markdown.tsx changed 35 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 112 in markdown.ImageZoomOverlay at line 149. 12 of those changes were fix/bug commits, and the other 23 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/shared/ui/markdown.tsx\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":"desktop/src/shared/ui/markdown.tsx"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5c37e90e8789ebce57f2a4dce7532424c34d7041840a367f9c3ac0bfaa89ba3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/AgentConfigFields.tsx: desktop/src/features/agents/ui/AgentConfigFields.tsx changed 23 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 170 in AgentConfigFields.AgentConfigFields at line 212. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/AgentConfigFields.tsx\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":"desktop/src/features/agents/ui/AgentConfigFields.tsx"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca189bb624ebe5b6f3efd9169f24d773665722925ecd7865506d2597a3fa882a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/AgentInstanceEditDialog.tsx: desktop/src/features/agents/ui/AgentInstanceEditDialog.tsx changed 33 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 108 in AgentInstanceEditDialog.AgentInstanceEditDialog at line 100. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/AgentInstanceEditDialog.tsx\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":"desktop/src/features/agents/ui/AgentInstanceEditDialog.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"92a3439dac2765da3e1df7d74ae553ec7b84df8bc2c47aa44b49d59f29519f93"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-relay/src/main.rs: crates/buzz-relay/src/main.rs changed 41 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 86 in buzz_relay::run_relay_main 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-relay/src/main.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/buzz-relay/src/main.rs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"562c90ec7a7a16436d6945ea0b7e3c9269126abf50922ffb4f9ee4f1cefff518"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/useMentionSendFlow.ts: desktop/src/features/messages/ui/useMentionSendFlow.ts changed 24 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 138 in useMentionSendFlow.useMentionSendFlow at line 51. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/useMentionSendFlow.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useMentionSendFlow.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"875d38dc33d011945623cbcff6b66ff8850e5ae30921e31bfb225a93cceeef5f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/channel_detail_page/message_list.dart: mobile/lib/features/channels/channel_detail_page/message_list.dart changed 20 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 161 in _MessageList.build at line 42. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/channel_detail_page/message_list.dart\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":"mobile/lib/features/channels/channel_detail_page/message_list.dart"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f100d517bb61dbb6318463a172679ceb4c6d140bfc40d0473aa3a8bd0627e40"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-acp/src/pool.rs: crates/buzz-acp/src/pool.rs changed 45 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 71 in buzz_acp::pool::run_prompt_task at line 2323. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-acp/src/pool.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/buzz-acp/src/pool.rs"},"region":{"startLine":2323}}}],"partialFingerprints":{"codehealthFindingId/v1":"27469a2f6416eeb30089674abaa295bb0f3f20373dddc2e22968bbec999f5842"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/MessageThreadPanel.tsx: desktop/src/features/messages/ui/MessageThreadPanel.tsx changed 34 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 91 in MessageThreadPanel.MessageThreadPanel at line 145. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/MessageThreadPanel.tsx\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":"desktop/src/features/messages/ui/MessageThreadPanel.tsx"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec6850ce7de3d157028572cd1e30be6e5dcfbc94b863af8839de2c3791962cd8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/channel_detail_page.dart: mobile/lib/features/channels/channel_detail_page.dart changed 34 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 85 in ChannelDetailPage.build at line 268. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/channel_detail_page.dart\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":"mobile/lib/features/channels/channel_detail_page.dart"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"f795acfcb3a314b0f8b44a2beb539fccbf7cc539fc1bbc207d804e064824f95e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/MessageRow.tsx: desktop/src/features/messages/ui/MessageRow.tsx changed 34 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 85 in MessageRow.MessageRow at line 72. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/MessageRow.tsx\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":"desktop/src/features/messages/ui/MessageRow.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe7ebbccd0f577e62e62e78077e19596be64f91d398c8743e4f5c4ebbcf47dc4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/app/AppShell.tsx: desktop/src/app/AppShell.tsx changed 62 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 45 in AppShell.AppShell at line 110. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/app/AppShell.tsx\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":"desktop/src/app/AppShell.tsx"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"a12e360c3d39331170d572e3372f8615f9af32967f279e1c8a8ce8812ccf8817"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/lib/useMentions.ts: desktop/src/features/messages/lib/useMentions.ts changed 29 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 88 in useMentions.useMentions 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/lib/useMentions.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useMentions.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"fde21a3334a0e0533125c3d5ed885254a324c222490c4f34c9583e531ebf671e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/AgentsView.tsx: desktop/src/features/agents/ui/AgentsView.tsx changed 31 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 79 in AgentsView.AgentsView at line 40. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/AgentsView.tsx\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":"desktop/src/features/agents/ui/AgentsView.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1020641fb47d0be78d5d26feb1dc4ca3c13cba60adfb83288446317b94c36f8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/channels/ui/ChannelScreen.tsx: desktop/src/features/channels/ui/ChannelScreen.tsx changed 37 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 66 in ChannelScreen.ChannelScreen at line 90. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/channels/ui/ChannelScreen.tsx\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":"desktop/src/features/channels/ui/ChannelScreen.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c2d90c753eafa4ecb1fb67a0a998d9d674ff281a3d376a37293204ba599cef9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-relay/src/api/bridge.rs: crates/buzz-relay/src/api/bridge.rs changed 33 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 69 in buzz_relay::api::bridge::query_events_authed at line 1306. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-relay/src/api/bridge.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/buzz-relay/src/api/bridge.rs"},"region":{"startLine":1306}}}],"partialFingerprints":{"codehealthFindingId/v1":"de24b681b9ec0d443b62aa8e38524a22f9b846851892232eed4f75b50b2ecdcd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/onboarding/ui/CommunityOnboardingFlow.tsx: desktop/src/features/onboarding/ui/CommunityOnboardingFlow.tsx changed 24 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 93 in CommunityOnboardingFlow.CommunityOnboardingFlow at line 157. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/onboarding/ui/CommunityOnboardingFlow.tsx\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":"desktop/src/features/onboarding/ui/CommunityOnboardingFlow.tsx"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"8050d15c8f378ef37324e67be9efdb232dbd9f59dd1db9b70aed5ed759ee6baa"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/sidebar/ui/AppSidebar.tsx: desktop/src/features/sidebar/ui/AppSidebar.tsx changed 36 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 61 in AppSidebar.AppSidebar at line 80. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/sidebar/ui/AppSidebar.tsx\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":"desktop/src/features/sidebar/ui/AppSidebar.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c3c60d97e0518a9aae3af78a60b14e17be173f5453fe0853c9c93c329b678ee"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-relay/src/config.rs: crates/buzz-relay/src/config.rs changed 32 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 67 in Config::from_env at line 605. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-relay/src/config.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/config.rs"},"region":{"startLine":605}}}],"partialFingerprints":{"codehealthFindingId/v1":"87e7df8fa206725b8b3930e8b2514788f98be95301778918809841a823af30b8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/channels/ui/MembersSidebar.tsx: desktop/src/features/channels/ui/MembersSidebar.tsx changed 22 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 95 in MembersSidebar.MembersSidebar at line 138. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/channels/ui/MembersSidebar.tsx\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":"desktop/src/features/channels/ui/MembersSidebar.tsx"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd7eb497b2675117ebe90685512cd6a2526d3bced12b262742a2d07783b141df"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/MessageTimeline.tsx: desktop/src/features/messages/ui/MessageTimeline.tsx changed 19 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 106 in MessageTimeline.MessageTimelineBase at line 162. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/MessageTimeline.tsx\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":"desktop/src/features/messages/ui/MessageTimeline.tsx"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"25b9c7a4dafa7d48c749d086b13c2de2387637e6e9b0d406bd6bbdaff6db7e45"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/home/ui/HomeView.tsx: desktop/src/features/home/ui/HomeView.tsx changed 22 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 87 in HomeView.HomeView at line 101. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/home/ui/HomeView.tsx\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":"desktop/src/features/home/ui/HomeView.tsx"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec65af9ed610c552c901f65d9046559cc9a3d96728993a8f30ed702230bf79d8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/app/App.tsx: desktop/src/app/App.tsx changed 38 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 47 in App.CommunityApp at line 360. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/app/App.tsx\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":"desktop/src/app/App.tsx"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"76bca0b975a626c734088f0874b59dd9aa7b8def700c58f8d8ccef8222aa7e10"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/home/ui/InboxDetailPane.tsx: desktop/src/features/home/ui/InboxDetailPane.tsx changed 25 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 71 in InboxDetailPane.InboxMessageDetailPane at line 166. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/home/ui/InboxDetailPane.tsx\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":"desktop/src/features/home/ui/InboxDetailPane.tsx"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cab71b119df93bb7866142e42674166c4554789a29c7459c3fa3840c18b46ae"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/projects/ui/ProjectDetailScreen.tsx: desktop/src/features/projects/ui/ProjectDetailScreen.tsx changed 20 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 86 in ProjectDetailScreen.ProjectDetailScreen at line 87. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/projects/ui/ProjectDetailScreen.tsx\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":"desktop/src/features/projects/ui/ProjectDetailScreen.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"594cddd473d47fb18b37a0673572f4e082ed5c38c8ee81d69fb9fe7b8eff50c5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/profile/ui/UserProfilePopover.tsx: desktop/src/features/profile/ui/UserProfilePopover.tsx changed 25 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 64 in UserProfilePopover.UserProfilePopoverBody at line 257. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/profile/ui/UserProfilePopover.tsx\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":"desktop/src/features/profile/ui/UserProfilePopover.tsx"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3ce50fabfd91c1a22163d686befbdbe38653c27f4f2ca82a202a84598af56db"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/managed_agents/runtime.rs: desktop/src-tauri/src/managed_agents/runtime.rs changed 52 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in buzz_desktop::managed_agents::runtime::spawn_agent_child at line 484. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/managed_agents/runtime.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":"desktop/src-tauri/src/managed_agents/runtime.rs"},"region":{"startLine":484}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d9647ee67240e3c28e1a2e4e14869a70d3e2e1f954d6b3f1b72378c9739569b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/profile/ui/UserProfilePanelSections.tsx: desktop/src/features/profile/ui/UserProfilePanelSections.tsx changed 18 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 83 in UserProfilePanelSections.ProfileSummaryView at line 136. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/profile/ui/UserProfilePanelSections.tsx\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":"desktop/src/features/profile/ui/UserProfilePanelSections.tsx"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3f8394098feb62ee5d05c6935fb2bf00a9da341567561ac76e62ce6dc13c4e4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-relay/src/handlers/side_effects.rs: crates/buzz-relay/src/handlers/side_effects.rs changed 27 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 54 in buzz_relay::handlers::side_effects::validate_admin_event at line 445. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-relay/src/handlers/side_effects.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/buzz-relay/src/handlers/side_effects.rs"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"79e632218e53a958f1fc5aec3f0f70490a322a041700a6f093521a14d4c3d7d9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/forum/ui/ForumComposer.tsx: desktop/src/features/forum/ui/ForumComposer.tsx changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 112 in ForumComposer.ForumComposerVisit at line 52. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/forum/ui/ForumComposer.tsx\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":"desktop/src/features/forum/ui/ForumComposer.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6a7fc551bd68ca96f583d624c0b7171e1e82203a366fd22723a917de0a32dba"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/projects/ui/ProjectsView.tsx: desktop/src/features/projects/ui/ProjectsView.tsx changed 21 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 64 in ProjectsView.ProjectsView at line 111. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/projects/ui/ProjectsView.tsx\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":"desktop/src/features/projects/ui/ProjectsView.tsx"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c5b20f8de41ba3f8278fc658189065b14c486bb47a0a27caa6286250302198e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-acp/src/acp.rs: crates/buzz-acp/src/acp.rs changed 29 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 46 in AcpClient::read_until_response_with_idle_timeout at line 1371. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-acp/src/acp.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/buzz-acp/src/acp.rs"},"region":{"startLine":1371}}}],"partialFingerprints":{"codehealthFindingId/v1":"5eeebcc36faa584a08b1ff1ca236573ab1ea16150dc7f33fe12867e5f25a37b7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/onboarding/ui/MachineOnboardingFlow.tsx: desktop/src/features/onboarding/ui/MachineOnboardingFlow.tsx changed 23 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 58 in MachineOnboardingFlow.MachineOnboardingFlow at line 57. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/onboarding/ui/MachineOnboardingFlow.tsx\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":"desktop/src/features/onboarding/ui/MachineOnboardingFlow.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"b188a9d60807b3aac043e6212a0e17ffb46789ad6c856baa614f035c9dd1b4d8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-agent/src/llm.rs: crates/buzz-agent/src/llm.rs changed 37 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 36 in buzz_agent::llm::openrouter_post at line 2258. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-agent/src/llm.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/buzz-agent/src/llm.rs"},"region":{"startLine":2258}}}],"partialFingerprints":{"codehealthFindingId/v1":"9caf463f044092d6c5159560d8a77198aa2303f55426d2d95e4a269ef0b38d33"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/onboarding/ui/NostrKeyImportForm.tsx: desktop/src/features/onboarding/ui/NostrKeyImportForm.tsx changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 100 in NostrKeyImportForm.NostrKeyImportForm at line 60. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/onboarding/ui/NostrKeyImportForm.tsx\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":"desktop/src/features/onboarding/ui/NostrKeyImportForm.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"58789ed5f0ea23c917c0fd8927e7a8aebace7c54936d7dfa5ef6386e48cab464"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/lib/useRichTextEditor.ts: desktop/src/features/messages/lib/useRichTextEditor.ts changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 77 in useRichTextEditor.useRichTextEditor at line 145. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/lib/useRichTextEditor.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useRichTextEditor.ts"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"4399b30ba8fa20112cee6a6b2ff414dbfbff42a02c2f50e6eb68c8554576b419"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/commands/agents.rs: desktop/src-tauri/src/commands/agents.rs changed 40 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in buzz_desktop::commands::agents::create_managed_agent at line 341. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/commands/agents.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":"desktop/src-tauri/src/commands/agents.rs"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fd16b03c4d10b64317f8b1bc1e457bd461e8d190c2534a3b40256bca7841392"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/useAnchoredScroll.ts: desktop/src/features/messages/ui/useAnchoredScroll.ts changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 118 in useAnchoredScroll.useAnchoredScroll at line 150. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/useAnchoredScroll.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useAnchoredScroll.ts"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe8a901be97f45473a58882d49164c97c77ff243ade48abab9442e16ad7faede"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/channels/useUnreadChannels.ts: desktop/src/features/channels/useUnreadChannels.ts changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 107 in useUnreadChannels.useUnreadChannels at line 126. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/channels/useUnreadChannels.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/useUnreadChannels.ts"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"00eb22127d4f213c70a8a353ace88fe1f5c292bf267b22c2d90488d095a7f42b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/usePersonaActions.ts: desktop/src/features/agents/ui/usePersonaActions.ts changed 20 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 55 in usePersonaActions.usePersonaActions at line 69. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/usePersonaActions.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/usePersonaActions.ts"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5d2e4f82fe213f71dcf1d725e2d97391a16912ce72a9e7a3de9e68e45978b71"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-db/src/store/event.rs: crates/buzz-db/src/store/event.rs changed 25 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 43 in buzz_db::store::event::query_events_on at line 474. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-db/src/store/event.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/buzz-db/src/store/event.rs"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"811633fa8674f804e15dee08b307f105ee6f7366b22ba288f9a3103e63d50927"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/communities/useCommunityInit.ts: desktop/src/features/communities/useCommunityInit.ts changed 30 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 35 in useCommunityInit.useCommunityInit at line 128. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/communities/useCommunityInit.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/communities/useCommunityInit.ts"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c07bce6f659763a406e98ab05c35606c6bed3bb8e834de57d7436f238877e2a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/settings/ui/ProfileSettingsCard.tsx: desktop/src/features/settings/ui/ProfileSettingsCard.tsx changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 85 in ProfileSettingsCard.ProfileSettingsCard at line 135. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/settings/ui/ProfileSettingsCard.tsx\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":"desktop/src/features/settings/ui/ProfileSettingsCard.tsx"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"25a80994fe964d9c07bc893961efeaec6e15c14ff7bc7b82dfdd16f8c00f6a9a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/TimelineMessageList.tsx: desktop/src/features/messages/ui/TimelineMessageList.tsx changed 20 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 49 in TimelineMessageList.VirtualizedTimelineRows at line 423. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/TimelineMessageList.tsx\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":"desktop/src/features/messages/ui/TimelineMessageList.tsx"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"921ab8dc139a5f4734a7f030a72fbc3c0f952a8100e8f442457bb4141a991cef"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/projects/ui/ProjectWorkspaceTabs.tsx: desktop/src/features/projects/ui/ProjectWorkspaceTabs.tsx changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 61 in ProjectWorkspaceTabs.WorkspaceTabs at line 86. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/projects/ui/ProjectWorkspaceTabs.tsx\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":"desktop/src/features/projects/ui/ProjectWorkspaceTabs.tsx"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"4063ba1651dccc2058d491bc3c4586bd2331d265649083327a976b0b1916abbf"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/settings/ui/SettingsPanels.tsx: desktop/src/features/settings/ui/SettingsPanels.tsx changed 26 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 37 in SettingsPanels.ThemeSettingsCard at line 421. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/settings/ui/SettingsPanels.tsx\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":"desktop/src/features/settings/ui/SettingsPanels.tsx"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b175b780f6a230c966a44ef0cffd588ca4659a44f2e387e3c43ef6cb0cbceec"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-acp/src/relay.rs: crates/buzz-acp/src/relay.rs changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 64 in buzz_acp::relay::run_background_task at line 1736. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-acp/src/relay.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/buzz-acp/src/relay.rs"},"region":{"startLine":1736}}}],"partialFingerprints":{"codehealthFindingId/v1":"589676b2d20bada103e4c56a68a53a3f589d82a3192a6bed549c0fcb3bd3b824"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/huddle/components/HuddleBar.tsx: desktop/src/features/huddle/components/HuddleBar.tsx changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 99 in HuddleBar.HuddleBar 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/huddle/components/HuddleBar.tsx\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":"desktop/src/features/huddle/components/HuddleBar.tsx"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ace95f0f988b835cf5652c8f0f8683676b5170faeade2654186feeac8af45d0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/MentionAutocomplete.tsx: desktop/src/features/messages/ui/MentionAutocomplete.tsx changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 62 in MentionAutocomplete.MentionAutocomplete at line 71. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/MentionAutocomplete.tsx\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":"desktop/src/features/messages/ui/MentionAutocomplete.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"50efd1bc0307525d8292f985008ec0d976cd786d282cda5b4c75c69bd427b749"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/activity/activity_page.dart: mobile/lib/features/activity/activity_page.dart changed 17 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 50 in ActivityPage.build at line 72. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/activity/activity_page.dart\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":"mobile/lib/features/activity/activity_page.dart"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a1788a07be4921d4c3ba7ce100090b02f3f29ad1e1b579f92b57163a9197f95"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-acp/src/config.rs: crates/buzz-acp/src/config.rs changed 22 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 38 in Config::from_args at line 933. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-acp/src/config.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-acp/src/config.rs"},"region":{"startLine":933}}}],"partialFingerprints":{"codehealthFindingId/v1":"89e20b81df7a09fac563abb2b312c43dd2d9d337f5ce198d46ade1d97ae72ebe"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/projects/ui/ProjectPullRequestsPanel.tsx: desktop/src/features/projects/ui/ProjectPullRequestsPanel.tsx changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 52 in ProjectPullRequestsPanel.ProjectPullRequestDetail at line 400. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/projects/ui/ProjectPullRequestsPanel.tsx\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":"desktop/src/features/projects/ui/ProjectPullRequestsPanel.tsx"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"275c52b3196333e3cdcea1e20e3e6f4d7d52d5bc731ef237b9abba39b5d0a656"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/AgentCreationPreview.tsx: desktop/src/features/agents/ui/AgentCreationPreview.tsx changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 138 in AgentCreationPreview.AgentCreationPreview at line 47. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/AgentCreationPreview.tsx\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":"desktop/src/features/agents/ui/AgentCreationPreview.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"e680a430a611ed4ea98a4a140f3f08b0e4fd018fd81a85e772dfa5d90286a493"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/huddle/HuddleContext.tsx: desktop/src/features/huddle/HuddleContext.tsx changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 89 in HuddleContext.HuddleProvider at line 65. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/huddle/HuddleContext.tsx\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":"desktop/src/features/huddle/HuddleContext.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"e937d3f0735aceae688615e407ab143a8a49bb344d578f0f247ad88b1a50cd43"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-agent/src/agent.rs: crates/buzz-agent/src/agent.rs changed 21 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 38 in RunCtx::run at line 318. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-agent/src/agent.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/buzz-agent/src/agent.rs"},"region":{"startLine":318}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a0805adc63b8e04623953e56af8de3dfef8cd83253d0b90c84c0a045498d9b0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/compose_bar/compose_bar_widget.dart: mobile/lib/features/channels/compose_bar/compose_bar_widget.dart changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 99 in ComposeBar.build at line 33. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/compose_bar/compose_bar_widget.dart\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":"mobile/lib/features/channels/compose_bar/compose_bar_widget.dart"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae42710377f4b2f86a343924a65f553757d4653a2bd38421431a4b042e62e517"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/onboarding/ui/SetupStep.tsx: desktop/src/features/onboarding/ui/SetupStep.tsx changed 27 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 29 in SetupStep.SetupStepContent at line 963. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/onboarding/ui/SetupStep.tsx\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":"desktop/src/features/onboarding/ui/SetupStep.tsx"},"region":{"startLine":963}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fa61addf0ebfb70284fc2ea06b9060888474fbf8f798b3def697780da0d81d1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/onboarding/ui/InviteRedeemForm.tsx: desktop/src/features/onboarding/ui/InviteRedeemForm.tsx changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 87 in InviteRedeemForm.InviteRedeemForm at line 63. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/onboarding/ui/InviteRedeemForm.tsx\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":"desktop/src/features/onboarding/ui/InviteRedeemForm.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"2759e05e4d013d26122ad091f24376fd70983b72b05eff82bf9045a0bee06856"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/agentSessionTranscript.ts: desktop/src/features/agents/ui/agentSessionTranscript.ts changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 65 in agentSessionTranscript.processTranscriptEvent at line 700. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/agentSessionTranscript.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/agentSessionTranscript.ts"},"region":{"startLine":700}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca46e6630ab979ce941391dfe86b9aeba58d0b63275df996bcf82a0d202641de"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-cli/src/lib.rs: crates/buzz-cli/src/lib.rs changed 29 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 26 in buzz_cli::run at line 2146. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-cli/src/lib.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/lib.rs"},"region":{"startLine":2146}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b14a67198504baa610e5de829ba9f54eb8a8c018cca667c7b59f1bab7954d97"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/profile/ui/ProfileAvatarEditor.tsx: desktop/src/features/profile/ui/ProfileAvatarEditor.tsx changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 148 in ProfileAvatarEditor.ProfileAvatarEditor at line 67. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/profile/ui/ProfileAvatarEditor.tsx\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":"desktop/src/features/profile/ui/ProfileAvatarEditor.tsx"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a02f8f94d731cfbbd36bd45cb6eef7ef7eabe904a5de2e3f6258f772f095347"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/search/ui/TopbarSearch.tsx: desktop/src/features/search/ui/TopbarSearch.tsx changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 81 in TopbarSearch.TopbarSearch at line 376. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/search/ui/TopbarSearch.tsx\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":"desktop/src/features/search/ui/TopbarSearch.tsx"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d8d20a85245e7176cda4ec1e5869a67fc227f98f60f74ca97f3e529027c7cd2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/home/ui/InboxListPane.tsx: desktop/src/features/home/ui/InboxListPane.tsx changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 52 in InboxListPane.InboxListPane at line 243. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/home/ui/InboxListPane.tsx\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":"desktop/src/features/home/ui/InboxListPane.tsx"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"929c3856aff93f8c654e2ea601841e197d08842d64587745a2d33f4bc96aa557"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/channels_provider.dart: mobile/lib/features/channels/channels_provider.dart changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 47 in ChannelsNotifier._fetchChannels at line 175. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/channels_provider.dart\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":"mobile/lib/features/channels/channels_provider.dart"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"f82ce238f6819b8bc23c0c27e5d852ab2e049d3186d5b1085ceeb97d49978951"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/channels/ui/ChannelManagementSheet.tsx: desktop/src/features/channels/ui/ChannelManagementSheet.tsx changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 62 in ChannelManagementSheet.ChannelManagementSheet at line 99. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/channels/ui/ChannelManagementSheet.tsx\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":"desktop/src/features/channels/ui/ChannelManagementSheet.tsx"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0281b96a44c673b791093c9e891d33c5c68d26b5e090b21931cb71632a51c38"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/shared/api/relayClientSession.ts: desktop/src/shared/api/relayClientSession.ts changed 26 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 26 in RelayClient.handleWsMessage at line 867. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/shared/api/relayClientSession.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/api/relayClientSession.ts"},"region":{"startLine":867}}}],"partialFingerprints":{"codehealthFindingId/v1":"4214b3f8c3da8298b523be87c77590a783ef6afad0643ebb0f6762cbe7a20c36"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/communities/ui/WelcomeSetup.tsx: desktop/src/features/communities/ui/WelcomeSetup.tsx changed 25 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 26 in WelcomeSetup.WelcomeSetup at line 33. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/communities/ui/WelcomeSetup.tsx\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":"desktop/src/features/communities/ui/WelcomeSetup.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb4cd9fca0b9773b7682748dcdefff1dbecbb36a1afa65345c3a2b71e8b53596"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/channels/ui/AgentSessionThreadPanel.tsx: desktop/src/features/channels/ui/AgentSessionThreadPanel.tsx changed 17 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 38 in AgentSessionThreadPanel.AgentSessionThreadPanel at line 90. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/channels/ui/AgentSessionThreadPanel.tsx\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":"desktop/src/features/channels/ui/AgentSessionThreadPanel.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6832ead5a8bdbfc83d3f5b98cb56043f566e65b2c3e8696427943557c798603"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-relay/src/handlers/req.rs: crates/buzz-relay/src/handlers/req.rs changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 43 in buzz_relay::handlers::req::handle_req at line 52. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-relay/src/handlers/req.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/buzz-relay/src/handlers/req.rs"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"aceab6c6bfc0a560e6a06172fb6bc0f0e967b0285d8794268a1e0f7cc2cb1dc5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/huddle/tts.rs: desktop/src-tauri/src/huddle/tts.rs changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 71 in buzz_desktop::huddle::tts::tts_worker at line 322. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/huddle/tts.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":"desktop/src-tauri/src/huddle/tts.rs"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"c24d2e22b09975a7f5b03e815ba74be48b75de3fdf4285633082e846a16f071c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/managed_agents/discovery.rs: desktop/src-tauri/src/managed_agents/discovery.rs changed 35 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in buzz_desktop::managed_agents::discovery::discover_acp_runtime_phase1 at line 937. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/managed_agents/discovery.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":"desktop/src-tauri/src/managed_agents/discovery.rs"},"region":{"startLine":937}}}],"partialFingerprints":{"codehealthFindingId/v1":"343d3549b78e560346a426e6d536e98b1aebd5644e44af54eecf0d35512bde92"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-acp/src/queue.rs: crates/buzz-acp/src/queue.rs changed 23 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in buzz_acp::queue::format_context_hints at line 1606. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-acp/src/queue.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/buzz-acp/src/queue.rs"},"region":{"startLine":1606}}}],"partialFingerprints":{"codehealthFindingId/v1":"61f3501012446063158c6874a98f9a3a1008e7245df8a3de61b5f39effe29164"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/message_content.dart: mobile/lib/features/channels/message_content.dart changed 18 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 34 in MessageContent._buildLink at line 400. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/message_content.dart\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":"mobile/lib/features/channels/message_content.dart"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfec8c454e64e9de012e5e823a6e141b376a7c432b6d98aa2eef7474d6d17427"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/shared/ui/VideoPlayer.tsx: desktop/src/shared/ui/VideoPlayer.tsx changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 87 in VideoPlayer.VideoReviewDialog at line 1198. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/shared/ui/VideoPlayer.tsx\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":"desktop/src/shared/ui/VideoPlayer.tsx"},"region":{"startLine":1198}}}],"partialFingerprints":{"codehealthFindingId/v1":"920c0e9eb36fdec792c79bf29cf63386308872b66ef824fc5256677b216f0b2e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/hooks.ts: desktop/src/features/messages/hooks.ts changed 21 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 29 in hooks.useChannelSubscription at line 318. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/hooks.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/hooks.ts"},"region":{"startLine":318}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed43092bce929e7e51eb39fb3339d50b30fded386e3bbb2018fa2a80d00c5b9e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/useManagedAgentActions.ts: desktop/src/features/agents/ui/useManagedAgentActions.ts changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 60 in useManagedAgentActions.useManagedAgentActions at line 41. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/useManagedAgentActions.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/useManagedAgentActions.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"61ec63845ed8754c1a88b07953bfa310e13eeefe7c116d2b2b235e429eb5bf08"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/lib/formatTimelineMessages.ts: desktop/src/features/messages/lib/formatTimelineMessages.ts changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 54 in formatTimelineMessages.formatTimelineMessages 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/lib/formatTimelineMessages.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/formatTimelineMessages.ts"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdfcc7ccf74f9a3bd2561cb60e01547fe3cffb65b1fde689bbf37e3dc27c7c1d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/agentConfigControls.tsx: desktop/src/features/agents/ui/agentConfigControls.tsx changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 38 in agentConfigControls.AgentModelField at line 337. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/agentConfigControls.tsx\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":"desktop/src/features/agents/ui/agentConfigControls.tsx"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"25843657de030b32e131fcac0e6e29e49747728c997726c8503285bbbd07c27d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/onboarding/ui/OnboardingFlow.tsx: desktop/src/features/onboarding/ui/OnboardingFlow.tsx changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 43 in OnboardingFlow.OnboardingFlow 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/onboarding/ui/OnboardingFlow.tsx\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":"desktop/src/features/onboarding/ui/OnboardingFlow.tsx"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"80589a1136defba58b9fc0ad5ba758610baecca5c4096b17a3a82f25baa1ddf1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/managed_agents/restore.rs: desktop/src-tauri/src/managed_agents/restore.rs changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 33 in buzz_desktop::managed_agents::restore::restore_managed_agents_on_launch at line 95. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/managed_agents/restore.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":"desktop/src-tauri/src/managed_agents/restore.rs"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"780267637f4644b45f847ca7dfbcd5e57acabd21656408d5244bbbdc06f7948a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/commands/agent_discovery.rs: desktop/src-tauri/src/commands/agent_discovery.rs changed 29 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in buzz_desktop::commands::agent_discovery::install_acp_runtime_blocking at line 251. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/commands/agent_discovery.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":"desktop/src-tauri/src/commands/agent_discovery.rs"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9724c3001c3a7b47d705f2622da6ab3fad65d60580e81851347b17cc67eee9e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/home/ui/InboxMessageRow.tsx: desktop/src/features/home/ui/InboxMessageRow.tsx changed 18 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in InboxMessageRow.InboxMessageRow at line 55. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/home/ui/InboxMessageRow.tsx\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":"desktop/src/features/home/ui/InboxMessageRow.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ce7183ef22c4cb835eff6457388394d83b6ef7a23b0dbb850c87d0ec955de6d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/onboarding/ui/BackupStep.tsx: desktop/src/features/onboarding/ui/BackupStep.tsx changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 50 in BackupStep.BackupStep at line 72. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/onboarding/ui/BackupStep.tsx\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":"desktop/src/features/onboarding/ui/BackupStep.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"46353d4af1f9998844ad938f622177d517f46c41e8312115e0faafc6a8dd4407"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/profile/ui/AnimatedAvatarCapture.tsx: desktop/src/features/profile/ui/AnimatedAvatarCapture.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 162 in AnimatedAvatarCapture.AnimatedAvatarCapture at line 71. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/profile/ui/AnimatedAvatarCapture.tsx\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":"desktop/src/features/profile/ui/AnimatedAvatarCapture.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"8840262f199bba450fdee42144d163c1ba227688aff60304cdcd614ea97d5a7b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-relay/src/handlers/event.rs: crates/buzz-relay/src/handlers/event.rs changed 22 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in buzz_relay::handlers::event::handle_event at line 608. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-relay/src/handlers/event.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/buzz-relay/src/handlers/event.rs"},"region":{"startLine":608}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7bb39ed22b1374d1b669db25a33b47b4396fb5eb6c5fd3ce2d24583fbc561e3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/sidebar/ui/SidebarSection.tsx: desktop/src/features/sidebar/ui/SidebarSection.tsx changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 29 in SidebarSection.ChannelMenuButton at line 246. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/sidebar/ui/SidebarSection.tsx\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":"desktop/src/features/sidebar/ui/SidebarSection.tsx"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"c167ff76b3c78995ca94bf954ea5506f5d13ae4c30058a375775a5d923f9eb86"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/channels_page.dart: mobile/lib/features/channels/channels_page.dart changed 22 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in ChannelsPage.build at line 178. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/channels_page.dart\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":"mobile/lib/features/channels/channels_page.dart"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"0823cddc70cbdeaff77132920b868a1abad32207ab4b236489f271f3057c26b9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-relay/src/audio/handler.rs: crates/buzz-relay/src/audio/handler.rs changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 57 in buzz_relay::audio::handler::handle_active_audio_connection at line 170. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-relay/src/audio/handler.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/buzz-relay/src/audio/handler.rs"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc25d411bc4075b8ca5541c36a9a55374d403019c61fbf9f6d293095ad3d1ebe"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/projects/ui/ProjectRepositoryPanel.tsx: desktop/src/features/projects/ui/ProjectRepositoryPanel.tsx changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in ProjectRepositoryPanel.RepositoryFilesPanel at line 614. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/projects/ui/ProjectRepositoryPanel.tsx\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":"desktop/src/features/projects/ui/ProjectRepositoryPanel.tsx"},"region":{"startLine":614}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f056784f5a1f4461e88e81c2abb39e42c9f774f2eea2c8828ce0fa93fcb2c95"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/channel_detail_page/message_bubble.dart: mobile/lib/features/channels/channel_detail_page/message_bubble.dart changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in _MessageBubble.build at line 30. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/channel_detail_page/message_bubble.dart\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":"mobile/lib/features/channels/channel_detail_page/message_bubble.dart"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"a455e470e25d232674ad131a59923bbeda610e7c2927558cd25b5a3cd8218d59"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/lib/useMediaUpload.ts: desktop/src/features/messages/lib/useMediaUpload.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 72 in useMediaUpload.useMediaUpload at line 161. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/lib/useMediaUpload.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useMediaUpload.ts"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f19c7a69d45bd66becfb98850e19fabcf7bb3087b3fda466eb0fbb5f27e8943"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/NewMessageScreen.tsx: desktop/src/features/messages/ui/NewMessageScreen.tsx changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 71 in NewMessageScreen.NewMessageScreen at line 29. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/NewMessageScreen.tsx\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":"desktop/src/features/messages/ui/NewMessageScreen.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d761cfd8e89a744f846ba04c8061566d2aea08fa8d362388f88cf4c20eec84c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-agent/src/config.rs: crates/buzz-agent/src/config.rs changed 21 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in Config::validate at line 812. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-agent/src/config.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/config.rs"},"region":{"startLine":812}}}],"partialFingerprints":{"codehealthFindingId/v1":"12f30f2e2362e8792da261a22894478e5b16b8e0f9e4c6e0f67f3076953cab65"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/profile/ui/NostrBindConsentDialog.tsx: desktop/src/features/profile/ui/NostrBindConsentDialog.tsx changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 84 in NostrBindConsentDialog.NostrBindConsentDialog at line 213. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/profile/ui/NostrBindConsentDialog.tsx\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":"desktop/src/features/profile/ui/NostrBindConsentDialog.tsx"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9f9a1a408324cbdf59d47051410a00744bfd59bfaf04b50aa8b50bf900ace41"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/ios/Runner/AppDelegate.swift: mobile/ios/Runner/AppDelegate.swift changed 19 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in AppDelegate.handleMediaUploadMethodCall at line 649. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/ios/Runner/AppDelegate.swift\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":"mobile/ios/Runner/AppDelegate.swift"},"region":{"startLine":649}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f9f2554ae39514a07da8055f2372869b55dc44c77e3fca2278c789b4cbc142e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/workflows/ui/WorkflowFormBuilder.tsx: desktop/src/features/workflows/ui/WorkflowFormBuilder.tsx changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 83 in WorkflowFormBuilder.WorkflowFormBuilder at line 357. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/workflows/ui/WorkflowFormBuilder.tsx\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":"desktop/src/features/workflows/ui/WorkflowFormBuilder.tsx"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fe170d61cf10cc36c632f872040b2f34a4c7578725f228028f6a9c4393c5f57"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/settings/ui/HarnessRow.tsx: desktop/src/features/settings/ui/HarnessRow.tsx changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in HarnessRow.HarnessRow at line 297. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/settings/ui/HarnessRow.tsx\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":"desktop/src/features/settings/ui/HarnessRow.tsx"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"25d5b3d42b3ba225176c0ff54013e30fffc8466e593c14554eada341310efe14"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/MessageActionBar.tsx: desktop/src/features/messages/ui/MessageActionBar.tsx changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in MessageActionBar.MessageActionBar at line 396. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/MessageActionBar.tsx\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":"desktop/src/features/messages/ui/MessageActionBar.tsx"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c393c4ebb022e6365a4e383483b92f23c0b906b9fcba2f362d3181ba2225b86"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/channel_detail_page/system_rows.dart: mobile/lib/features/channels/channel_detail_page/system_rows.dart changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 32 in _SystemMessageRow.build at line 22. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/channel_detail_page/system_rows.dart\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":"mobile/lib/features/channels/channel_detail_page/system_rows.dart"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ec4c7bfd069b3d1a3114b79791cc1f27d130f45602678184140a51c6a391b82"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/workflows/ui/WorkflowDialog.tsx: desktop/src/features/workflows/ui/WorkflowDialog.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 96 in WorkflowDialog.WorkflowDialog at line 216. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/workflows/ui/WorkflowDialog.tsx\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":"desktop/src/features/workflows/ui/WorkflowDialog.tsx"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"43e78fbb4704cebf156eea22c72a5a812bd87c376bce885091ff7228744332ea"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/projects/ui/PullRequestReviewersRow.tsx: desktop/src/features/projects/ui/PullRequestReviewersRow.tsx changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 47 in PullRequestReviewersRow.PullRequestReviewersRow at line 60. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/projects/ui/PullRequestReviewersRow.tsx\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":"desktop/src/features/projects/ui/PullRequestReviewersRow.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a398402efa8323bfebeb9895748e7302bced6b1db23c5c66779569b2106430e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/app_state.rs: desktop/src-tauri/src/app_state.rs changed 22 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in buzz_desktop::app_state::resolve_identity_with_store at line 382. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/app_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":"desktop/src-tauri/src/app_state.rs"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf002b05c1f9537e8f196306d0dcfb3feb933cad87d6850c3b23ba24a1e20381"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/onboarding/ui/DefaultConfigStep.tsx: desktop/src/features/onboarding/ui/DefaultConfigStep.tsx changed 17 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in DefaultConfigStep.AgentDefaultsSection at line 51. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/onboarding/ui/DefaultConfigStep.tsx\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":"desktop/src/features/onboarding/ui/DefaultConfigStep.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a3c89f4637b2d488b99365d330801c90a0d6b63b349c55139c2525bf399951c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/SystemMessageRow.tsx: desktop/src/features/messages/ui/SystemMessageRow.tsx changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 37 in SystemMessageRow.SystemMessageRow at line 649. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/SystemMessageRow.tsx\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":"desktop/src/features/messages/ui/SystemMessageRow.tsx"},"region":{"startLine":649}}}],"partialFingerprints":{"codehealthFindingId/v1":"c61d778d3e761637d6c716a23c99031f4d1c7aff6d91203836093e2c95088ede"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/terminal/TerminalSubstrate.tsx: desktop/src/features/terminal/TerminalSubstrate.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 123 in TerminalSubstrate.TerminalSubstrate at line 80. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/terminal/TerminalSubstrate.tsx\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":"desktop/src/features/terminal/TerminalSubstrate.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"77075ccd5116c619c0f730b2c9e4654d18f7ce32fb7f86f749c379460e53f8d4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/huddle/pipeline.rs: desktop/src-tauri/src/huddle/pipeline.rs changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in buzz_desktop::huddle::pipeline::check_pipeline_hotstart at line 38. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/huddle/pipeline.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":"desktop/src-tauri/src/huddle/pipeline.rs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"a57fb901f9bc96be1dbec567d6243f58290d50d276b51cfb2e77db05201ed8ac"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/modelCapabilities.ts: desktop/src/features/agents/ui/modelCapabilities.ts changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 51 in modelCapabilities.generateDatabricksLabel at line 514. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/modelCapabilities.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/modelCapabilities.ts"},"region":{"startLine":514}}}],"partialFingerprints":{"codehealthFindingId/v1":"26ef241c6ea2e34ddf624bb43d7e9ef5309274f92abcbcb28591d84442b3f1f9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/AgentDefaultsEditor.tsx: desktop/src/features/agents/ui/AgentDefaultsEditor.tsx changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 44 in AgentDefaultsEditor.AgentDefaultsEditor at line 69. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/AgentDefaultsEditor.tsx\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":"desktop/src/features/agents/ui/AgentDefaultsEditor.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"97e482877d6c174e40bbe8403b6de3898799e4b07cd3a9ba0a0f6a422085a2af"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/ComposerAttachments.tsx: desktop/src/features/messages/ui/ComposerAttachments.tsx changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 39 in ComposerAttachments.MediaAttachmentItem at line 253. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/ComposerAttachments.tsx\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":"desktop/src/features/messages/ui/ComposerAttachments.tsx"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"19503f6f1f87e8ed487ee7d6936ccd6e03b3e289a8c39e21080adecfae980523"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/channels/useLiveChannelUpdates.ts: desktop/src/features/channels/useLiveChannelUpdates.ts changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 50 in useLiveChannelUpdates.useLiveChannelUpdates at line 151. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/channels/useLiveChannelUpdates.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/useLiveChannelUpdates.ts"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff79709fbc733450fef976e1762afd88b70906de31a98bf8ac1ac0a892043e79"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/channel_details_page.dart: mobile/lib/features/channels/channel_details_page.dart changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 70 in ChannelDetailsPage.build at line 41. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/channel_details_page.dart\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":"mobile/lib/features/channels/channel_details_page.dart"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc818d631f06063046aa0386477e630b7712de6ca0317a21748e5910e1e7ec36"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/app/navigation/useAppNavigation.ts: desktop/src/app/navigation/useAppNavigation.ts changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in useAppNavigation.useAppNavigation at line 24. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/app/navigation/useAppNavigation.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/app/navigation/useAppNavigation.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"e05b4ab4b68dfea24305d58172d88275ff6207fba0b0017921b047fa54d09164"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/settings/ui/HostedCommunitiesSettingsCard.tsx: desktop/src/features/settings/ui/HostedCommunitiesSettingsCard.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 84 in HostedCommunitiesSettingsCard.HostedCommunitiesSettingsCard at line 69. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/settings/ui/HostedCommunitiesSettingsCard.tsx\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":"desktop/src/features/settings/ui/HostedCommunitiesSettingsCard.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"add9a3f86b63ea19823614bf0ebb493149c4db1868daadee595607f78a9c4388"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/features/invite/ui/InvitePage.tsx: web/src/features/invite/ui/InvitePage.tsx changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 42 in InvitePage.InvitePage at line 42. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- web/src/features/invite/ui/InvitePage.tsx\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":"web/src/features/invite/ui/InvitePage.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"9553709470eecdc2a222972b1162668517e80b7ff9b12456caf1194056cd8ae0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/onboarding/hooks.ts: desktop/src/features/onboarding/hooks.ts changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in hooks.useAppOnboardingState at line 466. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/onboarding/hooks.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/hooks.ts"},"region":{"startLine":466}}}],"partialFingerprints":{"codehealthFindingId/v1":"42916b4c09d8e5a77c3b452c8212e753fac41666ceae2d7e7b3fbbfa5068d483"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/lib/useDrafts.ts: desktop/src/features/messages/lib/useDrafts.ts changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in useDrafts.draftStatesEqual at line 386. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/lib/useDrafts.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useDrafts.ts"},"region":{"startLine":386}}}],"partialFingerprints":{"codehealthFindingId/v1":"274cee8c7a1671e3e7287c0397a555874a4f997211e45401d6899fba4fe3daf0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/channels_page/body.dart: mobile/lib/features/channels/channels_page/body.dart changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 32 in _SliverChannelsList.build at line 102. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/channels_page/body.dart\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":"mobile/lib/features/channels/channels_page/body.dart"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"5544056c5e277d9babf10bc096deb0294dbeeb7cde8f3bc9bae9d6db54d00780"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/channels/hooks.ts: desktop/src/features/channels/hooks.ts changed 21 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in hooks.useChannelsQuery at line 431. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/channels/hooks.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/hooks.ts"},"region":{"startLine":431}}}],"partialFingerprints":{"codehealthFindingId/v1":"de95c0e4303a373feabafe0069726f17461232d9469c9e027adf47af3eb221a5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/shared/relay/relay_session.dart: mobile/lib/shared/relay/relay_session.dart changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in RelaySessionNotifier._handleClosed at line 710. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/shared/relay/relay_session.dart\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":"mobile/lib/shared/relay/relay_session.dart"},"region":{"startLine":710}}}],"partialFingerprints":{"codehealthFindingId/v1":"d303a598095b3ec8999e38d22e9ca42717299769af4fa3017b0a38dcd85769d4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/communities/ui/HostedCommunityOnboarding.tsx: desktop/src/features/communities/ui/HostedCommunityOnboarding.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 103 in HostedCommunityOnboarding.HostedCommunityOnboarding at line 77. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/communities/ui/HostedCommunityOnboarding.tsx\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":"desktop/src/features/communities/ui/HostedCommunityOnboarding.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"188bfa03fef6f6a267700e2311bcb782b9331143d7a5560fabc60b3bf5efb20e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/search/search_page.dart: mobile/lib/features/search/search_page.dart changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in SearchPage.build at line 105. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/search/search_page.dart\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":"mobile/lib/features/search/search_page.dart"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"8363fef6162982a567bc4022de493903a5638581c32af6beed257c16596b6b10"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/deep_link.rs: desktop/src-tauri/src/deep_link.rs changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in buzz_desktop::deep_link::parse_entity_deep_link at line 424. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/deep_link.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":"desktop/src-tauri/src/deep_link.rs"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"48b05ea8e944ca7fa697bc77755c04d1f3f730ae074fa30b47485ebf74bd99aa"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/media_viewer_page.dart: mobile/lib/features/channels/media_viewer_page.dart changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 51 in MediaImageViewerPage.build at line 195. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/media_viewer_page.dart\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":"mobile/lib/features/channels/media_viewer_page.dart"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"8052e28aaef4c48b2ff4fababea62c9b58ee4c230eaeea68b4e0131e83a736ed"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/search/useSearchResults.ts: desktop/src/features/search/useSearchResults.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 61 in useSearchResults.useSearchResults at line 102. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/search/useSearchResults.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/search/useSearchResults.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfbab19731497c37df2aae39bb879d665ae554d74d5899c0ef17a44469d730bf"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/commands/team_snapshot.rs: desktop/src-tauri/src/commands/team_snapshot.rs changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in buzz_desktop::commands::team_snapshot::confirm_team_snapshot_import at line 511. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/commands/team_snapshot.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":"desktop/src-tauri/src/commands/team_snapshot.rs"},"region":{"startLine":511}}}],"partialFingerprints":{"codehealthFindingId/v1":"50853ee4986572a275bfd4db70dc7e8d6465b4074e4f58ca8e530d63db968615"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/projects/ui/ProjectReadmePanel.tsx: desktop/src/features/projects/ui/ProjectReadmePanel.tsx changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in ProjectReadmePanel.ReadmePanel at line 94. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/projects/ui/ProjectReadmePanel.tsx\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":"desktop/src/features/projects/ui/ProjectReadmePanel.tsx"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"333782d6ab1921e587fce0e4348b91b6e2d1b8b1778068844b8bc4ff1ebe3319"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/community-members/ui/CommunityMembersSettingsCard.tsx: desktop/src/features/community-members/ui/CommunityMembersSettingsCard.tsx changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in CommunityMembersSettingsCard.RelayMemberRow at line 91. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/community-members/ui/CommunityMembersSettingsCard.tsx\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":"desktop/src/features/community-members/ui/CommunityMembersSettingsCard.tsx"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8bb33bb5eb4594057ed9f48450fa65a6781f62f3ad9f393ec0a61cad461fd76"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/profile/ui/UserProfilePanelTabs.tsx: desktop/src/features/profile/ui/UserProfilePanelTabs.tsx changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in UserProfilePanelTabs.ProfileRuntimeTabContent at line 713. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/profile/ui/UserProfilePanelTabs.tsx\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":"desktop/src/features/profile/ui/UserProfilePanelTabs.tsx"},"region":{"startLine":713}}}],"partialFingerprints":{"codehealthFindingId/v1":"19aa41b4b363b73de2c921ea5cf5f9fda8d515348d281bc021312a328c8f4fbd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/channels/ui/ChannelBrowserDialog.tsx: desktop/src/features/channels/ui/ChannelBrowserDialog.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 74 in ChannelBrowserDialog.ChannelBrowserDialog at line 102. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/channels/ui/ChannelBrowserDialog.tsx\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":"desktop/src/features/channels/ui/ChannelBrowserDialog.tsx"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc33f2c7932542b19ec25e74c92bc87739860c82d50cd70599faaa7c9c16dec4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/huddle/playout.rs: desktop/src-tauri/src/huddle/playout.rs changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 49 in buzz_desktop::huddle::playout::run_playout_recv_loop at line 273. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/huddle/playout.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":"desktop/src-tauri/src/huddle/playout.rs"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"961f4e48aec433c5054734ea90dcac628d2e0cff8d995c8ec05a80e4869a9f88"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/EditAgentAdvancedFields.tsx: desktop/src/features/agents/ui/EditAgentAdvancedFields.tsx changed 17 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in EditAgentAdvancedFields.EditAgentAdvancedFields at line 35. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/EditAgentAdvancedFields.tsx\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":"desktop/src/features/agents/ui/EditAgentAdvancedFields.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"3968181718b652bd3ff90a19396f2779343f9a9ac57efc3943ac322f32e4733f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-db/src/store/channel.rs: crates/buzz-db/src/store/channel.rs changed 17 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in buzz_db::store::channel::update_channel at line 506. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-db/src/store/channel.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/buzz-db/src/store/channel.rs"},"region":{"startLine":506}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c4ad394f37cf49f014140c8ca76c05cb093f03caa088079b1d9d1d5515bfd43"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/agentConfigOptions.tsx: desktop/src/features/agents/ui/agentConfigOptions.tsx changed 17 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in agentConfigOptions.computeLocalModeGate at line 653. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/agentConfigOptions.tsx\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":"desktop/src/features/agents/ui/agentConfigOptions.tsx"},"region":{"startLine":653}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd329b4e45ead3902971e08a86fe11a9e84d57a69d65f069d3be3784c05a491b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-agent/src/lib.rs: crates/buzz-agent/src/lib.rs changed 18 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in buzz_agent::session_new at line 432. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-agent/src/lib.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-agent/src/lib.rs"},"region":{"startLine":432}}}],"partialFingerprints":{"codehealthFindingId/v1":"49a771da1ac5a8b46b5643fa1a7b9b85b175c06ae5c574420f98cd9286879a77"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/mesh-compute/ui/MeshComputeSettingsCard.tsx: desktop/src/features/mesh-compute/ui/MeshComputeSettingsCard.tsx changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 41 in MeshComputeSettingsCard.MeshComputeSettingsCard at line 87. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/mesh-compute/ui/MeshComputeSettingsCard.tsx\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":"desktop/src/features/mesh-compute/ui/MeshComputeSettingsCard.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f7ec69ebeab86f45284aeee2305d5abc76046c91d19bdaf75500afde8d57258"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/app.dart: mobile/lib/app.dart changed 19 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in App.build at line 296. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/app.dart\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":"mobile/lib/app.dart"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"12c4a9098f8052f229688472d4af24d3a0c48aea86c81892ddb3cd8e097aa024"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/channels/ui/MembersSidebarMemberCard.tsx: desktop/src/features/channels/ui/MembersSidebarMemberCard.tsx changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in MembersSidebarMemberCard.MembersSidebarMemberCard at line 121. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/channels/ui/MembersSidebarMemberCard.tsx\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":"desktop/src/features/channels/ui/MembersSidebarMemberCard.tsx"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"29d7a981e2f8909e6d823f40ebb997d1d97799c275501db9b4d8cb274b462ee7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/useAgentAddressLockPicker.ts: desktop/src/features/messages/ui/useAgentAddressLockPicker.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 56 in useAgentAddressLockPicker.useAgentAddressLockPicker at line 17. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/useAgentAddressLockPicker.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useAgentAddressLockPicker.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"00316c5737de8ee9daa5de479915ef62760fb24067afbbd7750938fbbe14fe1a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/projects/ui/ProjectDetailFeedPanels.tsx: desktop/src/features/projects/ui/ProjectDetailFeedPanels.tsx changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in ProjectDetailFeedPanels.ContributorsPanel at line 59. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/projects/ui/ProjectDetailFeedPanels.tsx\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":"desktop/src/features/projects/ui/ProjectDetailFeedPanels.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"be827508f6c38c0ed9198ab3dcd9a6e4bd17e5e6e5464cf00bd3a51af9537852"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/shared/widgets/frosted_app_bar.dart: mobile/lib/shared/widgets/frosted_app_bar.dart changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in FrostedAppBar.build 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/shared/widgets/frosted_app_bar.dart\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":"mobile/lib/shared/widgets/frosted_app_bar.dart"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"03f4d657f3a93e9bc6f5c2e9cc9ed91cc5c8969d46b4cafea4f387d77e30d8dd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/usePersonaModelDiscovery.ts: desktop/src/features/agents/ui/usePersonaModelDiscovery.ts changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in usePersonaModelDiscovery.usePersonaModelDiscovery at line 171. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/usePersonaModelDiscovery.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/usePersonaModelDiscovery.ts"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"69c2a1d25f5f07b3d6d516742d7a2ae3c28629849cf5928db039b64b88f296cd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-relay/src/connection.rs: crates/buzz-relay/src/connection.rs changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in buzz_relay::connection::send_loop_inner at line 595. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-relay/src/connection.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/buzz-relay/src/connection.rs"},"region":{"startLine":595}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7b1e03d8eade920be4bfcbd601a32e4d027d563ce959463ce38291fee492012"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/onboarding/welcomeKickoff.ts: desktop/src/features/onboarding/welcomeKickoff.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 53 in welcomeKickoff.useWelcomeKickoff at line 494. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/onboarding/welcomeKickoff.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/welcomeKickoff.ts"},"region":{"startLine":494}}}],"partialFingerprints":{"codehealthFindingId/v1":"e428379dc98cfea66abc8ae2b67d1f7dbf92d26f3a0b7702a681011493aef16c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-media/src/validation.rs: crates/buzz-media/src/validation.rs changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in buzz_media::validation::validate_gif_metadata_free at line 750. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-media/src/validation.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/buzz-media/src/validation.rs"},"region":{"startLine":750}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0dfcae21193adecb994f506e01c7f2f1a1f5694035e5f60e10e6986e96d407d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/shared/theme/ThemeProvider.tsx: desktop/src/shared/theme/ThemeProvider.tsx changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in ThemeProvider.ThemeProvider at line 480. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/shared/theme/ThemeProvider.tsx\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":"desktop/src/shared/theme/ThemeProvider.tsx"},"region":{"startLine":480}}}],"partialFingerprints":{"codehealthFindingId/v1":"12e7b950dab4679cc64c3ba50e630893dfeadad72b32e23e2d08ac88d6c8d386"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/projects/ui/ProjectsAgentPromptPage.tsx: desktop/src/features/projects/ui/ProjectsAgentPromptPage.tsx changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 29 in ProjectsAgentPromptPage.ProjectsAgentPromptPage at line 393. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/projects/ui/ProjectsAgentPromptPage.tsx\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":"desktop/src/features/projects/ui/ProjectsAgentPromptPage.tsx"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"159939d30d6cdf1aa3895aa0664e2621596a1942ed2fa781010935e665b810e3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/projects/ui/IssueAssigneesRow.tsx: desktop/src/features/projects/ui/IssueAssigneesRow.tsx changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 43 in IssueAssigneesRow.IssueAssigneesRow at line 99. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/projects/ui/IssueAssigneesRow.tsx\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":"desktop/src/features/projects/ui/IssueAssigneesRow.tsx"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"483865357cd03705bb18b839bbafdcb7c02df228417a79d829aeb44188ff391d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/shared/lib/useResolvedLinkPreviews.ts: desktop/src/shared/lib/useResolvedLinkPreviews.ts changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 32 in useResolvedLinkPreviews.createMetadataLoader at line 182. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/shared/lib/useResolvedLinkPreviews.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/lib/useResolvedLinkPreviews.ts"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a7cc53a7d307cc5e662682e2d971a4f6dc95bb001e7fd46ce9d2829bc2382ae"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-agent/src/model_capabilities.rs: crates/buzz-agent/src/model_capabilities.rs changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in buzz_agent::model_capabilities::resolve at line 345. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-agent/src/model_capabilities.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/buzz-agent/src/model_capabilities.rs"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"e462ca4fd2c8fe9b5b21f8d0f466d6589462d9bb0c6d4c5108ebb938e269a6bc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/huddle/lib/useTtsSubscription.ts: desktop/src/features/huddle/lib/useTtsSubscription.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 42 in useTtsSubscription.useTtsSubscription at line 36. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/huddle/lib/useTtsSubscription.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/lib/useTtsSubscription.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"89e93e0d86f5e357ec5bd1c1c6ef86978bd46561ab2cdc2322c185669df9b785"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/projects/ui/ProjectsActivityFeed.tsx: desktop/src/features/projects/ui/ProjectsActivityFeed.tsx changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in ProjectsActivityFeed.buildActivityItems at line 107. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/projects/ui/ProjectsActivityFeed.tsx\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":"desktop/src/features/projects/ui/ProjectsActivityFeed.tsx"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f068f5f3ca649bcf6b429adec2a1fcdcdfe14d7d79b2a65539b1536ca3445b8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/communities/ui/CommunitySwitcher.tsx: desktop/src/features/communities/ui/CommunitySwitcher.tsx changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 36 in CommunitySwitcher.CommunitySwitcher at line 101. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/communities/ui/CommunitySwitcher.tsx\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":"desktop/src/features/communities/ui/CommunitySwitcher.tsx"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"c03617b2c7e716e6dd091132c815a142cbf5475d30a545b0b5f77bb39546312d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/huddle/mod.rs: desktop/src-tauri/src/huddle/mod.rs changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in buzz_desktop::huddle::start_huddle at line 190. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/huddle/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":"desktop/src-tauri/src/huddle/mod.rs"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b2dc084997340c7aa3550345759ad094f7f7ccee57314981644790fe109b9f2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/projects/ui/ProjectRepositoryActionsPanel.tsx: desktop/src/features/projects/ui/ProjectRepositoryActionsPanel.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 62 in ProjectRepositoryActionsPanel.ProjectRepositoryActionsPanel at line 139. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/projects/ui/ProjectRepositoryActionsPanel.tsx\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":"desktop/src/features/projects/ui/ProjectRepositoryActionsPanel.tsx"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf23beecc45d3d5d6892891a960d700d4e0314d610ebf7728b98ff55c4045148"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/settings/ui/SettingsView.tsx: desktop/src/features/settings/ui/SettingsView.tsx changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in SettingsView.SettingsView at line 113. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/settings/ui/SettingsView.tsx\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":"desktop/src/features/settings/ui/SettingsView.tsx"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"a03de3f17ac96d15f972cb0f590308a6c9cfb27f512730927853dbfb0105efe2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/commands/workspace.rs: desktop/src-tauri/src/commands/workspace.rs changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in buzz_desktop::commands::workspace::apply_workspace at line 167. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/commands/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":"desktop/src-tauri/src/commands/workspace.rs"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"7596f0dfe65027e06d82bddb25fd1062c6487b39a696db719e58f1816f197785"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-relay/src/handlers/auth.rs: crates/buzz-relay/src/handlers/auth.rs changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in buzz_relay::handlers::auth::handle_auth at line 97. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-relay/src/handlers/auth.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/buzz-relay/src/handlers/auth.rs"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"6afefa42d4d9ab0e517a80bd9e3fb1f02af2eb1a26d4054136504ee5ee57df80"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/activity/activity_page/inbox_row.dart: mobile/lib/features/activity/activity_page/inbox_row.dart changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in _InboxRow.build at line 68. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/activity/activity_page/inbox_row.dart\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":"mobile/lib/features/activity/activity_page/inbox_row.dart"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"6694892c4a64d77438597ba39a0d8e01d888ec4fb2852de0326b6fcf6b76e86f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/observerRelayStore.ts: desktop/src/features/agents/observerRelayStore.ts changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in observerRelayStore.appendAgentEvents 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/observerRelayStore.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/observerRelayStore.ts"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"23e5ed8e2ca8f1cca0fde1427caea473a52d5654330266ae0736c6846cfb219f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/community-members/ui/InviteLinkSection.tsx: desktop/src/features/community-members/ui/InviteLinkSection.tsx changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in InviteLinkSection.InviteLinkSection at line 47. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/community-members/ui/InviteLinkSection.tsx\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":"desktop/src/features/community-members/ui/InviteLinkSection.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3c0da015a59a4230b0cc75bf5adfeee3e1833c2a801523ec3e82348c0f5ab62"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/channels/useChannelPaneHandlers.ts: desktop/src/features/channels/useChannelPaneHandlers.ts changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in useChannelPaneHandlers.useChannelPaneHandlers at line 24. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/channels/useChannelPaneHandlers.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/useChannelPaneHandlers.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"84c5357aac0bf3db1729ab1981f9754010019e991309673f4e94b938ebbd37d3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-relay/src/handlers/count.rs: crates/buzz-relay/src/handlers/count.rs changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 38 in buzz_relay::handlers::count::handle_count at line 18. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-relay/src/handlers/count.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/buzz-relay/src/handlers/count.rs"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"81fdda1b9e811a605d9bb53af7e014062092c7fdb8c30d355cdd7ba59a522fe6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/useComposerLinkPreviews.tsx: desktop/src/features/messages/ui/useComposerLinkPreviews.tsx changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 45 in useComposerLinkPreviews.useComposerLinkPreviews at line 273. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/useComposerLinkPreviews.tsx\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":"desktop/src/features/messages/ui/useComposerLinkPreviews.tsx"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"8493f29e2f1a04824149ea201c76422a751ea13acb7d1f888608d806861a4b8f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/projects/ui/ProjectPullRequestFilesChangedPanel.tsx: desktop/src/features/projects/ui/ProjectPullRequestFilesChangedPanel.tsx changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in ProjectPullRequestFilesChangedPanel.DiffPreview at line 447. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/projects/ui/ProjectPullRequestFilesChangedPanel.tsx\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":"desktop/src/features/projects/ui/ProjectPullRequestFilesChangedPanel.tsx"},"region":{"startLine":447}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1b8c3eed752740989ac57fc14a0e8b046b217bb297ce714b77ee2bc79782d87"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/commands/media.rs: desktop/src-tauri/src/commands/media.rs changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in buzz_desktop::commands::media::sanitize_image_for_upload 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/commands/media.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":"desktop/src-tauri/src/commands/media.rs"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"adf601c98201af9c77ce25dca5d840c3b7aeff4a0e478bb3163b5e74be7c6531"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/commands/personas/inbound.rs: desktop/src-tauri/src/commands/personas/inbound.rs changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in buzz_desktop::commands::personas::inbound::reconcile_inbound_persona_event_blocking at line 148. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/commands/personas/inbound.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":"desktop/src-tauri/src/commands/personas/inbound.rs"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"99333192c5ef3a14f73c010dec37eb526d0d6c865575bf85977806f85d88baad"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-acp/src/usage.rs: crates/buzz-acp/src/usage.rs changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 36 in UsageTracker::record at line 560. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-acp/src/usage.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/buzz-acp/src/usage.rs"},"region":{"startLine":560}}}],"partialFingerprints":{"codehealthFindingId/v1":"208e51c2afbb4d5ccab028535c9e0898f0772248e9f1e284182954d111ead169"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/PersonaShareDialog.tsx: desktop/src/features/agents/ui/PersonaShareDialog.tsx changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 43 in PersonaShareDialog.SnapshotShareDialog at line 228. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/PersonaShareDialog.tsx\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":"desktop/src/features/agents/ui/PersonaShareDialog.tsx"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4df65bb012df68e5cafc95740147150572dafd56a3f6e00d2d6253272478d1f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/channel_messages_provider.dart: mobile/lib/features/channels/channel_messages_provider.dart changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in ChannelMessagesNotifier._handleLiveEvent at line 285. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/channel_messages_provider.dart\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":"mobile/lib/features/channels/channel_messages_provider.dart"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cc2102db722afa4641e88b78e917bd610400bca48696c63367bdbe2c56b6d6c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/agentSessionTranscriptHelpers.ts: desktop/src/features/agents/ui/agentSessionTranscriptHelpers.ts changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in agentSessionTranscriptHelpers.parseSystemPromptSections at line 138. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/agentSessionTranscriptHelpers.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/agentSessionTranscriptHelpers.ts"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"471762eea0841573ed55eee2d844923a417326b27cca00d2cb67610cc6c1d0dd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/pairing/pairing_page.dart: mobile/lib/features/pairing/pairing_page.dart changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in PairingPage.build at line 40. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/pairing/pairing_page.dart\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":"mobile/lib/features/pairing/pairing_page.dart"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f4b3afa9581db16740d48265319c5c1062def33e9c2cbbd8ace4daffcc3009a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/settings/ui/MobilePairingCard.tsx: desktop/src/features/settings/ui/MobilePairingCard.tsx changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 42 in MobilePairingCard.MobilePairingCard at line 251. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/settings/ui/MobilePairingCard.tsx\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":"desktop/src/features/settings/ui/MobilePairingCard.tsx"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c60b0f2fa210d004798ce007a48d305378cb6520122677d694936c9b07e3f8e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/PersonaAdvancedFields.tsx: desktop/src/features/agents/ui/PersonaAdvancedFields.tsx changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in PersonaAdvancedFields.PersonaAdvancedFields at line 41. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/PersonaAdvancedFields.tsx\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":"desktop/src/features/agents/ui/PersonaAdvancedFields.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"c090b334cd8e343022d914e4577cfa03b1817165926cb2fc5a428aefc5d28a53"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/presence/hooks.ts: desktop/src/features/presence/hooks.ts changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in hooks.usePresenceSession at line 224. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/presence/hooks.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/presence/hooks.ts"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"e06de1048cc1a51e6b092c0f3c5f2500e92a83f23634473b8073cd4db6c22068"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/channels_page/sheets.dart: mobile/lib/features/channels/channels_page/sheets.dart changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 34 in _NewDirectMessageSheet.build at line 441. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/channels_page/sheets.dart\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":"mobile/lib/features/channels/channels_page/sheets.dart"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"332c2a949b562b7eb7f9917131ccd17f7d7bc0456074a93057874dcb2b3aed53"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/lib/mentionHighlightExtension.ts: desktop/src/features/messages/lib/mentionHighlightExtension.ts changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in mentionHighlightExtension.selectionAfterMentionTrailingSpace at line 602. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/lib/mentionHighlightExtension.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/mentionHighlightExtension.ts"},"region":{"startLine":602}}}],"partialFingerprints":{"codehealthFindingId/v1":"df3df2a169ef7768d5bdb69bc0e9d1f2f68cad72323e2422fc00c246d847756e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/EnvVarsEditor.tsx: desktop/src/features/agents/ui/EnvVarsEditor.tsx changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in EnvVarsEditor.EnvVarsEditor at line 211. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/EnvVarsEditor.tsx\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":"desktop/src/features/agents/ui/EnvVarsEditor.tsx"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"526482c8751c9fa40020a4614e199f0cfe9159b83bbf5f4b0c40d94a8c019dc4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/channel_detail_page/app_bar.dart: mobile/lib/features/channels/channel_detail_page/app_bar.dart changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in _DmAppBarTitle.build at line 201. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/channel_detail_page/app_bar.dart\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":"mobile/lib/features/channels/channel_detail_page/app_bar.dart"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"01aad5b4874ee55ec79c01b8822d7adc4d54b91e6392d14e2764b00951d03d83"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/projects/ui/ProjectRepositorySource.tsx: desktop/src/features/projects/ui/ProjectRepositorySource.tsx changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in ProjectRepositorySource.RepoSourceDropdown at line 218. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/projects/ui/ProjectRepositorySource.tsx\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":"desktop/src/features/projects/ui/ProjectRepositorySource.tsx"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f8b335ad533cc3fe6816e846c61faba658122704e574c70e2fb61bb75d1fd3d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/huddle/components/HuddleIndicator.tsx: desktop/src/features/huddle/components/HuddleIndicator.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 49 in HuddleIndicator.HuddleIndicator at line 47. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/huddle/components/HuddleIndicator.tsx\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":"desktop/src/features/huddle/components/HuddleIndicator.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"0389fc9187f69e68135f502fc3d5353144645b2e2ff1611baa5672857896e66e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/home/lib/inbox.ts: desktop/src/features/home/lib/inbox.ts changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in inbox.buildInboxItems at line 462. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/home/lib/inbox.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/lib/inbox.ts"},"region":{"startLine":462}}}],"partialFingerprints":{"codehealthFindingId/v1":"901f91d9bf638471c4c789385c798934c7e0ec63e76116ba616e11b94ccc0711"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/ModelPicker.tsx: desktop/src/features/agents/ui/ModelPicker.tsx changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 32 in ModelPicker.ModelPicker 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/ModelPicker.tsx\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":"desktop/src/features/agents/ui/ModelPicker.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0083f618275e3f2ea849f7644199e2d447285f63f419e3976b234884fde31e4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/channels/ui/BotActivityBar.tsx: desktop/src/features/channels/ui/BotActivityBar.tsx changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in BotActivityBar.BotActivityComposerAction 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/channels/ui/BotActivityBar.tsx\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":"desktop/src/features/channels/ui/BotActivityBar.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cb8ed59495445d995d44c35918e971555ed820bee1bde4154e2cf2f1774d775"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/onboarding/machineOnboarding.ts: desktop/src/features/onboarding/machineOnboarding.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 37 in machineOnboarding.useMachineOnboardingState at line 99. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/onboarding/machineOnboarding.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/machineOnboarding.ts"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"645f054953c9dcc9ef51664f3503925eb8317ae6379c8aae7a2553a7c5b607b9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/channels/ui/ChannelMembersBar.tsx: desktop/src/features/channels/ui/ChannelMembersBar.tsx changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in ChannelMembersBar.ChannelMembersBar at line 46. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/channels/ui/ChannelMembersBar.tsx\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":"desktop/src/features/channels/ui/ChannelMembersBar.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"534aab581177177039d27c6f2a62f13e0e694eb917ec0334a420f9609d4eec17"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/huddle/components/ParticipantList.tsx: desktop/src/features/huddle/components/ParticipantList.tsx changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 26 in ParticipantList.HuddleParticipantsControl at line 141. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/huddle/components/ParticipantList.tsx\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":"desktop/src/features/huddle/components/ParticipantList.tsx"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bea73e53da98863d52029d6f6375a794512f4c8c9563018f144e9b67a2ba604"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-relay/src/handlers/command_executor.rs: crates/buzz-relay/src/handlers/command_executor.rs changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in buzz_relay::handlers::command_executor::persist_command_event at line 102. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-relay/src/handlers/command_executor.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/buzz-relay/src/handlers/command_executor.rs"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"a013a7416a07c84f271b9adad85676b64fa19b05059df8e94b2381f4f6e8e30c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/home/useInboxThreadContext.ts: desktop/src/features/home/useInboxThreadContext.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 45 in useInboxThreadContext.useInboxThreadContext at line 49. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/home/useInboxThreadContext.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/useInboxThreadContext.ts"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe2f258b32e3a79cdc54699b079199eea8b22a1e7127a6819e108b1570d176c8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/projects/ui/ProjectEntityListRow.tsx: desktop/src/features/projects/ui/ProjectEntityListRow.tsx changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in ProjectEntityListRow.ProjectEntityListRow at line 137. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/projects/ui/ProjectEntityListRow.tsx\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":"desktop/src/features/projects/ui/ProjectEntityListRow.tsx"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"e63c4664c6037f230fe2b53b95c7994a205f8b3be88f9546884dc956b945a2cc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/AgentConfigPanel.tsx: desktop/src/features/agents/ui/AgentConfigPanel.tsx changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in AgentConfigPanel.AgentConfigSurfaceRows at line 374. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/AgentConfigPanel.tsx\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":"desktop/src/features/agents/ui/AgentConfigPanel.tsx"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"884a05d283c023014f3e7485e558b78689800b96228013f3e2974166aadf8167"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/AgentSessionTranscriptList.tsx: desktop/src/features/agents/ui/AgentSessionTranscriptList.tsx changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in AgentSessionTranscriptList.AgentSessionTranscriptList at line 114. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/AgentSessionTranscriptList.tsx\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":"desktop/src/features/agents/ui/AgentSessionTranscriptList.tsx"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d0d8d430dafde98a8abf2d110260a85daa31e84c7db9a1d000fdf90eb8324ee"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/workflows/ui/workflowFormTypes.ts: desktop/src/features/workflows/ui/workflowFormTypes.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 59 in workflowFormTypes.yamlToFormState at line 408. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/workflows/ui/workflowFormTypes.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/workflowFormTypes.ts"},"region":{"startLine":408}}}],"partialFingerprints":{"codehealthFindingId/v1":"d053811470727e99d2b1df8d2b2d13e4b66da1db96f78eb3f48d60a63d8ad2ae"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/pulse/ui/PulseView.tsx: desktop/src/features/pulse/ui/PulseView.tsx changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 35 in PulseView.PulseView 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/pulse/ui/PulseView.tsx\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":"desktop/src/features/pulse/ui/PulseView.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4c7835e2cc7973bca2bb5b34078aabe1569e64d1d815c036ade7d2d9e9bdfa9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/profile/ui/ProfileAvatar.tsx: desktop/src/features/profile/ui/ProfileAvatar.tsx changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 29 in ProfileAvatar.ProfileAvatar at line 57. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/profile/ui/ProfileAvatar.tsx\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":"desktop/src/features/profile/ui/ProfileAvatar.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"26dc71670dd07c8355367a507990c70f2473135ee4bbe67ad9c1ae7277da6506"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/projects/ui/PullRequestReviewCard.tsx: desktop/src/features/projects/ui/PullRequestReviewCard.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 43 in PullRequestReviewCard.PullRequestReviewCard at line 47. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/projects/ui/PullRequestReviewCard.tsx\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":"desktop/src/features/projects/ui/PullRequestReviewCard.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"495135173f792017d000877407d2049d5003a0747e6b4f140118cb73df7cd9ad"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/compose_bar/attachments.dart: mobile/lib/features/channels/compose_bar/attachments.dart changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in _AttachmentSurfacePanel.build at line 152. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/compose_bar/attachments.dart\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":"mobile/lib/features/channels/compose_bar/attachments.dart"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"557d8e729fb9cefb091778af60cf1f9dc8a47339ea657d191eda5a558cba57ea"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/commands/mesh_llm.rs: desktop/src-tauri/src/commands/mesh_llm.rs changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in buzz_desktop::commands::mesh_llm::mesh_start_node at line 406. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/commands/mesh_llm.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":"desktop/src-tauri/src/commands/mesh_llm.rs"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"81b47390d47f9016c086148cadd15ba57ebdefe3af2aa5c2cf39af57ee0c62da"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/profile/ui/UserProfilePanelFields.tsx: desktop/src/features/profile/ui/UserProfilePanelFields.tsx changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in UserProfilePanelFields.buildOwnerFields at line 228. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/profile/ui/UserProfilePanelFields.tsx\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":"desktop/src/features/profile/ui/UserProfilePanelFields.tsx"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"c476d66674b06e21f7b98364d4fe79573c4d2712c78f31e6374efce36d81b5f7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/notifications/use-feed-desktop-notifications.ts: desktop/src/features/notifications/use-feed-desktop-notifications.ts changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in use-feed-desktop-notifications.useFeedDesktopNotifications at line 71. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/notifications/use-feed-desktop-notifications.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/notifications/use-feed-desktop-notifications.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c15e4b7a669637fba3bb1bd641001369ac9d253ad4993dd76cb98a79a8be27c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/useTeamActions.ts: desktop/src/features/agents/ui/useTeamActions.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in useTeamActions.useTeamActions at line 63. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/useTeamActions.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/useTeamActions.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"985f8dc6e551b331f05bdccae006e93d61ffb0faa1d11f3e1281457d09f03a1e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/app/routes/ChannelRouteScreen.tsx: desktop/src/app/routes/ChannelRouteScreen.tsx changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in ChannelRouteScreen.ChannelRouteScreen at line 114. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/app/routes/ChannelRouteScreen.tsx\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":"desktop/src/app/routes/ChannelRouteScreen.tsx"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"53eae6a54766298237ac11f74fc9586585c41bf31430d677c7fc62be76cf0290"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/channel_actions_sheet.dart: mobile/lib/features/channels/channel_actions_sheet.dart changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 33 in ChannelActionsSheet.build at line 78. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/channel_actions_sheet.dart\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":"mobile/lib/features/channels/channel_actions_sheet.dart"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e0ea1dd1386a412a5a26cfaac01e83174f3c124c77c39ee180dc1e6d03d2e75"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-db/src/store/push.rs: crates/buzz-db/src/store/push.rs changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in buzz_db::store::push::accept_lease_event at line 235. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-db/src/store/push.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/buzz-db/src/store/push.rs"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"013fb642d5e897fb350862f5587285196de24ea042c82e9ba21ffd0b920f5157"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/commands/pairing.rs: desktop/src-tauri/src/commands/pairing.rs changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in buzz_desktop::commands::pairing::pairing_ws_task_inner at line 298. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/commands/pairing.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":"desktop/src-tauri/src/commands/pairing.rs"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c1a76e6fdad9b011cf3340460b34dee224fcfcd809ac3986b6d8db520dc2a00"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/RespondToField.tsx: desktop/src/features/agents/ui/RespondToField.tsx changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in RespondToField.AllowlistPicker at line 282. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/RespondToField.tsx\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":"desktop/src/features/agents/ui/RespondToField.tsx"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1820e22772e864e934ccc0be20b11b6af9a2dd484c0c6a77d8cc7555e1e6a46"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/AddTeamToChannelDialog.tsx: desktop/src/features/agents/ui/AddTeamToChannelDialog.tsx changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 32 in AddTeamToChannelDialog.AddTeamToChannelDialog at line 47. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/AddTeamToChannelDialog.tsx\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":"desktop/src/features/agents/ui/AddTeamToChannelDialog.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"feadb3c1c0788aa166ef3451d8161d4153767a6cb1f01be8e8f2535d28a332c7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/shared/api/relayReconnectReplay.ts: desktop/src/shared/api/relayReconnectReplay.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 31 in relayReconnectReplay.replayLiveSubscriptions at line 181. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/shared/api/relayReconnectReplay.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/api/relayReconnectReplay.ts"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"44de61231c67321abd34ea66ee5d9bd9e5dc78a0c31ffa00e725c9f536b689a1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/profile/user_profile_sheet.dart: mobile/lib/features/profile/user_profile_sheet.dart changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in UserProfileSheet.build at line 47. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/profile/user_profile_sheet.dart\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":"mobile/lib/features/profile/user_profile_sheet.dart"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4108fdcc7e88ddd7a4440459c08b106731a2c3220d56afce44b9275897279bc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/lib/timelineItems.ts: desktop/src/features/messages/lib/timelineItems.ts changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in timelineItems.buildTimelineItems at line 174. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/lib/timelineItems.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/timelineItems.ts"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfa14234f322c80e271954ea81e5f6447a33d53961e3612267965c50528f9665"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/channelAgents.ts: desktop/src/features/agents/channelAgents.ts changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in channelAgents.provisionChannelManagedAgent at line 319. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/channelAgents.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/channelAgents.ts"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"19525b5a536791303d17715272e39b4b3109c8c66475bd1b5916f575e54a6f82"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/agentSessionTranscriptGrouping.ts: desktop/src/features/agents/ui/agentSessionTranscriptGrouping.ts changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in agentSessionTranscriptGrouping.splitIntoSessionRuns at line 427. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/agentSessionTranscriptGrouping.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/agentSessionTranscriptGrouping.ts"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"eceb9c6337dc32f5a0440773306a8e24618d61e9deb1759a14cf02ebac873db9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/channels/ui/ChannelScreenHeader.tsx: desktop/src/features/channels/ui/ChannelScreenHeader.tsx changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in ChannelScreenHeader.ChannelScreenHeader at line 55. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/channels/ui/ChannelScreenHeader.tsx\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":"desktop/src/features/channels/ui/ChannelScreenHeader.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fcc364e54992ee614c11ae30aa027ecdf44f0f7f668b985d0820d6cc5c29492"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/AgentRuntimeAvatarControl.tsx: desktop/src/features/agents/ui/AgentRuntimeAvatarControl.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 37 in AgentRuntimeAvatarControl.AgentRuntimeAvatarControl at line 136. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/AgentRuntimeAvatarControl.tsx\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":"desktop/src/features/agents/ui/AgentRuntimeAvatarControl.tsx"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8037d6fd0b9fd7ae79a1f572418af73b4a25bbe3e8924e94e112c15a4f82c40"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-relay/src/handlers/relay_admin.rs: crates/buzz-relay/src/handlers/relay_admin.rs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 37 in buzz_relay::handlers::relay_admin::execute_relay_admin_command at line 223. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-relay/src/handlers/relay_admin.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/buzz-relay/src/handlers/relay_admin.rs"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae80bfe4da29c3ec44f225f4ebb7a4b0dcd932ea851a656245da347ce9f1006b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/useObserverEvents.ts: desktop/src/features/agents/ui/useObserverEvents.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 37 in useObserverEvents.useLoadArchivedObserverEvents at line 115. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/useObserverEvents.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/useObserverEvents.ts"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d723be35a1252971a63beef0da802a9a61d5189b9114c105c72c70a9ae31d9e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/profile/lib/selfProfileStorage.ts: desktop/src/features/profile/lib/selfProfileStorage.ts changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in selfProfileStorage.trimSelfProfileCaches at line 185. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/profile/lib/selfProfileStorage.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/lib/selfProfileStorage.ts"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"9752d59df533fedbfec1997757966db6c60a721393d37afff0d11a24ab57ce96"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/profile/profile_edit_page.dart: mobile/lib/features/profile/profile_edit_page.dart changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 73 in ProfileEditPage.build at line 51. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/profile/profile_edit_page.dart\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":"mobile/lib/features/profile/profile_edit_page.dart"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3fcdb8d767b6a54f07ebadc39a47f08235ae30cb3fbee6ef6eabd05ea01579d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-acp/src/setup_mode.rs: crates/buzz-acp/src/setup_mode.rs changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in buzz_acp::setup_mode::run_setup_listener at line 321. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-acp/src/setup_mode.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/buzz-acp/src/setup_mode.rs"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"2641b59b37aecc7fdfe0111ee657af34cc40c26a1de310894b30c94c34da0b1f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/compose_bar/suggestions.dart: mobile/lib/features/channels/compose_bar/suggestions.dart changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in _MentionSuggestionInfo.build at line 82. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/compose_bar/suggestions.dart\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":"mobile/lib/features/channels/compose_bar/suggestions.dart"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cfc313418ac472793875c44664288989f9eebcb4a64dcc39ad89e91c4866b44"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/lib/agentAutocompleteEligibility.ts: desktop/src/features/agents/lib/agentAutocompleteEligibility.ts changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in agentAutocompleteEligibility.getMentionableAgentPubkeys at line 82. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/lib/agentAutocompleteEligibility.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/lib/agentAutocompleteEligibility.ts"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff3fb11423c3a4e902446af329a8379ee2fe6c195ecf2131dba9ef1f4955e67e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-relay/src/push_runtime.rs: crates/buzz-relay/src/push_runtime.rs changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in buzz_relay::push_runtime::deliver_one at line 382. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-relay/src/push_runtime.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/buzz-relay/src/push_runtime.rs"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0be21b943da692bdd3f85098f3369d72084b1903a4f5d968d2402415020d556"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/TeamDialog.tsx: desktop/src/features/agents/ui/TeamDialog.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 35 in TeamDialog.TeamDialog at line 44. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/TeamDialog.tsx\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":"desktop/src/features/agents/ui/TeamDialog.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"207815d21fbccd6109f62108d20bb9efb7bca0498e070c26daf4a7bfdfd451df"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/local-archive/ui/LocalArchiveSettingsCard.tsx: desktop/src/features/local-archive/ui/LocalArchiveSettingsCard.tsx changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in LocalArchiveSettingsCard.LocalArchiveSettingsCard at line 391. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/local-archive/ui/LocalArchiveSettingsCard.tsx\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":"desktop/src/features/local-archive/ui/LocalArchiveSettingsCard.tsx"},"region":{"startLine":391}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff6e8dc6c0b1b4fc72778d48c1d796d2a103ff9ff75bad51b95bee7b9b8eb761"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/forum/ui/ForumThreadPanel.tsx: desktop/src/features/forum/ui/ForumThreadPanel.tsx changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in ForumThreadPanel.ForumThreadPanel at line 145. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/forum/ui/ForumThreadPanel.tsx\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":"desktop/src/features/forum/ui/ForumThreadPanel.tsx"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"87f7337d78c08a1589ebc91fc71b00ae636b69ed6e9cde947d31ee0b6982279d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/commands/project_git.rs: desktop/src-tauri/src/commands/project_git.rs changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in buzz_desktop::commands::project_git::compare_local_remote_status at line 410. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/commands/project_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":"desktop/src-tauri/src/commands/project_git.rs"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a14d87dea321d8f463baca72735de0bea9ba83a11a43ecb8547de34cb65861e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-relay/src/api/git/policy.rs: crates/buzz-relay/src/api/git/policy.rs changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 44 in buzz_relay::api::git::policy::hook_policy_check at line 176. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-relay/src/api/git/policy.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/buzz-relay/src/api/git/policy.rs"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cafb4809b84c64b4ba73e054ec575d30cdc288fc29a2eef8d3b4e4fd5c5698f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/workflows/ui/WorkflowsView.tsx: desktop/src/features/workflows/ui/WorkflowsView.tsx changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in WorkflowsView.WorkflowsView at line 104. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/workflows/ui/WorkflowsView.tsx\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":"desktop/src/features/workflows/ui/WorkflowsView.tsx"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9b43fe62f3a967d50fc235bc19f686f35dac879b343da1002c632e176d9c0c2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/compose_bar/camera_preview.dart: mobile/lib/features/channels/compose_bar/camera_preview.dart changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 26 in _InlineCameraPreview.build at line 14. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/compose_bar/camera_preview.dart\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":"mobile/lib/features/channels/compose_bar/camera_preview.dart"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6b29e66cf3866bf4817e191b04348a84da0d022b78da82617c2cc86d04b9778"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/settings/ui/ChannelTemplatesSettingsCard.tsx: desktop/src/features/settings/ui/ChannelTemplatesSettingsCard.tsx changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 26 in ChannelTemplatesSettingsCard.TemplateFormDialog at line 291. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/settings/ui/ChannelTemplatesSettingsCard.tsx\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":"desktop/src/features/settings/ui/ChannelTemplatesSettingsCard.tsx"},"region":{"startLine":291}}}],"partialFingerprints":{"codehealthFindingId/v1":"31a4d1d86ead7af9cf1b751bdbe8e940b18d2079b3d997d401564d7c9b2245ae"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/sidebar/lib/channelSectionsStorage.ts: desktop/src/features/sidebar/lib/channelSectionsStorage.ts changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in channelSectionsStorage.parseChannelSectionPayload 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/sidebar/lib/channelSectionsStorage.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/lib/channelSectionsStorage.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"11ba51b296a7b7d3aba7bb5202c0b7e19a9974470f591d1e7f2fb0c4eee62f86"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-db/src/store/thread.rs: crates/buzz-db/src/store/thread.rs changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in buzz_db::store::thread::get_thread_replies_on 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-db/src/store/thread.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/buzz-db/src/store/thread.rs"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"6029d582e117693abc3ca71d1007991c0cc2d7f61863451f46e28057575713d4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/MessageComposerToolbar.tsx: desktop/src/features/messages/ui/MessageComposerToolbar.tsx changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in MessageComposerToolbar.MessageComposerToolbar at line 35. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/MessageComposerToolbar.tsx\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":"desktop/src/features/messages/ui/MessageComposerToolbar.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3ba2e92b14935d8b2beeb70ce4e57bde1ccaa051c83b16a15046bc09773791f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/channels/readState/readStateManager.ts: desktop/src/features/channels/readState/readStateManager.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in ReadStateManager.mergeEvents at line 456. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/channels/readState/readStateManager.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/readState/readStateManager.ts"},"region":{"startLine":456}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fd84ca5357dfe06d3a45765cea553e54f01438f85edd39a5d19647cb1f9cb1b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/ComposerAddressControls.tsx: desktop/src/features/messages/ui/ComposerAddressControls.tsx changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in ComposerAddressControls.ComposerMentionButton at line 129. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/ComposerAddressControls.tsx\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":"desktop/src/features/messages/ui/ComposerAddressControls.tsx"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe7a5df9ad28a984b1f5ef1bd5a823df0a1c3346dd7079d4c7b247eb4864773f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/compose_bar/ios_photo_picker.dart: mobile/lib/features/channels/compose_bar/ios_photo_picker.dart changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 31 in _IOSInlinePhotoPicker.build 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/compose_bar/ios_photo_picker.dart\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":"mobile/lib/features/channels/compose_bar/ios_photo_picker.dart"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d5d59d35067031f6b6ad90b3738ab28bdae30f71460fa0f54dcc6b28460a44a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-relay/src/api/invites.rs: crates/buzz-relay/src/api/invites.rs changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in buzz_relay::api::invites::claim_invite at line 421. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-relay/src/api/invites.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/buzz-relay/src/api/invites.rs"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fbbb1d19097432c5e09e640a6d57a517eef47f5eb4f9709246513e5fbc6b218"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/commands/agent_models_update.rs: desktop/src-tauri/src/commands/agent_models_update.rs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in buzz_desktop::commands::agent_models_update::update_managed_agent 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/commands/agent_models_update.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":"desktop/src-tauri/src/commands/agent_models_update.rs"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"8157421842b8c984f0363f43844009ef7d6f2347913f47eaedad59b636236467"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/managed_agents/config_bridge/reader.rs: desktop/src-tauri/src/managed_agents/config_bridge/reader.rs changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in buzz_desktop::managed_agents::config_bridge::reader::read_config_surface at line 19. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/managed_agents/config_bridge/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":"desktop/src-tauri/src/managed_agents/config_bridge/reader.rs"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd424297996f3942a1ad843f1f1bfdc19de2a7715edc8fcfda1c57cf260c8020"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/projects/ui/MergePullRequestButton.tsx: desktop/src/features/projects/ui/MergePullRequestButton.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in MergePullRequestButton.MergePullRequestButton at line 38. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/projects/ui/MergePullRequestButton.tsx\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":"desktop/src/features/projects/ui/MergePullRequestButton.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"78732ca9252f8fc9cee2acb2978a668f9f413d622827021b82a8475d14226203"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/shared/lib/configNudge.ts: desktop/src/shared/lib/configNudge.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in configNudge.isConfigNudgeRequirement at line 139. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/shared/lib/configNudge.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/lib/configNudge.ts"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7f2f4fd89d14028d9f2c0bc15399d3d65ff3ac3a24a06fbc036b56ae330a151"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/onboarding/ui/NsecMaskedDisplay.tsx: desktop/src/features/onboarding/ui/NsecMaskedDisplay.tsx changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in NsecMaskedDisplay.NsecMaskedDisplay at line 48. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/onboarding/ui/NsecMaskedDisplay.tsx\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":"desktop/src/features/onboarding/ui/NsecMaskedDisplay.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"c929a1f8f5011837b1049c85bdb92699b07130a87e237c4c6829c1eb946f71e0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-cli/src/commands/channels.rs: crates/buzz-cli/src/commands/channels.rs changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in buzz_cli::commands::channels::dispatch at line 1863. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-cli/src/commands/channels.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/buzz-cli/src/commands/channels.rs"},"region":{"startLine":1863}}}],"partialFingerprints":{"codehealthFindingId/v1":"51d4bb1655d0c73d3b180a759334474ff8d2a05e500a6ed9eb2f4c37613b2b00"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/lib/buildMentionCandidates.ts: desktop/src/features/messages/lib/buildMentionCandidates.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 39 in buildMentionCandidates.buildMentionCandidates at line 56. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/lib/buildMentionCandidates.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/buildMentionCandidates.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"533fca39b3a84061a3286b9c1e0de575dd14df60fee4dbe78189d18099509eb4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/profile/ui/MaskedAvatarBadgeFrame.tsx: desktop/src/features/profile/ui/MaskedAvatarBadgeFrame.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 38 in MaskedAvatarBadgeFrame.MaskedAvatarBadgeFrame at line 751. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/profile/ui/MaskedAvatarBadgeFrame.tsx\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":"desktop/src/features/profile/ui/MaskedAvatarBadgeFrame.tsx"},"region":{"startLine":751}}}],"partialFingerprints":{"codehealthFindingId/v1":"f141f93ce794cdbdba1dae0ab871ed205b3ffc5440e528975dbbe3f3e7698080"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/channels/ui/ChannelMemberInviteCard.tsx: desktop/src/features/channels/ui/ChannelMemberInviteCard.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in ChannelMemberInviteCard.ChannelMemberInviteCard at line 26. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/channels/ui/ChannelMemberInviteCard.tsx\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":"desktop/src/features/channels/ui/ChannelMemberInviteCard.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"49bd416568b5ab4cbda4c360b954dba56c7e9e891e05fe9c1626c8b7f7f4ddf1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/useAgentManagement.ts: desktop/src/features/agents/useAgentManagement.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 37 in useAgentManagement.useAgentManagement 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/useAgentManagement.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/useAgentManagement.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"265b6991d0b2c8775aff60754f49f01a8abf7db902e31113a4bcba5c240d00ff"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-dev-mcp/src/shell.rs: crates/buzz-dev-mcp/src/shell.rs changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in buzz_dev_mcp::shell::run at line 134. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-dev-mcp/src/shell.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/buzz-dev-mcp/src/shell.rs"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"23b71390598c54f2c42737860de62870feadd6b8c3646f09006f1b7f468c7c83"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-relay/src/api/git/cas_publish.rs: crates/buzz-relay/src/api/git/cas_publish.rs changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in buzz_relay::api::git::cas_publish::cas_publish_inner at line 1021. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-relay/src/api/git/cas_publish.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/buzz-relay/src/api/git/cas_publish.rs"},"region":{"startLine":1021}}}],"partialFingerprints":{"codehealthFindingId/v1":"258cac6a6c2af78163f22d982f6f208df41ea5c318a4290b465a410e0b5649cc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/channel_detail_page/huddle_call_avatar.dart: mobile/lib/features/channels/channel_detail_page/huddle_call_avatar.dart changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 36 in _HuddleCallAvatar.build at line 28. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/channel_detail_page/huddle_call_avatar.dart\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":"mobile/lib/features/channels/channel_detail_page/huddle_call_avatar.dart"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"f41ea9837f642d0149055a6b1dac2e8b8a4d5159b21074c1520e28b4aeee170b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/compose_bar/photo_gallery_picker.dart: mobile/lib/features/channels/compose_bar/photo_gallery_picker.dart changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in _RecentPhotoGalleryPicker.build at line 48. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/compose_bar/photo_gallery_picker.dart\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":"mobile/lib/features/channels/compose_bar/photo_gallery_picker.dart"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ac99249ee5a1a3d4ba8cdfc023c2aeec058ff9573fa2ad895de91bde715ae3e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/MessageReactions.tsx: desktop/src/features/messages/ui/MessageReactions.tsx changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in MessageReactions.ReactionPill at line 355. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/MessageReactions.tsx\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":"desktop/src/features/messages/ui/MessageReactions.tsx"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfad821b39536e3476963f13491a02e8d4632d82669e6c54dd6ada90079dfab5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/sidebar/ui/useSidebarRelayConnectionCard.ts: desktop/src/features/sidebar/ui/useSidebarRelayConnectionCard.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in useSidebarRelayConnectionCard.useSidebarRelayConnectionCard at line 63. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/sidebar/ui/useSidebarRelayConnectionCard.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/useSidebarRelayConnectionCard.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"84eeaefbb1d989ef000a51c9a72280710d23441194503e44442460ad5e156797"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/shared/ui/markdownFileCard.ts: desktop/src/shared/ui/markdownFileCard.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in markdownFileCard.resolveSnapshotCard 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/shared/ui/markdownFileCard.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/markdownFileCard.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"58b5f38511b25910221e0ebf3064f0530eae4b8e442c9aaacdcbf855fe3e4b8f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/members_sheet.dart: mobile/lib/features/channels/members_sheet.dart changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in _MemberTile.build 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/members_sheet.dart\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":"mobile/lib/features/channels/members_sheet.dart"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"97833bf95beb533ebff0a08d3f9bde4ca235c01e1cc47ed1f8a43404440f79a5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/useNewMessageRecipients.ts: desktop/src/features/messages/ui/useNewMessageRecipients.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 35 in useNewMessageRecipients.useNewMessageRecipients at line 63. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/useNewMessageRecipients.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useNewMessageRecipients.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"936226daaa66b36e88344347dc1a87f311ef723027e49c07e615d8173599f418"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: benchmarks/harbor-buzz-orchestra/src/harbor_buzz_orchestra/container_runtime.py: benchmarks/harbor-buzz-orchestra/src/harbor_buzz_orchestra/container_runtime.py changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in BuzzContainerRuntime._wait_for_done at line 507. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- benchmarks/harbor-buzz-orchestra/src/harbor_buzz_orchestra/container_runtime.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"benchmarks/harbor-buzz-orchestra/src/harbor_buzz_orchestra/container_runtime.py"},"region":{"startLine":507}}}],"partialFingerprints":{"codehealthFindingId/v1":"60dbacd365181cc6da27f47339df62523c1e72341e3f3570592b14ce9c8d886f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/shutdown.rs: desktop/src-tauri/src/shutdown.rs changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in buzz_desktop::shutdown::shutdown_managed_agents at line 127. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/shutdown.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":"desktop/src-tauri/src/shutdown.rs"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"544e94be308400efc4d74a288c3e40f41d3ae10adc428edb9815ec79f60460d5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/notifications/hooks.ts: desktop/src/features/notifications/hooks.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in hooks.useNotificationSettings at line 182. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/notifications/hooks.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/notifications/hooks.ts"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"a54bf293cafea29be788bba367f017cbfafd20e1dc730ca402fdcb7a87b81561"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/custom-emoji/ui/CustomEmojiSettingsCard.tsx: desktop/src/features/custom-emoji/ui/CustomEmojiSettingsCard.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 35 in CustomEmojiSettingsCard.CustomEmojiSettingsCard at line 31. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/custom-emoji/ui/CustomEmojiSettingsCard.tsx\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":"desktop/src/features/custom-emoji/ui/CustomEmojiSettingsCard.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"75eec91ec58f2aa1ffbb1444f90ab35dfeef60c2a6d9e23907fd41ac58d07eba"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-relay/src/audio/join.rs: crates/buzz-relay/src/audio/join.rs changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 34 in HuddleControlAcceptor::serve_control_loop at line 1156. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-relay/src/audio/join.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/buzz-relay/src/audio/join.rs"},"region":{"startLine":1156}}}],"partialFingerprints":{"codehealthFindingId/v1":"452da8123403c9f29163394378cf2a801b0f0b6b5c4364e8ba273eb3be799812"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/compose_bar/layout.dart: mobile/lib/features/channels/compose_bar/layout.dart changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in _ComposeBarLayout._buildBar at line 84. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/compose_bar/layout.dart\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":"mobile/lib/features/channels/compose_bar/layout.dart"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"4010afcb9119b96bab6fc89fd0e84a00590e90310b02c969e5daccb30b075029"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/settings/ui/VoiceSettingsCard.tsx: desktop/src/features/settings/ui/VoiceSettingsCard.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 34 in VoiceSettingsCard.VoiceSettingsCard at line 49. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/settings/ui/VoiceSettingsCard.tsx\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":"desktop/src/features/settings/ui/VoiceSettingsCard.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1570f6ee5d479376542199d5431bc8c06f93124a1d5ca260f20bc53c31c59fa"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/terminal/TerminalBootstrap.tsx: desktop/src/features/terminal/TerminalBootstrap.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 51 in TerminalBootstrap.TerminalBootstrap 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/terminal/TerminalBootstrap.tsx\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":"desktop/src/features/terminal/TerminalBootstrap.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b0a9837ad3f1cbaa93993e986dfb2e3674a3f8342d5df2139ee82db979ad38d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/onboarding/ui/ProfileStep.tsx: desktop/src/features/onboarding/ui/ProfileStep.tsx changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in ProfileStep.ProfileStep 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/onboarding/ui/ProfileStep.tsx\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":"desktop/src/features/onboarding/ui/ProfileStep.tsx"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8256e6d3e452c90eb05db44e1267596f6a824628ef55b7b3f8de1e6f8e7d53f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/lib/useEmojiAutocomplete.ts: desktop/src/features/messages/lib/useEmojiAutocomplete.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in useEmojiAutocomplete.useEmojiAutocomplete 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/lib/useEmojiAutocomplete.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useEmojiAutocomplete.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae4c727a0f266c4be71fe347b390f4fa2a79b41eb902ab16874796fe76984844"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/workflows/ui/WorkflowTriggerConditions.tsx: desktop/src/features/workflows/ui/WorkflowTriggerConditions.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 50 in WorkflowTriggerConditions.WorkflowTriggerConditions at line 130. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/workflows/ui/WorkflowTriggerConditions.tsx\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":"desktop/src/features/workflows/ui/WorkflowTriggerConditions.tsx"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"27d74885c0cbf6aa0d3512d34df5514a695a78ef6dc5164a650af693c408107c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/activity/activity_provider.dart: mobile/lib/features/activity/activity_provider.dart changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in ActivityNotifier._fetch at line 443. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/activity/activity_provider.dart\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":"mobile/lib/features/activity/activity_provider.dart"},"region":{"startLine":443}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c6502fcc10abecd0b6252703e7c2325219e2b23f7c8e8f6858d38770c0411cb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/projects/ui/ProjectRepositoryManagement.tsx: desktop/src/features/projects/ui/ProjectRepositoryManagement.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 33 in ProjectRepositoryManagement.ProjectRepositoryManagement at line 24. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/projects/ui/ProjectRepositoryManagement.tsx\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":"desktop/src/features/projects/ui/ProjectRepositoryManagement.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"6df6be16a2037ef4c43538e42c1a5e595524cd02eab353b1ae527dfcb9f1eb55"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/useDraftPersistSnapshot.ts: desktop/src/features/messages/ui/useDraftPersistSnapshot.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in useDraftPersistSnapshot.useDraftPersistLifecycle at line 107. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/useDraftPersistSnapshot.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useDraftPersistSnapshot.ts"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"e69d88fc1068c7f8ab5a7b80db0027784bbcc3851bf25632e1fe8be0bb6f0fc3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/huddle/stt.rs: desktop/src-tauri/src/huddle/stt.rs changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in buzz_desktop::huddle::stt::process_16k_samples at line 660. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/huddle/stt.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":"desktop/src-tauri/src/huddle/stt.rs"},"region":{"startLine":660}}}],"partialFingerprints":{"codehealthFindingId/v1":"cad12cab0660e0f1d7248e2399c599aacc39f4c7fbe6078513b106e38a50fafb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/shared/ui/markdown/MessageLinkPill.tsx: desktop/src/shared/ui/markdown/MessageLinkPill.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in MessageLinkPill.MessageLinkPillContents 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/shared/ui/markdown/MessageLinkPill.tsx\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":"desktop/src/shared/ui/markdown/MessageLinkPill.tsx"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d87d8fccf8cd06f84fc09d0f8ea2fbdb7f544b0a62031cd0c62635adf73ea39"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/forum/ui/ForumView.tsx: desktop/src/features/forum/ui/ForumView.tsx changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in ForumView.ForumView at line 45. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/forum/ui/ForumView.tsx\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":"desktop/src/features/forum/ui/ForumView.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfe318796422466e2b35e72fbd05e5351c2ff076f7c824375c6346aedde574a4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/onboarding/ui/MembershipDenied.tsx: desktop/src/features/onboarding/ui/MembershipDenied.tsx changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in MembershipDenied.MembershipDenied at line 25. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/onboarding/ui/MembershipDenied.tsx\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":"desktop/src/features/onboarding/ui/MembershipDenied.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"41d5122b5d50003d891bf2c6c852f65d9cc432932eff94419c70a0dd248cbb2a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/projects/ui/ProjectAgentChatPanel.tsx: desktop/src/features/projects/ui/ProjectAgentChatPanel.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 29 in ProjectAgentChatPanel.ProjectAgentChatPanel 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/projects/ui/ProjectAgentChatPanel.tsx\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":"desktop/src/features/projects/ui/ProjectAgentChatPanel.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"7651dc1b00b6a4fa47b6da93af73cc71a04858884d248e21e3a5d00f7e9e9c21"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/shared/ui/markdown/CodeBlock.tsx: desktop/src/shared/ui/markdown/CodeBlock.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 29 in CodeBlock.SyntaxHighlightedCode at line 134. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/shared/ui/markdown/CodeBlock.tsx\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":"desktop/src/shared/ui/markdown/CodeBlock.tsx"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9351ca719a27d96d4529e947aa991d67a76b912e921df285387e1719fb92f53"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/FormattingToolbar.tsx: desktop/src/features/messages/ui/FormattingToolbar.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 29 in FormattingToolbar.FormattingToolbar at line 127. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/FormattingToolbar.tsx\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":"desktop/src/features/messages/ui/FormattingToolbar.tsx"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"e76c59693b2161ff815263d75a955a7d7e91b4527c6b393883b6822ebf608092"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/archive/pipeline.rs: desktop/src-tauri/src/archive/pipeline.rs changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in buzz_desktop::archive::pipeline::commit_archive at line 260. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/archive/pipeline.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":"desktop/src-tauri/src/archive/pipeline.rs"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"50d7bb83dcc86cfc16e121b9afeffc407923c1ec5abbed86f06a9f85958caa6e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/communities/communityUnreadObserver.ts: desktop/src/features/communities/communityUnreadObserver.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in communityUnreadObserver.fetchCommunityUnread at line 156. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/communities/communityUnreadObserver.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/communities/communityUnreadObserver.ts"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c60228f4727a502f5273da9f78584a0467a00f1da7b1afef745b9335acb59b6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/profile/set_status_sheet.dart: mobile/lib/features/profile/set_status_sheet.dart changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in _SetStatusSheet.build at line 60. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/profile/set_status_sheet.dart\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":"mobile/lib/features/profile/set_status_sheet.dart"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"13e4eeba5b38f4b97514359c0a36567673ff46340ceef243f6d070b1ba3f0b60"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/manage_channel_sheet.dart: mobile/lib/features/channels/manage_channel_sheet.dart changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in ManageChannelSheet.build at line 22. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/manage_channel_sheet.dart\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":"mobile/lib/features/channels/manage_channel_sheet.dart"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"c94b8b3f63b588d6a19a363f07122005e659217b84c1ac6e934d1415dd56fec7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/workflows/ui/WorkflowDetailPanel.tsx: desktop/src/features/workflows/ui/WorkflowDetailPanel.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 41 in WorkflowDetailPanel.WorkflowDetailPanel at line 29. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/workflows/ui/WorkflowDetailPanel.tsx\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":"desktop/src/features/workflows/ui/WorkflowDetailPanel.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebc538d4e84b6fd6884b1dfdae2c384e725671968950ea964fa96149684c4689"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/communities/ui/CommunityEditForm.tsx: desktop/src/features/communities/ui/CommunityEditForm.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 41 in CommunityEditForm.CommunityEditForm at line 29. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/communities/ui/CommunityEditForm.tsx\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":"desktop/src/features/communities/ui/CommunityEditForm.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fad3432758fabe3127d14a1a95e7abc87bc8d1029c54140ec050aa0815587f5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/channels/ui/useMembersSidebarActions.ts: desktop/src/features/channels/ui/useMembersSidebarActions.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in useMembersSidebarActions.useMembersSidebarActions at line 55. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/channels/ui/useMembersSidebarActions.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/useMembersSidebarActions.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"b37dcfd8455c24d93a2cc401c6fd3ea0a44ec572358a973ea9e0f3c4692b0ddc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/AgentSessionToolItem/CompactMessageSummary.tsx: desktop/src/features/agents/ui/AgentSessionToolItem/CompactMessageSummary.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in CompactMessageSummary.CompactMessageSummary at line 18. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/AgentSessionToolItem/CompactMessageSummary.tsx\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":"desktop/src/features/agents/ui/AgentSessionToolItem/CompactMessageSummary.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3613dd856333292e4959685eab4d311945d3999e17d788f647127210e857f06"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-media/src/auth.rs: crates/buzz-media/src/auth.rs changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 40 in buzz_media::auth::verify_blossom_auth_event_for_verb at line 65. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-media/src/auth.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/buzz-media/src/auth.rs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee099a109f4253d7a495db4c7a0161fc7e2d9c7aa254caa318dc0b7cd9fe892f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-media/src/upload.rs: crates/buzz-media/src/upload.rs changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in buzz_media::upload::process_video_upload at line 292. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-media/src/upload.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/buzz-media/src/upload.rs"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"328311c27e76540da83aa16a1ab1ce63b94c535e73fcf8a22156b1e2ed0bf160"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/channels_page/quick_actions_launcher.dart: mobile/lib/features/channels/channels_page/quick_actions_launcher.dart changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in ChannelQuickActionsLauncher.build at line 42. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/channels_page/quick_actions_launcher.dart\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":"mobile/lib/features/channels/channels_page/quick_actions_launcher.dart"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7a4f3f588332e1a088a89936d811d23917dd409686b7f25e759fe89a642dfac"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/app/useAppShellDesktopNotifications.ts: desktop/src/app/useAppShellDesktopNotifications.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in useAppShellDesktopNotifications.useAppShellDesktopNotifications at line 27. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/app/useAppShellDesktopNotifications.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/app/useAppShellDesktopNotifications.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"627fb314d5dc91151f07c3693a230b2e2515b8164a0a67f32c4090b956cc4992"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/sidebar/lib/useChannelMutes.ts: desktop/src/features/sidebar/lib/useChannelMutes.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 26 in useChannelMutes.useChannelMutes at line 19. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/sidebar/lib/useChannelMutes.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/lib/useChannelMutes.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c0de871f5178b02ab78c8fa20e1486822756b7a63dc1e1259c3f35773a1cc9d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/sidebar/lib/useChannelStars.ts: desktop/src/features/sidebar/lib/useChannelStars.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 26 in useChannelStars.useChannelStars at line 19. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/sidebar/lib/useChannelStars.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/lib/useChannelStars.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0c939a34e820bdfe807e4f46b88fd49b8f5804df84ff18e7d27bf45fa829c3b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/thread_detail_page/thread_message.dart: mobile/lib/features/channels/thread_detail_page/thread_message.dart changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 26 in _ThreadMessage.build at line 35. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/thread_detail_page/thread_message.dart\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":"mobile/lib/features/channels/thread_detail_page/thread_message.dart"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a5814c0a27009df78e78d51ba7660def1fbc229504cf182dd507830c9be5b91"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/sidebar/ui/ChannelContextMenu.tsx: desktop/src/features/sidebar/ui/ChannelContextMenu.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 39 in ChannelContextMenu.ChannelContextMenuItems 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/sidebar/ui/ChannelContextMenu.tsx\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":"desktop/src/features/sidebar/ui/ChannelContextMenu.tsx"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"11de84082b244ddcac0ebdc7f2afa1f367191c4cf3db36695752c8c64b838f6a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/ios/Runner/JumpToLatestGlassButton.swift: mobile/ios/Runner/JumpToLatestGlassButton.swift changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in NavigationGlassButtonPlatformView.applyContent at line 393. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/ios/Runner/JumpToLatestGlassButton.swift\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":"mobile/ios/Runner/JumpToLatestGlassButton.swift"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"59d20854dd48b4e580996b75edee716bdce96588b25ba7b6544786cf2928e07d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/sidebar/ui/SidebarProjectsSection.tsx: desktop/src/features/sidebar/ui/SidebarProjectsSection.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in SidebarProjectsSection.SidebarProjectsSectionContent at line 128. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/sidebar/ui/SidebarProjectsSection.tsx\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":"desktop/src/features/sidebar/ui/SidebarProjectsSection.tsx"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"93b112d6bd4d688958861f7a59ea59b3de1bbba488cbe651f1004c2317b8eebc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/huddle/components/MicControls.tsx: desktop/src/features/huddle/components/MicControls.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 37 in MicControls.MicControls at line 94. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/huddle/components/MicControls.tsx\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":"desktop/src/features/huddle/components/MicControls.tsx"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fa8a1ffad8b6b5d562aa3889b42617d42bb2f3a417f5fcf5a9a19530f1f3ee1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/onboarding/ui/AvatarStep.tsx: desktop/src/features/onboarding/ui/AvatarStep.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in AvatarStep.AvatarStep at line 248. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/onboarding/ui/AvatarStep.tsx\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":"desktop/src/features/onboarding/ui/AvatarStep.tsx"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9d2025db52948153d9024d96298909869458a128e62ed04399313c40c352360"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/lib/usePersonaSync.ts: desktop/src/features/agents/lib/usePersonaSync.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in usePersonaSync.startPersonaSync 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/lib/usePersonaSync.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/lib/usePersonaSync.ts"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e400af3d75003f20283c71e394872796e6376e6b55502d047c1bd22e8c9106c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/invites/invite_join_sheet.dart: mobile/lib/features/invites/invite_join_sheet.dart changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in InviteJoinSheet.build at line 39. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/invites/invite_join_sheet.dart\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":"mobile/lib/features/invites/invite_join_sheet.dart"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"74aba908a713b6b96207efab1da0169b209e684dfbbc8387b508d77fa39d8ff3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/projects/ui/ProjectsChannelsList.tsx: desktop/src/features/projects/ui/ProjectsChannelsList.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in ProjectsChannelsList.ProjectsChannelsList at line 27. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/projects/ui/ProjectsChannelsList.tsx\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":"desktop/src/features/projects/ui/ProjectsChannelsList.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"957ab34545b424695328312a281e95d5a44111c04ac627dc47c2ad1bc8039367"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/profile/settings_profile_header.dart: mobile/lib/features/profile/settings_profile_header.dart changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in SettingsProfileHeader.build at line 31. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/profile/settings_profile_header.dart\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":"mobile/lib/features/profile/settings_profile_header.dart"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a1d4bb0b3a5252a5a5b0fa522d145d594509e9fdb8140f9e9f15854019f45d1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/settings/ui/SignOutSection.tsx: desktop/src/features/settings/ui/SignOutSection.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in SignOutSection.SignOutSection 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/settings/ui/SignOutSection.tsx\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":"desktop/src/features/settings/ui/SignOutSection.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"48a1c8935a744d53bcec0fbbc0f2f0eb2a6fa8bebe92e1b8bd9ac57125089120"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/media_proxy.rs: desktop/src-tauri/src/media_proxy.rs changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in buzz_desktop::media_proxy::handle_buzz_media at line 190. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/media_proxy.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":"desktop/src-tauri/src/media_proxy.rs"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"6327dc1bc6d805cefade155f2b5b7c2cf843552f56bed00e909b66ca0d0f510b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-relay/src/handlers/report_resolution.rs: crates/buzz-relay/src/handlers/report_resolution.rs changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in buzz_relay::handlers::report_resolution::drive_enforcement at line 380. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-relay/src/handlers/report_resolution.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/buzz-relay/src/handlers/report_resolution.rs"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"85f294c5a6772ad993e5b92f1c07c05f41e81a04121894b3d549331710bd43ce"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/workflows/ui/workflowDefinition.ts: desktop/src/features/workflows/ui/workflowDefinition.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in workflowDefinition.getActionCardClause at line 291. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/workflows/ui/workflowDefinition.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/workflowDefinition.ts"},"region":{"startLine":291}}}],"partialFingerprints":{"codehealthFindingId/v1":"24ef01d9999b946a0bcde7d12dae48e6a4e2cceb5360418e537350bbd267c6c1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/community-members/ui/CommunityMembersCard.tsx: desktop/src/features/community-members/ui/CommunityMembersCard.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in CommunityMembersCard.MemberRow at line 66. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/community-members/ui/CommunityMembersCard.tsx\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":"desktop/src/features/community-members/ui/CommunityMembersCard.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"11d25ac831eb7a9d6c0032d283adbb7f7995da6ff30ede55f89190aca91bedcf"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/sidebar/lib/useCreateChannelForm.ts: desktop/src/features/sidebar/lib/useCreateChannelForm.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in useCreateChannelForm.useCreateChannelForm at line 60. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/sidebar/lib/useCreateChannelForm.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/lib/useCreateChannelForm.ts"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba2e3d56be112e9592bcd583bfe262212666f35a2d08504035e5211322fb7894"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/deep_link_dispatcher.dart: mobile/lib/features/channels/deep_link_dispatcher.dart changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in _DeepLinkDispatcherState._maybeDispatchInvite at line 160. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/deep_link_dispatcher.dart\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":"mobile/lib/features/channels/deep_link_dispatcher.dart"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"1091a0430201612ad63a5e3e20e202d046e72b6dcdb8844fbd8bf0f423c4e9e7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/invites/invite_join_provider.dart: mobile/lib/features/invites/invite_join_provider.dart changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in InviteJoinNotifier.confirmJoin at line 159. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/invites/invite_join_provider.dart\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":"mobile/lib/features/invites/invite_join_provider.dart"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"44378fea45f55a3640952f9b20ff3a954b8e867f699178ed549a38472ef41a0d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/shared/lib/entityLink.ts: desktop/src/shared/lib/entityLink.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 34 in entityLink.parseEntityLink at line 187. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/shared/lib/entityLink.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/lib/entityLink.ts"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6589e750eb46f819c99c21b3d625bc0d69909e8c531c4ffd6ded0f10a7f9d97"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/reminders/ui/RemindersPanel.tsx: desktop/src/features/reminders/ui/RemindersPanel.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in RemindersPanel.ReminderRow 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/reminders/ui/RemindersPanel.tsx\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":"desktop/src/features/reminders/ui/RemindersPanel.tsx"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"69e91b189c0b6b04d884f11f7da0f0ff26f1f91d5bb55ebf8dba5c1b11b6a3cb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/media_viewer_page/video_viewer.dart: mobile/lib/features/channels/media_viewer_page/video_viewer.dart changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 32 in MediaVideoViewerPage.build at line 19. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/media_viewer_page/video_viewer.dart\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":"mobile/lib/features/channels/media_viewer_page/video_viewer.dart"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"4dc2eb226f28b735e4a2e8faa8a1c5affa960dbde2d2bf04d9b2c5a1a327b18e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/sidebar/ui/ChannelActivityPopover.tsx: desktop/src/features/sidebar/ui/ChannelActivityPopover.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in ChannelActivityPopover.ChannelActivityPopover at line 242. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/sidebar/ui/ChannelActivityPopover.tsx\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":"desktop/src/features/sidebar/ui/ChannelActivityPopover.tsx"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5ebcb79b32b0acb842b716b4521e15e718133341934b864c86dc5a47d2b9da7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/shared/ui/markdownUtils.ts: desktop/src/shared/ui/markdownUtils.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in markdownUtils.markdownPropsAreEqual at line 104. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/shared/ui/markdownUtils.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/markdownUtils.ts"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"512c075c4dc6abe6f1536d979713d6096fa77e741dd50128bd22fd1d53339b11"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/huddle/components/HuddleAttachment.tsx: desktop/src/features/huddle/components/HuddleAttachment.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 32 in HuddleAttachment.HuddleAttachment at line 116. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/huddle/components/HuddleAttachment.tsx\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":"desktop/src/features/huddle/components/HuddleAttachment.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bb9c91c3cce43c0da7d86177f0af44b53de4256eec51eb214b1abc73c3fd5f2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/profile/ui/UserProfilePrimaryActions.tsx: desktop/src/features/profile/ui/UserProfilePrimaryActions.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in UserProfilePrimaryActions.ProfilePrimaryActions at line 25. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/profile/ui/UserProfilePrimaryActions.tsx\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":"desktop/src/features/profile/ui/UserProfilePrimaryActions.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"759c5179ee1ce8d2f11ca7e74ab1f0e2d6c08d02c9debdb1c04e6b31b9c402cf"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/lib/useChannelLinks.ts: desktop/src/features/messages/lib/useChannelLinks.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in useChannelLinks.useChannelLinks at line 47. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/lib/useChannelLinks.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useChannelLinks.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"8814f8259e5bee2117d9055aa152be00d7df95698ad28be259f3851e5f689b67"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/SelectionFormattingTray.tsx: desktop/src/features/messages/ui/SelectionFormattingTray.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in SelectionFormattingTray.SelectionFormattingTray at line 112. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/SelectionFormattingTray.tsx\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":"desktop/src/features/messages/ui/SelectionFormattingTray.tsx"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"71e490079d5eb5a660eda0da6bc03777227efe2965472571a478b26e1edbc01b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/shared/ui/compact-link-preview-attachment.tsx: desktop/src/shared/ui/compact-link-preview-attachment.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in compact-link-preview-attachment.CompactLinkPreviewAttachment at line 51. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/shared/ui/compact-link-preview-attachment.tsx\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":"desktop/src/shared/ui/compact-link-preview-attachment.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"76b6597c7ad45c16eeb21ad14c9a507dbb12e25b772a5c377289abfefd22925b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/shared/hooks/useWebviewScrollBoundaryLock.ts: desktop/src/shared/hooks/useWebviewScrollBoundaryLock.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in useWebviewScrollBoundaryLock.useWebviewScrollBoundaryLock at line 84. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/shared/hooks/useWebviewScrollBoundaryLock.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/hooks/useWebviewScrollBoundaryLock.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ce0587ab8b5ae539549e397c8077eabb7b0fd3b6b3ddd97db5b5d4caeefe6b6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/onboarding/ui/DownloadKeyStep.tsx: desktop/src/features/onboarding/ui/DownloadKeyStep.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 31 in DownloadKeyStep.DownloadKeyStep 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/onboarding/ui/DownloadKeyStep.tsx\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":"desktop/src/features/onboarding/ui/DownloadKeyStep.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"26b8c7206dbe65ac77ad959d8f03348a44c9a2033d828667441293897d192cb1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/channels/ui/useChannelUnreadState.ts: desktop/src/features/channels/ui/useChannelUnreadState.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 31 in useChannelUnreadState.useChannelUnreadState at line 62. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/channels/ui/useChannelUnreadState.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/useChannelUnreadState.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"520f3cef5f86fcda63fe6c8c9f829d98754e34df5e2bd1cd695b9dc1731d5537"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/commands/personas/update.rs: desktop/src-tauri/src/commands/personas/update.rs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in buzz_desktop::commands::personas::update::update_persona_with at line 148. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/commands/personas/update.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":"desktop/src-tauri/src/commands/personas/update.rs"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3f92b17fcff5b5e9256384216c7d421c9bc1b507dbe97d79a6d2fa74247d1c9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/MessageThreadSummaryRow.tsx: desktop/src/features/messages/ui/MessageThreadSummaryRow.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in MessageThreadSummaryRow.MessageThreadSummaryRow at line 81. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/MessageThreadSummaryRow.tsx\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":"desktop/src/features/messages/ui/MessageThreadSummaryRow.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"2923f7973642d84550c35d895377e729dff0ab51b86752a63a83520ad83a10ec"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/workflows/ui/WorkflowStepCard.tsx: desktop/src/features/workflows/ui/WorkflowStepCard.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in WorkflowStepCard.StepConfigFields at line 109. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/workflows/ui/WorkflowStepCard.tsx\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":"desktop/src/features/workflows/ui/WorkflowStepCard.tsx"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"08993169c17f1364873db4de220e1a363f8b649acae6fc0afdb49c63c20ed9f4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/commands/link_preview.rs: desktop/src-tauri/src/commands/link_preview.rs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in buzz_desktop::commands::link_preview::fetch_sanitized_image_using at line 431. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/commands/link_preview.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":"desktop/src-tauri/src/commands/link_preview.rs"},"region":{"startLine":431}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec406b4354526f3ff644dbeaa98d56107d508744eafa1aca99de71ebb4990ea2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/submitMessageEdit.ts: desktop/src/features/messages/ui/submitMessageEdit.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in submitMessageEdit.submitMessageEdit at line 70. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/submitMessageEdit.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/submitMessageEdit.ts"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"59ab529a750ca1b1e87241a56b1edc07a62093c8372723618f96e825c9cc3be9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/activityRenderClasses/UserMessageBubble.tsx: desktop/src/features/agents/ui/activityRenderClasses/UserMessageBubble.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in UserMessageBubble.UserMessageBubble at line 17. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/activityRenderClasses/UserMessageBubble.tsx\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":"desktop/src/features/agents/ui/activityRenderClasses/UserMessageBubble.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfb642a507afec1d6d8d301888f8127dad01e24fb9ca98db82f040be903eebc9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/channels/ui/AddChannelBotTeamsSection.tsx: desktop/src/features/channels/ui/AddChannelBotTeamsSection.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in AddChannelBotTeamsSection.AddChannelBotTeamsSection at line 59. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/channels/ui/AddChannelBotTeamsSection.tsx\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":"desktop/src/features/channels/ui/AddChannelBotTeamsSection.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"11d209eb739fcb75685ee09884b685209c826733659afc8e3a70b216f4513b33"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-cli/src/commands/projects.rs: crates/buzz-cli/src/commands/projects.rs changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in buzz_cli::commands::projects::cmd_update at line 588. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-cli/src/commands/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/buzz-cli/src/commands/projects.rs"},"region":{"startLine":588}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a3af6fe2c3c830222d1d19006c2bd48c1b0b297ab038567f51a81c99374ce83"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/projects/ui/CreatePullRequestDialog.tsx: desktop/src/features/projects/ui/CreatePullRequestDialog.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in CreatePullRequestDialog.CreatePullRequestDialog at line 21. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/projects/ui/CreatePullRequestDialog.tsx\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":"desktop/src/features/projects/ui/CreatePullRequestDialog.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d1905cd65a414f578aab2ffa332432118f500cfa01326b8cf5502e2e2193ae5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/personaModelDiscoveryStatus.ts: desktop/src/features/agents/ui/personaModelDiscoveryStatus.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in personaModelDiscoveryStatus.formatModelDiscoveryErrorStatus at line 44. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/personaModelDiscoveryStatus.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/personaModelDiscoveryStatus.ts"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"f22a4e87d267a9705ea9634c007baea6953714cdc1cdf986697f392eb48b5738"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/communities/ui/EditCommunityDialog.tsx: desktop/src/features/communities/ui/EditCommunityDialog.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in EditCommunityDialog.EditCommunityDialog 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/communities/ui/EditCommunityDialog.tsx\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":"desktop/src/features/communities/ui/EditCommunityDialog.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f2d31e5d3ac42a623230ff5cf5a77bd07c04ed0ac763992b3ccca7c6504dd64"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/DraftsPanel.tsx: desktop/src/features/messages/ui/DraftsPanel.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in DraftsPanel.DraftRow at line 335. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/DraftsPanel.tsx\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":"desktop/src/features/messages/ui/DraftsPanel.tsx"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ec5efb5021ba1f7f79f28db322a10d01e1c8350c7de33a2c8fa4331f577429e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/shared/widgets/ios_glass_navigation_button.dart: mobile/lib/shared/widgets/ios_glass_navigation_button.dart changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 29 in IosGlassNavigationButton.build at line 106. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/shared/widgets/ios_glass_navigation_button.dart\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":"mobile/lib/shared/widgets/ios_glass_navigation_button.dart"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"19763826da0ff849142e49c40fcaa6d8415c2f2475976dc45269371779fdc95e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/lib/useLinkEditor.tsx: desktop/src/features/messages/lib/useLinkEditor.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 29 in useLinkEditor.useLinkEditor at line 70. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/lib/useLinkEditor.tsx\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":"desktop/src/features/messages/lib/useLinkEditor.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7f1e41d8f0b0ff25c8dc58e3f03820bfc411751fadbffe390ce2ef15fa43568"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/commands/personas/card.rs: desktop/src-tauri/src/commands/personas/card.rs changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in buzz_desktop::commands::personas::card::mint_agent_card at line 534. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/commands/personas/card.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":"desktop/src-tauri/src/commands/personas/card.rs"},"region":{"startLine":534}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f92261e58874bc6dcbf4890b2a7a7731efe736908ed7624a68686995b021d0c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/AddAgentToChannelDialog.tsx: desktop/src/features/agents/ui/AddAgentToChannelDialog.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in AddAgentToChannelDialog.AddAgentToChannelDialog at line 27. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/AddAgentToChannelDialog.tsx\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":"desktop/src/features/agents/ui/AddAgentToChannelDialog.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"649875df5943b281bce5401e2e74dac59a1013e7ce9de534f94d80de867807a4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-push-gateway/src/http.rs: crates/buzz-push-gateway/src/http.rs changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in buzz_push_gateway::http::deliver at line 654. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-push-gateway/src/http.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/buzz-push-gateway/src/http.rs"},"region":{"startLine":654}}}],"partialFingerprints":{"codehealthFindingId/v1":"ceb5765cef12f218e7f486193f096c488847507fbc5d6d754dcdb5d245c5598d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/buzz-core/src/network.rs: crates/buzz-core/src/network.rs changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in buzz_core::network::is_not_global_unicast 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-core/src/network.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/buzz-core/src/network.rs"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f3c97acfb709040b67fe33aa3880ed1c029d3d7789ce40ee2e23c6312c8b479"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/pulse/ui/NoteCard.tsx: desktop/src/features/pulse/ui/NoteCard.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in NoteCard.NoteCard at line 137. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/pulse/ui/NoteCard.tsx\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":"desktop/src/features/pulse/ui/NoteCard.tsx"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"ece7541b9d2817df0ec9b8738bdefce7db110c337387818240e92e31713b14d1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/desktop_release.py: scripts/desktop_release.py changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in desktop_release.validate at line 210. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- scripts/desktop_release.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/desktop_release.py"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"f08653b3ec9b3b9d1d5ad49b7b23da58a177a69926ecbf9ffc17676b5e47afe2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/huddle/components/AddAgentDialog.tsx: desktop/src/features/huddle/components/AddAgentDialog.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in AddAgentDialog.AddAgentDialog at line 31. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/huddle/components/AddAgentDialog.tsx\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":"desktop/src/features/huddle/components/AddAgentDialog.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"19adca73b32e754884de78ae3917a024e63e3d7c0a49f9e1ff1eda296417599f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/useAutoPinMentionedAgents.ts: desktop/src/features/messages/ui/useAutoPinMentionedAgents.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in useAutoPinMentionedAgents.useAutoPinMentionedAgents at line 35. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/useAutoPinMentionedAgents.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useAutoPinMentionedAgents.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"b196e4ec49182a70d94ed8541719856251c707a0864b03c8d3e705ab92c97959"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/notifications/lib/desktop.ts: desktop/src/features/notifications/lib/desktop.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in desktop.listenForDesktopNotificationActions 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/notifications/lib/desktop.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/notifications/lib/desktop.ts"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b258a8e807a008365c456aff5e5a7c127b2bb42cfd7c69fb38f340093b74747"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agent-memory/ui/MemorySection.tsx: desktop/src/features/agent-memory/ui/MemorySection.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in MemorySection.MemoryEntryAccordion at line 526. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agent-memory/ui/MemorySection.tsx\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":"desktop/src/features/agent-memory/ui/MemorySection.tsx"},"region":{"startLine":526}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dda1019b03b7ad1ae9a6a7825fdfd04382ef3c7d5d383f4929f62fb45364aa2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/settings/hooks/use-updater.ts: desktop/src/features/settings/hooks/use-updater.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in use-updater.useUpdater at line 54. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/settings/hooks/use-updater.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/hooks/use-updater.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"123de2be6d48d7331786e8edcb43fd7588c2830695ee0ed2d4351cb46827be8f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/home/useHomeInboxReadState.ts: desktop/src/features/home/useHomeInboxReadState.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in useHomeInboxReadState.useHomeInboxReadState at line 147. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/home/useHomeInboxReadState.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/useHomeInboxReadState.ts"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8a71854a95a4396cc08810dd9c9331c2004744a81a5be778ad2f64365e94349"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/DiffMessage.tsx: desktop/src/features/messages/ui/DiffMessage.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in DiffMessage.DiffMessage at line 31. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/DiffMessage.tsx\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":"desktop/src/features/messages/ui/DiffMessage.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ae02695f7a0ac418f439d4ad81406a50fcf2f0f19739d8e891d837ef55b714b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/lib/useAutoRestartPolicy.ts: desktop/src/features/agents/lib/useAutoRestartPolicy.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in useAutoRestartPolicy.useAutoRestartPolicy at line 38. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/lib/useAutoRestartPolicy.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/lib/useAutoRestartPolicy.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"a09d93137cacf2ca49c8a4e355218cfa2044fa2f5affaeac3cd2be39b29f8d81"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/useComposerHeightPadding.ts: desktop/src/features/messages/ui/useComposerHeightPadding.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in useComposerHeightPadding.useComposerHeightPadding at line 24. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/useComposerHeightPadding.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/useComposerHeightPadding.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1900c9cd05c1892b7c7199736808b7224864443140cae78b4fd6da1f75655d3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src-tauri/src/commands/channels/fetch.rs: desktop/src-tauri/src/commands/channels/fetch.rs changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in buzz_desktop::commands::channels::fetch::fetch_channels 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/commands/channels/fetch.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":"desktop/src-tauri/src/commands/channels/fetch.rs"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"31ab735d2bc51b2f787d6fb6b04a116b588b97ddcfdf5bf323ed154924d3d9ac"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/settings/ui/NotificationSettingsCard.tsx: desktop/src/features/settings/ui/NotificationSettingsCard.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in NotificationSettingsCard.NotificationSettingsCard at line 28. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/settings/ui/NotificationSettingsCard.tsx\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":"desktop/src/features/settings/ui/NotificationSettingsCard.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"50d4a1434e38c97fe09821fb31a158124ff486c85c0c6bf8c3c8ecb508b2411c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/channel_detail_page/huddle_sheet.dart: mobile/lib/features/channels/channel_detail_page/huddle_sheet.dart changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in _MobileHuddleCallPage.build at line 539. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/channel_detail_page/huddle_sheet.dart\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":"mobile/lib/features/channels/channel_detail_page/huddle_sheet.dart"},"region":{"startLine":539}}}],"partialFingerprints":{"codehealthFindingId/v1":"44bd41796ae083aa6e17ba11401ab2f02066b0e3260e411c9eb57f0b9b8d12fb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/projects/ui/ProjectConversationPanelContext.tsx: desktop/src/features/projects/ui/ProjectConversationPanelContext.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in ProjectConversationPanelContext.ProjectConversationPanelController 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/projects/ui/ProjectConversationPanelContext.tsx\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":"desktop/src/features/projects/ui/ProjectConversationPanelContext.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"264cf70cfbbaeb377910b972fe2b732027b2b6bdff8be2fdcae50b21730a2395"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/shared/ui/markdown/AgentSnapshotCard.tsx: desktop/src/shared/ui/markdown/AgentSnapshotCard.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in AgentSnapshotCard.AgentSnapshotCard at line 59. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/shared/ui/markdown/AgentSnapshotCard.tsx\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":"desktop/src/shared/ui/markdown/AgentSnapshotCard.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b7ace17b568b70a9c3feb8f712e9dc96204ca6fae229a80d985631e2358ff7b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/shared/api/relayReconnectController.ts: desktop/src/shared/api/relayReconnectController.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in RelayReconnectController.start at line 130. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/shared/api/relayReconnectController.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/api/relayReconnectController.ts"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"04efa7b61c741ca552b885a562e2fed4d460a8782fac5d6388d48f3ab3a5444f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/agents/ui/activityRenderClasses/LifecycleActivity.tsx: desktop/src/features/agents/ui/activityRenderClasses/LifecycleActivity.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in LifecycleActivity.LifecycleActivity at line 40. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/activityRenderClasses/LifecycleActivity.tsx\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":"desktop/src/features/agents/ui/activityRenderClasses/LifecycleActivity.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"16736887b4d9ffc6339038ebd6c079b49092ea3bb3639366527580b18ffd0e4b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/sidebar/ui/SidebarRelayConnectionCard.tsx: desktop/src/features/sidebar/ui/SidebarRelayConnectionCard.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in SidebarRelayConnectionCard.SidebarRelayConnectionCompactCard 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/sidebar/ui/SidebarRelayConnectionCard.tsx\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":"desktop/src/features/sidebar/ui/SidebarRelayConnectionCard.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b975dc037e223e94e80a3373c9be8dbf79df525e526756de3143eeff7d8a2f4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/features/repos/ui/ReposPage.tsx: web/src/features/repos/ui/ReposPage.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in ReposPage.ReposPage at line 71. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- web/src/features/repos/ui/ReposPage.tsx\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":"web/src/features/repos/ui/ReposPage.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2d94adffedde04dcfa98bdfd0e207b1e9373e9f03a7b0c1b952665c9a497926"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mobile/lib/features/channels/compose_bar/ios_attachment_popover.dart: mobile/lib/features/channels/compose_bar/ios_attachment_popover.dart changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in _IOSAttachmentPopoverCoordinator.present at line 42. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/compose_bar/ios_attachment_popover.dart\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":"mobile/lib/features/channels/compose_bar/ios_attachment_popover.dart"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf3f08e2a2d46db8a1c7d0e43b1bd08ccf014d7a610c9048a6aec1d78ca54deb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/messages/ui/DiffViewer.tsx: desktop/src/features/messages/ui/DiffViewer.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in DiffViewer.DiffViewer at line 47. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/DiffViewer.tsx\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":"desktop/src/features/messages/ui/DiffViewer.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d6ca400050d8e9d286003b48518df33a511655e6e288b7e1dec8ffd9d3dfb2c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/projects/ui/ProjectWorkItemRow.tsx: desktop/src/features/projects/ui/ProjectWorkItemRow.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in ProjectWorkItemRow.ProjectWorkItemRow at line 8. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/projects/ui/ProjectWorkItemRow.tsx\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":"desktop/src/features/projects/ui/ProjectWorkItemRow.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"65ab5a42f7155a26855cb6165dd849e7a9adbc4cb2aa569d2306d90576052279"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: desktop/src/features/projects/ui/PullRequestMetaRail.tsx: desktop/src/features/projects/ui/PullRequestMetaRail.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in PullRequestMetaRail.PullRequestMetaHeader at line 28. 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-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/projects/ui/PullRequestMetaRail.tsx\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":"desktop/src/features/projects/ui/PullRequestMetaRail.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"abbb22eb3362296c8f478d8248e12a3f26d707915f388a609f3986456874048a"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src-tauri/src/relay.rs: desktop/src-tauri/src/relay.rs changed 17 times in last 90 days and 9 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 9 (its worst body is buzz_desktop::relay::relay_error_message at line 285), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): keep managed agent avatars usable across communities (#7732)\u201D; \u201Cfix(desktop): isolate quota backoff and reuse channel discovery rosters (#6998)\u201D; \u201Cfix(desktop): bound thread /query and surface load errors, not false-empty (#6447)\u201D; \u201Cfix(desktop): exclude archived agents from nest, order regeneration (#5905)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/relay.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":"desktop/src-tauri/src/relay.rs"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"a34d01eb0ab069b43c9f778ddb4f750558f6bc054e127f7d66bf4f36c4f87c60"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/profile/hooks.ts: desktop/src/features/profile/hooks.ts changed 13 times in last 90 days and 8 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 13 (its worst body is hooks.useUsersBatchQuery at line 328), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): harden profile batch and thread-reply fetches against relay slowness (#7188)\u201D; \u201Cfix(desktop): sender names in notifications \u002B macOS click-through routing (#6427)\u201D; \u201Cfix(desktop): show cached display names on startup (#3317)\u201D; \u201Cfix(desktop): refresh cached channel member names (#2258)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/profile/hooks.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/hooks.ts"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"72b485344408cd5fe3872607a2df4e6f3ddfd176d0ba4303aafb732e11c301b4"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/shared/api/relayClientShared.ts: desktop/src/shared/api/relayClientShared.ts changed 12 times in last 90 days and 7 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 12 (its worst body is relayClientShared.getTextPayload at line 149), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): bound startup request bursts and recover quota refusals (#7790)\u201D; \u201Cfix(desktop): harden profile batch and thread-reply fetches against relay slowness (#7188)\u201D; \u201Cfix(client): resurface hidden DMs from live activity (#6885)\u201D; \u201Cfix(desktop): make reconnect repair lossless (#6415)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/shared/api/relayClientShared.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/api/relayClientShared.ts"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9f738f8c002472a6dee27f0da4bf468994946399dee1770277fd308fa69f431"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src-tauri/src/mesh_llm/mod.rs: desktop/src-tauri/src/mesh_llm/mod.rs changed 10 times in last 90 days and 6 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 11 (its worst body is DesktopMeshRuntime::start at line 340), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): supervise and re-arm relay-mesh runtime (#2823)\u201D; \u201Cfix(desktop): shared-compute usability \u2014 share toggle, usage indicator, model resync (#2448)\u201D; \u201Cfix(mesh): dedupe models \u002B retry throttled startup channel discovery (#2063)\u201D; \u201Cfix(desktop): keep mesh allowlist on transient roster query failure (#2024)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/mesh_llm/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":"desktop/src-tauri/src/mesh_llm/mod.rs"},"region":{"startLine":340}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f26468ac19a3d63bd41ac8ac3bb7c35593af0a614c2173428217276fcddf1f4"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src-tauri/src/models.rs: desktop/src-tauri/src/models.rs changed 9 times in last 90 days and 6 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 1 (its worst body is buzz_desktop::models::deserialize_null_string_as_empty at line 366), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): emit singular \u0060mention\u0060 feed category so alerts route correctly (#6665)\u201D; \u201Cfix(desktop): remove 0.5.9\u002B perf regressions, speed up get_channels (#5599)\u201D; \u201Cfix(desktop): make @mention clicks reliably open the profile panel (#1705)\u201D; \u201Cfix(desktop): stop losing imported identity on every launch (#1568)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/models.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":"desktop/src-tauri/src/models.rs"},"region":{"startLine":366}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ad8ab4c77137d82307c20656efb2c873f1c9cf6dc8049e336c7b418b965829d"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/channels/ui/useChannelAgentSessions.ts: desktop/src/features/channels/ui/useChannelAgentSessions.ts changed 8 times in last 90 days and 5 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 11 (its worst body is useChannelAgentSessions.getChannelAgentSessionAgents at line 113), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): npub identity displays for mention, member, and workflow surfaces (#7495)\u201D; \u201Cfix(desktop): discover authenticated owned relay agents (#7122)\u201D; \u201Cfix(messages): route edits to the owning composer (#6575)\u201D; \u201Cfix(desktop): scope observer feed by channel and add session-boundary dividers (#1634)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/channels/ui/useChannelAgentSessions.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/useChannelAgentSessions.ts"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c572dbb1e8aa4028c374557a142e3c4259a6509575ca90237abaf78b905f8a7"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: mobile/lib/features/channels/channel_sections/channel_sections_manager.dart: mobile/lib/features/channels/channel_sections/channel_sections_manager.dart changed 6 times in last 90 days and 5 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 12 (its worst body is ChannelSectionsManager._publish at line 461), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(mobile): keep retired sections manager out of successor cache (#7873)\u201D; \u201Cfix(mobile): converge sidebar managers on relay head with resume re-read (#7806)\u201D; \u201Cfix(mobile): serialize channel sections sync (#3165)\u201D; \u201Cfix(mobile): retry channel-sections startup sync when relay rate-limits cold start (#3004)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/channel_sections/channel_sections_manager.dart\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":"mobile/lib/features/channels/channel_sections/channel_sections_manager.dart"},"region":{"startLine":461}}}],"partialFingerprints":{"codehealthFindingId/v1":"b695798b2daeb97336d9c4a350928cd794a492c66cfa0903ce7786e290271d9d"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/shared/api/relayClosedRecovery.ts: desktop/src/shared/api/relayClosedRecovery.ts changed 6 times in last 90 days and 5 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 12 (its worst body is relayClosedRecovery.handleRelayClosed at line 26), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): bound startup request bursts and recover quota refusals (#7790)\u201D; \u201Cfix(desktop): harden profile batch and thread-reply fetches against relay slowness (#7188)\u201D; \u201Cfix(desktop): make reconnect repair lossless (#6415)\u201D; \u201Cfix(desktop): preserve theme when opening communities (#5266)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/shared/api/relayClosedRecovery.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/api/relayClosedRecovery.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"c81f1b05b801219c46c7b4fc0efc0804c4580224fdf1fcc8d30850ed485ebaf3"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: crates/buzz-cli/src/commands/users.rs: crates/buzz-cli/src/commands/users.rs changed 6 times in last 90 days and 5 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 9 (its worst body is buzz_cli::commands::users::cmd_get_users at line 15), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(cli): enrich template cardinality error with per-candidate presence and profile hints (#4825)\u201D; \u201Cfix(cli): resolve agents from owner records (#3178)\u201D; \u201CRevert \u0022fix(cli,relay): resolve agents by verified owner\u0022 (#3168)\u201D; \u201Cfix(cli,relay): resolve agents by verified owner (#2615)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-cli/src/commands/users.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/buzz-cli/src/commands/users.rs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"7824c25f09c0613604ef8fafa2e51eefd3c64265bcaf9b58564f8d508baa27e2"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/channels/ui/FocusThreadDrawer.tsx: desktop/src/features/channels/ui/FocusThreadDrawer.tsx changed 6 times in last 90 days and 5 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 14 (its worst body is FocusThreadDrawer.FocusThreadDrawer at line 186), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): keep project sheets independent from threads (#6901)\u201D; \u201Cfix(messages): route edits to the owning composer (#6575)\u201D; \u201Cfix(desktop): isolate main timeline stacking context from focus drawer (#6398)\u201D; \u201Cfix(desktop): refine focused thread dismissal targets (#2644)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/channels/ui/FocusThreadDrawer.tsx\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":"desktop/src/features/channels/ui/FocusThreadDrawer.tsx"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"5da5e2cc06598845e4a90e40e3d0ae4f49e0f7accaeddace7cd17381374c8f6d"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src-tauri/src/commands/profile.rs: desktop/src-tauri/src/commands/profile.rs changed 5 times in last 90 days and 5 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 9 (its worst body is buzz_desktop::commands::profile::get_presence at line 338), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): derive agent availability from relay presence (#7127)\u201D; \u201CFix avatar upload lifecycle edge cases (#2277)\u201D; \u201Cfix: user search returns zero results for partially typed names (#1603)\u201D; \u201Cfix(onboarding): guard against webkit2gtk WAL race with explicit profile-event signal (#1508)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/commands/profile.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":"desktop/src-tauri/src/commands/profile.rs"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"496390962d5a06acfc40683ce930af0a69d9d1728f0bee15f87bff28a4dddd35"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/home/hooks.ts: desktop/src/features/home/hooks.ts changed 5 times in last 90 days and 5 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 2 (its worst body is hooks.useHomeFeedQuery at line 18), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): defer foreground resume work (#5696)\u201D; \u201Cfix(desktop): remove 0.5.9\u002B perf regressions, speed up get_channels (#5599)\u201D; \u201Cfix(desktop): suppress fresh focus-return refetches for channels and home-feed (#5535)\u201D; \u201Cfix(desktop): quiesce renderer polling while hidden (#3677) (#5490)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/home/hooks.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/hooks.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"476a63fd05fdb2961dcb170377d5947a551be7bbe545b79155e552f510afacdc"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/sidebar/lib/useChannelSections.ts: desktop/src/features/sidebar/lib/useChannelSections.ts changed 7 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 11 (its worst body is useChannelSections.useChannelSections at line 36), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(sidebar): converge stale-at-open state across devices (sections/sort/stars/mutes) (#7805)\u201D; \u201Cfix(desktop): bound nine unbounded localStorage stores (#5454)\u201D; \u201Cfix(desktop): prevent sidebar prefs from reverting on stale-localStorage boot (#5086)\u201D; \u201Cfix(sidebar): scope channel sections storage to relay URL (#1477)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/sidebar/lib/useChannelSections.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/lib/useChannelSections.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1218b7199982032c6be5fdd96490f26ca2c89deb1f17a62cf667491e7189015"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src-tauri/src/commands/agent_discovery/relay_directory.rs: desktop/src-tauri/src/commands/agent_discovery/relay_directory.rs changed 7 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 7 (its worst body is buzz_desktop::commands::agent_discovery::relay_directory::list_relay_agents_for_selection at line 127), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): discover authenticated owned relay agents (#7122)\u201D; \u201CFix cross-owner relay agent mentions in owner-only builds (#6338)\u201D; \u201Cfix(desktop): bound remote agent mention authorization (#6224)\u201D; \u201Cfix(desktop): restore release agent mentions (#6182)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/commands/agent_discovery/relay_directory.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":"desktop/src-tauri/src/commands/agent_discovery/relay_directory.rs"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e8bb9ff4f09a53b61627141d080cfb1c77c9df77eded50c67aa3e530ab6e461"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/shared/api/tauriArchive.ts: desktop/src/shared/api/tauriArchive.ts changed 7 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 5 (its worst body is tauriArchive.decodeRawSubscription at line 188), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(local-archive): default both archive settings to enabled (#4750)\u201D; \u201Cfix(desktop): enforce observer archive policy reconciliation on internal builds (#1923)\u201D; \u201Cfix(desktop): scope observer feed by channel and add session-boundary dividers (#1634)\u201D; \u201Cfix(archive): atomic remove-kind path \u002B split test modules (#1562)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/shared/api/tauriArchive.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/api/tauriArchive.ts"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"e81f4db28b5f6f783c389703a58ac23a1a2eb6cadf9eb3aa708a8d3b2c88a85c"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: crates/buzz-agent/src/handoff.rs: crates/buzz-agent/src/handoff.rs changed 7 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 11 (its worst body is RunCtx::build_handoff_prompt at line 304), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(agent): raise output limit and allow 3 recoveries (#5475)\u201D; \u201Cfix(buzz-agent): budget summarizer reasoning separately so it cannot starve the handoff summary (#5248)\u201D; \u201Cfix(buzz-agent): recover from context-window 400s instead of sticking (#4946)\u201D; \u201Cfix(buzz-agent): scope handoff cap per turn, not per session lifetime (#4805)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- crates/buzz-agent/src/handoff.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/buzz-agent/src/handoff.rs"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"01ba9776d71e6f1c24ccfb9d2c070f0de502b0df9bdf91b244b36d79cf9a415d"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/shared/api/relayMembers.ts: desktop/src/shared/api/relayMembers.ts changed 7 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 9 (its worst body is relayMembers.relayMembersFromEvent at line 54), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix: expose community icon control on open relays (#2640)\u201D; \u201Cfix: skip membership lookup for open relays (#2107)\u201D; \u201Cfix: recover community access visibility (#2074)\u201D; \u201Cfix(desktop): stop losing imported identity on every launch (#1568)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/shared/api/relayMembers.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/api/relayMembers.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"df2e60b0a25215c4571adb4f61d808b5d404088077aab6a73090ec57dfbe9d7e"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: mobile/lib/features/channels/thread_replies_provider.dart: mobile/lib/features/channels/thread_replies_provider.dart changed 5 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 4 (its worst body is ThreadRepliesArgs.== at line 17), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(mobile): avoid opening empty threads on message tap (#7756)\u201D; \u201Cfix(mobile): preserve thread replies through refresh failures (#7757)\u201D; \u201Cfix(mobile): recover stale and shuffled messages (#6691)\u201D; \u201Cfix(mobile): mitigate message-post delay with optimistic rendering (#3037)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/features/channels/thread_replies_provider.dart\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":"mobile/lib/features/channels/thread_replies_provider.dart"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"09a0d08bd2faaf9206c81b2743137c10cadc8cc3efa117fda018450e40f46bc6"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src-tauri/src/nostr_convert.rs: desktop/src-tauri/src/nostr_convert.rs changed 5 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 8 (its worst body is buzz_desktop::nostr_convert::channel_info_from_event at line 113), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): discover authenticated owned relay agents (#7122)\u201D; \u201Cfix(desktop): enforce shared agent access across devices (#6086)\u201D; \u201Cfix(desktop): make @mention clicks reliably open the profile panel (#1705)\u201D; \u201Cfix(onboarding): guard against webkit2gtk WAL race with explicit profile-event signal (#1508)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/nostr_convert.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/nostr_convert.rs"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad51a27fb7dbc206f6135c112a2a915dbb299c9451cc10dea1eabb5518a819d3"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/messages/lib/timelineSnapshot.ts: desktop/src/features/messages/lib/timelineSnapshot.ts changed 5 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 13 (its worst body is timelineSnapshot.classifyTimelineMessageDelta at line 290), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): surface channel history load failures (#7013)\u201D; \u201Cfix(desktop): bound thread /query and surface load errors, not false-empty (#6447)\u201D; \u201Cfix(desktop): preserve fresh channel timelines (#5577)\u201D; \u201Cfix(desktop): classify timeline prepends so history loads don\u0027t bump unread (#1416)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/lib/timelineSnapshot.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/timelineSnapshot.ts"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad25326c8782f763caf25a9791e172cae8f6c337cdfa48c4ca6359ca61021921"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/custom-emoji/hooks.ts: desktop/src/features/custom-emoji/hooks.ts changed 5 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 2 (its worst body is hooks.useCommunityEmojiLiveUpdates at line 80), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): cut steady-state relay traffic from polls and read-state echo (#5879)\u201D; \u201Cfix(desktop): defer foreground resume work (#5696)\u201D; \u201Cfix(desktop): remove 0.5.9\u002B perf regressions, speed up get_channels (#5599)\u201D; \u201Cfix(desktop): quiesce renderer polling while hidden (#3677) (#5490)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/custom-emoji/hooks.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/custom-emoji/hooks.ts"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1d33b3ca9065c92651b3c6c8cd7ed266ff7a43ea4e0dc424ece4f2b0290ea91"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src-tauri/src/managed_agents/runtime/path.rs: desktop/src-tauri/src/managed_agents/runtime/path.rs changed 5 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 9 (its worst body is buzz_desktop::managed_agents::runtime::path::build_augmented_path at line 104), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): surface install failures hidden by curl-pipe exit codes (#2892)\u201D; \u201Cfix(desktop): fix Windows PATH clobber and .cmd shim EINVAL (#2563)\u201D; \u201Cfix(desktop): make doctor installs retryable with per-runtime progress and auth status (#1765)\u201D; \u201Cfix(desktop): use augmented PATH for readiness probes (#1613)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/managed_agents/runtime/path.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":"desktop/src-tauri/src/managed_agents/runtime/path.rs"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d69fce8a8a749cd0d8cf98cc7bafcf373d7ecf762ab3629085cc279a205ffef"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/agents/lib/usePersonaCatalogRelay.ts: desktop/src/features/agents/lib/usePersonaCatalogRelay.ts changed 4 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 4 (its worst body is usePersonaCatalogRelay.usePersonaCatalogLiveUpdates at line 51), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): cut steady-state relay traffic from polls and read-state echo (#5879)\u201D; \u201Cfix(desktop): defer foreground resume work (#5696)\u201D; \u201Cfix(desktop): remove 0.5.9\u002B perf regressions, speed up get_channels (#5599)\u201D; \u201Cfix(desktop): quiesce renderer polling while hidden (#3677) (#5490)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/lib/usePersonaCatalogRelay.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/lib/usePersonaCatalogRelay.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"dea9dc820d86f953f3d2cdf428d8b1f3969f83420cc943b21e1ccadeb4a02a9c"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src-tauri/src/managed_agents/readiness/cli_probe.rs: desktop/src-tauri/src/managed_agents/readiness/cli_probe.rs changed 4 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 4 (its worst body is buzz_desktop::managed_agents::readiness::cli_probe::login_probe at line 56), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): use augmented PATH for model discovery subprocess (#2753)\u201D; \u201Cfix(desktop): suppress Windows console flashes and reject WSL bash alias (#2587)\u201D; \u201Cfix(desktop): make doctor installs retryable with per-runtime progress and auth status (#1765)\u201D; \u201Cfix(desktop): surface codex config-parse failures and -32603 internal errors clearly (#1745)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/managed_agents/readiness/cli_probe.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":"desktop/src-tauri/src/managed_agents/readiness/cli_probe.rs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"20900e197f46555968db28f4059133d010d6c4e90c533a4b49189b4ea79792ea"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/sidebar/lib/channelSortPreference.ts: desktop/src/features/sidebar/lib/channelSortPreference.ts changed 5 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 9 (its worst body is channelSortPreference.sortChannelsForSidebar at line 92), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(sidebar): converge stale-at-open state across devices (sections/sort/stars/mutes) (#7805)\u201D; \u201Cfix(desktop): bound nine unbounded localStorage stores (#5454)\u201D; \u201Cfix(desktop): prevent sidebar prefs from reverting on stale-localStorage boot (#5086)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/sidebar/lib/channelSortPreference.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/lib/channelSortPreference.ts"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"99752226d962261f5ccc00b5e66a57e02bf848822d815634e884f92f011e9cbc"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/sidebar/lib/useChannelSortPreference.ts: desktop/src/features/sidebar/lib/useChannelSortPreference.ts changed 5 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 5 (its worst body is useChannelSortPreference.useChannelSortPreference at line 19), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(sidebar): converge stale-at-open state across devices (sections/sort/stars/mutes) (#7805)\u201D; \u201Cfix(desktop): bound nine unbounded localStorage stores (#5454)\u201D; \u201Cfix(desktop): prevent sidebar prefs from reverting on stale-localStorage boot (#5086)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/sidebar/lib/useChannelSortPreference.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/lib/useChannelSortPreference.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"f39049384352aba68e90bb4181c88f7aac3479f0f995c14de3c5cbca9d43875f"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/messages/lib/threadPanel.ts: desktop/src/features/messages/lib/threadPanel.ts changed 5 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 11 (its worst body is threadPanel.buildDescendantStatsByMessageId at line 121), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): npub identity displays for mention, member, and workflow surfaces (#7495)\u201D; \u201Cfix(desktop): bound thread /query and surface load errors, not false-empty (#6447)\u201D; \u201Cfix(desktop): render thread facepile oldest-replier-first (#1595)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/lib/threadPanel.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/threadPanel.ts"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"00c729c41e46fbce1b8413454508d0a15e9a154c49360a339eb390c661ca9e9d"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/forum/ui/ForumPostCard.tsx: desktop/src/features/forum/ui/ForumPostCard.tsx changed 5 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 14 (its worst body is ForumPostCard.ForumPostCard at line 31), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): bind duplicate mention selections to exact recipients (#7133)\u201D; \u201Cfix(desktop): render rich project work item content (#3100)\u201D; \u201Cfix(desktop): make @mention clicks reliably open the profile panel (#1705)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/forum/ui/ForumPostCard.tsx\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":"desktop/src/features/forum/ui/ForumPostCard.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"177051b0cf5d3ae203ae2d2b777c59f9409aa1c8b6d7a792d30dc58ec1105403"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/messages/lib/mentionSuggestionMapping.ts: desktop/src/features/messages/lib/mentionSuggestionMapping.ts changed 5 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 12 (its worst body is mentionSuggestionMapping.mapMentionCandidateToSuggestion at line 25), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): unify owned-agent cloud provenance markers (#7129)\u201D; \u201Cfix(desktop): simplify duplicate agent provenance (#6401)\u201D; \u201Cfix(desktop): distinguish duplicate agent devices (#6337)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/lib/mentionSuggestionMapping.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/mentionSuggestionMapping.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c2482f57d6ef4bc318cde52e6e42a9ac9522e6a06cda36fe17c85ac9bee8eaa"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/messages/lib/persistentAgentAudience.ts: desktop/src/features/messages/lib/persistentAgentAudience.ts changed 5 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 10 (its worst body is persistentAgentAudience.setPersistentAgentAudience at line 70), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): retain automatic mentions only in threads (#7144)\u201D; \u201Cfix(composer): polish automatic mentions (#6956)\u201D; \u201Cfix(desktop): bound nine unbounded localStorage stores (#5454)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/lib/persistentAgentAudience.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/persistentAgentAudience.ts"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"98b4d4f7fd1b9d641d123e051e286e856660703b03b66fb552f4a0a60b60073b"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src-tauri/src/secret_store.rs: desktop/src-tauri/src/secret_store.rs changed 5 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 14 (its worst body is SecretStore::delete_all_with_legacy_cleanup at line 756), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): stop losing imported identity on every launch (#1568)\u201D; \u201Cfix(desktop): isolate dev keyring from production and make BUZZ_SHARE_IDENTITY keyring-aware (#1680)\u201D; \u201Cfix: close cross-process keychain race and namespace dev-build nest (#1409)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/secret_store.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":"desktop/src-tauri/src/secret_store.rs"},"region":{"startLine":756}}}],"partialFingerprints":{"codehealthFindingId/v1":"eaf7c7e4dc173b69262dc02f1416dbd1f695d5a8417ad3bbb400bd4edeaec7ce"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/settings/ui/harnessCatalogCopy.ts: desktop/src/features/settings/ui/harnessCatalogCopy.ts changed 4 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 1 (its worst body is harnessCatalogCopy.harnessDescription at line 55), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(acp): integrate the Buzz Pi adapter fork (#7552)\u201D; \u201Cfix(catalog): update Amp tagline (#3806)\u201D; \u201Cfix(catalog): update Amp description (#3758)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/settings/ui/harnessCatalogCopy.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/harnessCatalogCopy.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce845f75a6786921e7a60e305771e965b1ce58dcfe285cd8accc60233bcc180a"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/shared/ui/markdown/MarkdownMention.tsx: desktop/src/shared/ui/markdown/MarkdownMention.tsx changed 4 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 12 (its worst body is MarkdownMention.createMarkdownMention at line 19), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(markdown): align mention chip wrapping (#7501)\u201D; \u201Cfix(desktop): restore mention chip identity icons (#7338)\u201D; \u201Cfix(desktop): bind duplicate mention selections to exact recipients (#7133)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/shared/ui/markdown/MarkdownMention.tsx\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":"desktop/src/shared/ui/markdown/MarkdownMention.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e1d78ddd7754116d27cd1826a428932c7d9bae16d9b3286a6b99579d38563c4"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/messages/lib/mentionCandidates.ts: desktop/src/features/messages/lib/mentionCandidates.ts changed 4 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 11 (its worst body is mentionCandidates.findTeamMemberTarget at line 77), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): npub identity displays for mention, member, and workflow surfaces (#7495)\u201D; \u201Cfix(desktop): bind duplicate mention selections to exact recipients (#7133)\u201D; \u201Cfix(desktop): enforce agent mention authorization at send boundaries (#5681)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/lib/mentionCandidates.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/mentionCandidates.ts"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"bed755304f64ffdfc243b5105e4266a7211ec6f56545b7f5c9c6ced68d8e67db"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/messages/ui/NewMessageResultRow.tsx: desktop/src/features/messages/ui/NewMessageResultRow.tsx changed 4 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 8 (its worst body is NewMessageResultRow.NewMessageResultRow at line 68), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): npub identity displays for mention, member, and workflow surfaces (#7495)\u201D; \u201Cfix(desktop): unify owned-agent cloud provenance markers (#7129)\u201D; \u201Cfix(ui): relabel agent owner attribution from \u0022owned by\u0022 to \u0022managed by\u0022 (#2133)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/NewMessageResultRow.tsx\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":"desktop/src/features/messages/ui/NewMessageResultRow.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"c009397e917ab0e30b5fb8a5d1f3f169d337dec109ef34ebd4147fb4aa1df404"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/messages/lib/agentMentionRevalidation.ts: desktop/src/features/messages/lib/agentMentionRevalidation.ts changed 4 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 6 (its worst body is agentMentionRevalidation.revalidateAgentMentionPubkeys at line 30), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): authorize remote mentions at publication (#7124)\u201D; \u201CFix cross-owner relay agent mentions in owner-only builds (#6338)\u201D; \u201Cfix(desktop): bound remote agent mention authorization (#6224)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/lib/agentMentionRevalidation.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/agentMentionRevalidation.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"4272177446e1800fbe81d76beb0f1d09a5ac86fabda44e2e012688786b400ac0"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/agents/ui/ManagedAgentSessionPanel.tsx: desktop/src/features/agents/ui/ManagedAgentSessionPanel.tsx changed 4 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 14 (its worst body is ManagedAgentSessionPanel.SessionBody at line 208), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): discover authenticated owned relay agents (#7122)\u201D; \u201Cfix(desktop): preserve archived observer history (#1752)\u201D; \u201Cfix(desktop): scope observer feed by channel and add session-boundary dividers (#1634)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/ui/ManagedAgentSessionPanel.tsx\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":"desktop/src/features/agents/ui/ManagedAgentSessionPanel.tsx"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cf72f09e632a869c4bbee0f2c9cef868c2cddafd175974e6282bb67ff0c9704"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src-tauri/src/commands/agent_model_process.rs: desktop/src-tauri/src/commands/agent_model_process.rs changed 4 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 8 (its worst body is buzz_desktop::commands::agent_model_process::run_agent_models_command at line 10), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): use augmented PATH for model discovery subprocess (#2753)\u201D; \u201Cfix(desktop): suppress Windows console flashes and reject WSL bash alias (#2587)\u201D; \u201Cfix(desktop): align onboarding runtime auth (#2229)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/commands/agent_model_process.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":"desktop/src-tauri/src/commands/agent_model_process.rs"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"a21301e8c49cad90b4dcaaf77c5be6798a9acf8dc612abb2afce7dd0eb108eba"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/messages/lib/projectChannelWindow.ts: desktop/src/features/messages/lib/projectChannelWindow.ts changed 4 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 3 (its worst body is projectChannelWindow.refreshChannelWindowMessages at line 26), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): surface channel history load failures (#7013)\u201D; \u201Cfix(desktop): preserve live channel timelines (#5662)\u201D; \u201Cfix(desktop): preserve fresh channel timelines (#5577)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/lib/projectChannelWindow.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/projectChannelWindow.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"981427d28159f62c2bcb53221c1b42f00cbfab60bb0ef07dffb6c0aca978fa87"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/workflows/hooks.ts: desktop/src/features/workflows/hooks.ts changed 4 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 6 (its worst body is hooks.shouldRefreshQueryOnForeground at line 61), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): defer foreground resume work (#5696)\u201D; \u201Cfix(desktop): remove 0.5.9\u002B perf regressions, speed up get_channels (#5599)\u201D; \u201Cfix(desktop): quiesce renderer polling while hidden (#3677) (#5490)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/workflows/hooks.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/hooks.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"e300aee9e5e1de62f1321a3c63f686c03d86deba73755d254176046bcf58c6ad"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/forum/hooks.ts: desktop/src/features/forum/hooks.ts changed 4 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 4 (its worst body is hooks.useDeleteForumReplyMutation at line 140), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): defer foreground resume work (#5696)\u201D; \u201Cfix(desktop): remove 0.5.9\u002B perf regressions, speed up get_channels (#5599)\u201D; \u201Cfix(desktop): quiesce renderer polling while hidden (#3677) (#5490)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/forum/hooks.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/forum/hooks.ts"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca524e6ff2d8d09eaeb0ed785e66b2581c9ec680d2ecd9f21eeb5a742f0b046f"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/local-archive/useObserverArchiveSeed.ts: desktop/src/features/local-archive/useObserverArchiveSeed.ts changed 4 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 3 (its worst body is useObserverArchiveSeed.isReconciledFor at line 50), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(local-archive): default both archive settings to enabled (#4750)\u201D; \u201Ctest(desktop): harden observer archive policy regression coverage (#1994)\u201D; \u201Cfix(desktop): enforce observer archive policy reconciliation on internal builds (#1923)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/local-archive/useObserverArchiveSeed.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/local-archive/useObserverArchiveSeed.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"7526f6d5207ae2bdc791349167531d1391cfb3454732e0bc69b296ee14905391"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/shared/api/useRelayAutoHeal.ts: desktop/src/shared/api/useRelayAutoHeal.ts changed 4 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 5 (its worst body is RelayAutoHealScheduler.onTransition at line 53), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): close reconnect gaps that previously required CMD\u002BR (#4737)\u201D; \u201Cfix(desktop): survive degraded networks with rate-limit-aware relay client (#2197)\u201D; \u201Cfix(relay-reconnect): resilient reconnect with fast-path, escalation, and polling (#1456)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/shared/api/useRelayAutoHeal.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/api/useRelayAutoHeal.ts"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"e65e9ea0d148a3bb80616b5324aa6d14afb0320536af0aed87126e89cc48c276"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src-tauri/src/commands/agent_discovery/managed_node.rs: desktop/src-tauri/src/commands/agent_discovery/managed_node.rs changed 4 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 10 (its worst body is buzz_desktop::commands::agent_discovery::managed_node::probe_node at line 126), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): harden Windows installs against Defender block and orphaned Node (#4382)\u201D; \u201Cfix(node): bump Buzz-supplied Node runtimes past OpenClaw\u0027s \u003E=24.15.0 floor (#3218)\u201D; \u201Cfix(desktop): suppress Windows console flashes and reject WSL bash alias (#2587)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/commands/agent_discovery/managed_node.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":"desktop/src-tauri/src/commands/agent_discovery/managed_node.rs"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"578a60c7f8c3eae41ccc44f30cf5c7683a8c3121c613ad0c9856879fef991e13"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src-tauri/src/commands/agent_auth.rs: desktop/src-tauri/src/commands/agent_auth.rs changed 4 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 10 (its worst body is buzz_desktop::commands::agent_auth::terminal_auth_meta_command at line 300), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): suppress Windows console flashes and reject WSL bash alias (#2587)\u201D; \u201CFix Claude onboarding terminal popup (#2078)\u201D; \u201Cfix(desktop): restore Doctor ACP login discovery (#2017)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/commands/agent_auth.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":"desktop/src-tauri/src/commands/agent_auth.rs"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"b39cde84c4dfd0468c7f94d591f20cf7800a999c6df7967966a06c86cb0ff038"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/agents/lib/friendlyAgentLastError.ts: desktop/src/features/agents/lib/friendlyAgentLastError.ts changed 4 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 11 (its worst body is friendlyAgentLastError.friendlyAgentLastError at line 64), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): surface codex config-parse failures and -32603 internal errors clearly (#1745)\u201D; \u201Cfix(agents): harden structured error-code classification edge cases (#1663)\u201D; \u201Cfix(agents): surface provider errors structurally instead of raw dumps (#1653)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/lib/friendlyAgentLastError.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/lib/friendlyAgentLastError.ts"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"20985d279820f201fd6c6eba4b8abc4be0319d01ffe86d2497c4013036fb41d8"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/shared/api/relayRateLimitGate.ts: desktop/src/shared/api/relayRateLimitGate.ts changed 3 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 8 (its worst body is relayRateLimitGate.activateRateLimit at line 53), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): bound startup request bursts and recover quota refusals (#7790)\u201D; \u201Cfix(desktop): isolate quota backoff and reuse channel discovery rosters (#6998)\u201D; \u201Cfix(relay): reject a frame on its own acknowledgement channel (#6961)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/shared/api/relayRateLimitGate.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/api/relayRateLimitGate.ts"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"523c7bf426bf3782efe839ee59a1b975c22811ae569fa4b8074d8e5bffb20266"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/messages/ui/MessageAgentAddressPrefix.tsx: desktop/src/features/messages/ui/MessageAgentAddressPrefix.tsx changed 3 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 3 (its worst body is MessageAgentAddressPrefix.MessageAgentAddressPrefix at line 43), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): npub identity displays for mention, member, and workflow surfaces (#7495)\u201D; \u201Cfix(desktop): bind duplicate mention selections to exact recipients (#7133)\u201D; \u201Cfix(desktop): unify owned-agent cloud provenance markers (#7129)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/messages/ui/MessageAgentAddressPrefix.tsx\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":"desktop/src/features/messages/ui/MessageAgentAddressPrefix.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e07b9fa576bfb11f82dad972f027f4036bdd7743d20128b6dd5eff5c18112b1"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/agents/lib/pickProfileAgent.ts: desktop/src/features/agents/lib/pickProfileAgent.ts changed 3 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 2 (its worst body is pickProfileAgent.pickProfileAgent at line 17), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): keep explicit agent profiles bound to their exact key (#7131)\u201D; \u201Cfix(desktop): resolve agent profiles through one archive-aware selector (#5706)\u201D; \u201Cfix(desktop): enforce shared agent access across devices (#6086)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/agents/lib/pickProfileAgent.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/lib/pickProfileAgent.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2434899dfa36f39ee73d140ee449f16f74feced8b7f640b12ad4eac04dcad80"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/profile/lib/useCanonicalManagedAgentProfile.ts: desktop/src/features/profile/lib/useCanonicalManagedAgentProfile.ts changed 3 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 5 (its worst body is useCanonicalManagedAgentProfile.useCanonicalManagedAgentProfile at line 43), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): keep explicit agent profiles bound to their exact key (#7131)\u201D; \u201Cfix(desktop): resolve agent profiles through one archive-aware selector (#5706)\u201D; \u201Cfix(desktop): enforce shared agent access across devices (#6086)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/profile/lib/useCanonicalManagedAgentProfile.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/lib/useCanonicalManagedAgentProfile.ts"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ccbbc8b20cfa8bb1703a063657490836224ada50d8bd376140080875e44edd4"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/notifications/lib/feed.ts: desktop/src/features/notifications/lib/feed.ts changed 3 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 7 (its worst body is feed.enrichFeedItemChannel at line 6), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): sender names in notifications \u002B macOS click-through routing (#6427)\u201D; \u201Cfix(desktop): stop DMs from firing duplicate desktop notifications (#2105)\u201D; \u201CBug-bash: mention/code-span, feed titles, autocomplete, edit-mentions, draft routing, and right-click media Download (#2027)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/notifications/lib/feed.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/notifications/lib/feed.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"a785930451cc3c9f0e3cbfe371e813c7ca18592b9b3bec7f891621f9d9cdfdfd"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/channels/ui/EditRespondToDialog.tsx: desktop/src/features/channels/ui/EditRespondToDialog.tsx changed 3 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 13 (its worst body is EditRespondToDialog.EditRespondToDialog at line 21), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): enforce shared agent access across devices (#6086)\u201D; \u201Cfix(desktop): enforce owner-only access in internal builds (#4053)\u201D; \u201Cfix(desktop): explain open agent access (#2561)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/channels/ui/EditRespondToDialog.tsx\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":"desktop/src/features/channels/ui/EditRespondToDialog.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"f18cffd2d90aa3ae9e08edd1df05f99c1c318355eac0517ff8ee4ed92fd27523"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/channel-templates/hooks.ts: desktop/src/features/channel-templates/hooks.ts changed 3 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 1 (its worst body is hooks.useChannelTemplatesQuery at line 32), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): defer foreground resume work (#5696)\u201D; \u201Cfix(desktop): remove 0.5.9\u002B perf regressions, speed up get_channels (#5599)\u201D; \u201Cfix(desktop): quiesce renderer polling while hidden (#3677) (#5490)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/channel-templates/hooks.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channel-templates/hooks.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6512c04f5f2168d7adc30a89ae6b14e51db1d14ef3011d0b384ff4e74fe1d36"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: mobile/lib/shared/relay/relay_socket.dart: mobile/lib/shared/relay/relay_socket.dart changed 3 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 8 (its worst body is RelaySocket._handleOk at line 236), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(mobile): recover stale relay sessions (#4372)\u201D; \u201Cfix(mobile): add mentioned agents to channels (#1696)\u201D; \u201CFix mobile relay reconnect lifecycle (#1772)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- mobile/lib/shared/relay/relay_socket.dart\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":"mobile/lib/shared/relay/relay_socket.dart"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1c70f2a7127525b292dc8951433649c3d6bd30db6aa11ef73545ef007bf64d2"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src-tauri/src/util.rs: desktop/src-tauri/src/util.rs changed 3 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 11 (its worst body is buzz_desktop::util::replace_with_symlink at line 123), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): strip legacy baked team instructions from stored prompts (#3035)\u201D; \u201Cfix(desktop): suppress Windows console flashes and reject WSL bash alias (#2587)\u201D; \u201Cfix(desktop): restrict shared-agent sync to dev data dirs (#1597)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src-tauri/src/util.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/util.rs"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d7d90ce32516479449fc89d6d676cde993695e6c786282c90b717551d1c786d"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: desktop/src/features/settings/SidebarUpdateCard.tsx: desktop/src/features/settings/SidebarUpdateCard.tsx changed 3 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 8 (its worst body is SidebarUpdateCard.SidebarUpdateCompactCard at line 19), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(desktop): sync sidebar update card copy with global installing state (#1827)\u201D; \u201Cfix(desktop): require user action before applying updates (#1820)\u201D; \u201Cfix(desktop): guard Linux .deb installs against auto-updater crash (#1535)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 12:46:43 -07:00\u0027 --until=\u00272026-09-28 12:46:43 -07:00\u0027 --full-history --no-merges -- desktop/src/features/settings/SidebarUpdateCard.tsx\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":"desktop/src/features/settings/SidebarUpdateCard.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"a75fef8dceeb2df53eb8de33ab57972577dae3cba43bdce9b4e97f72add728c8"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #1: If anonymized user #1 becomes unavailable, 79 significant file(s) lose their only recent owner: mobile/lib/features/profile/animated_avatar_capture.dart, mobile/ios/Runner/NativeAttachmentPopover.swift, mobile/lib/shared/huddle/huddle_transport.dart, mobile/lib/features/channels/channel_detail_page/huddle_sheet.dart, mobile/lib/features/profile/profile_avatar_editor.dart, mobile/lib/features/profile/profile_edit_page.dart, mobile/lib/shared/huddle/huddle_media.dart, mobile/ios/Runner/JumpToLatestGlassButton.swift (\u002B71 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"7b7eaa94c1338163f91f93ebbd626f4c1a13001eb1749f9e6b90dc576c523312"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #2: If anonymized user #2 becomes unavailable, 45 significant file(s) lose their only recent owner: crates/buzz-auth/src/nip_fi/verifier/tests.rs, desktop/src-tauri/src/secret_store.rs, desktop/src-tauri/src/managed_agents/custom_harnesses.rs, crates/buzz-cli/src/commands/agents.rs, crates/buzz-agent/src/permission.rs, crates/buzz-relay/src/handlers/report_resolution.rs, crates/buzz-auth/src/nip_fi/verifier.rs, desktop/src-tauri/src/commands/agent_discovery/install_exec.rs (\u002B37 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"adce55bd9f17d154864948f2572b8eade82d57101da275e9bc72f18146e9f517"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #3: If anonymized user #3 becomes unavailable, 43 significant file(s) lose their only recent owner: desktop/src/features/projects/ui/ProjectPullRequestsPanel.tsx, desktop/src-tauri/src/commands/project_git_workflow.rs, desktop/src/features/projects/ui/ProjectPullRequestFilesChangedPanel.tsx, desktop/src/features/projects/ui/ProjectRepositoryActionsPanel.tsx, desktop/src/features/projects/ui/ProjectWorkspaceTabs.tsx, desktop/src/features/projects/ui/ProjectIssuesPanel.tsx, desktop/src-tauri/src/commands/project_git_diff.rs, desktop/src/features/projects/ui/ProjectDetailFeedPanels.tsx (\u002B35 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"53adb6a0c7e19797d865836cbfc865929dfe3162543ae8555bbd569fd8a2f6a0"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #4: If anonymized user #4 becomes unavailable, 21 significant file(s) lose their only recent owner: desktop/src-tauri/src/managed_agents/persona_avatars.rs, crates/buzz-core/src/private_managed_agent.rs, desktop/src/features/terminal/TerminalSubstrate.tsx, desktop/src/features/messages/lib/customEmojiNode.ts, desktop/src/features/channels/channelSnapshot.ts, desktop/src/features/onboarding/ui/LandingBees.tsx, mobile/lib/features/search/search_provider.dart, desktop/src-tauri/src/prevent_sleep.rs (\u002B13 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"1586aaa0a3f2a4a8827226708539dadacecc36246218593fb13517e2865ba4b4"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #5: If anonymized user #5 becomes unavailable, 18 significant file(s) lose their only recent owner: desktop/src/features/messages/ui/useComposerLinkPreviews.tsx, desktop/src/features/messages/ui/ComposerImageEditor.tsx, desktop/src-tauri/src/commands/link_preview_youtube.rs, desktop/src/shared/theme/communityThemeSync.ts, desktop/src/features/messages/lib/linkPreviewPreparationStore.ts, desktop/src/features/workflows/ui/workflowConditionExpression.ts, desktop/src/shared/theme/CommunityThemeController.tsx, desktop/src/features/messages/ui/useAutoPinMentionedAgents.ts (\u002B10 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"35fa18e1996206246a582eb3b5e1ba00d178f72005e9a776bc4b0b8e307bca14"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #6: If anonymized user #6 becomes unavailable, 17 significant file(s) lose their only recent owner: crates/buzz-cli/src/commands/mem.rs, crates/buzz-core/src/git_perms.rs, desktop/src-tauri/src/huddle/tts_playback.rs, desktop/src/features/community-members/useCommunityJoinAlerts.ts, crates/buzz-backend-kubernetes/src/config.rs, desktop/src-tauri/src/huddle/latency_bench.rs, crates/buzz-voice/src/pocket.rs, crates/buzz-pubsub/src/cache_invalidation.rs (\u002B9 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9c677233decf28cd27c401c2fa8576d15ee6503d7166178aa0d79729e80a9000"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #7: If anonymized user #7 becomes unavailable, 8 significant file(s) lose their only recent owner: crates/buzz-sdk/src/broker/tests.rs, crates/buzz-sdk/src/broker/mod.rs, crates/buzz-sdk/src/broker/actions/args.rs, crates/buzz-sdk/src/broker/actions/mod.rs, crates/buzz-sdk/src/broker/actions/outcomes.rs, crates/buzz-sdk/src/broker/client.rs, crates/buzz-sdk/src/broker/wire.rs, crates/buzz-sdk/src/broker/correlate.rs. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"5afdedeaa2eeda876926402e53c8c223c1467efacc20aecd689d931fa10efd79"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #8: If anonymized user #8 becomes unavailable, 6 significant file(s) lose their only recent owner: crates/buzz-push-gateway/src/config.rs, mobile/ios/Runner/PushSnapshotBridge.swift, mobile/lib/shared/push/push_bridge.dart, mobile/lib/shared/push/push_presentation_cache.dart, mobile/ios/NotificationService/NotificationService.swift, mobile/lib/features/channels/channels_page/browse_channels_sheet.dart. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"73663a1fc92337f2ca447ab7b0d05ce526d67e7ca39fd46d8847e3a8a55af740"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #9: If anonymized user #9 becomes unavailable, 4 significant file(s) lose their only recent owner: crates/buzz-db/src/store/replaceable.rs, crates/buzz-db/src/store/community.rs, crates/buzz-db/src/store/reminder.rs, desktop/src/features/profile/lib/userLabelStorage.ts. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"89ad9fddfea42acb4d32b2a45588cccf623322163826c2dbb6c6d5a8897bbeab"}},{"ruleId":"D16","level":"note","message":{"text":"Further sole-owners (lower concentration): 9 other contributor(s) are each the sole owner of a small amount of code below the off-boarding threshold \u2014 folded into the bus-factor score and metrics (252 single-owned of 2091 analysed files in total, counted over production source files of roughly 2,400 bytes or more, excluding vendored, generated and example/demo trees and test files identified by path convention, largest first; 2091 of the 3018 production source files in this repository met that bar). They are anonymized user #10 (2 file(s)), anonymized user #11 (2 file(s)), anonymized user #12 (1 file(s)), anonymized user #13 (1 file(s)), anonymized user #14 (1 file(s)), anonymized user #15 (1 file(s)) (\u002B3 more) \u2014 spread or document their files in the same way, at lower priority than the named off-boarding risks above."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6eac528f2429e724e1a97ed868f79eefbcf1888dab4af9a9e673429369bb5b2f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(phase-4): Replace raw nostr::EventBuilder usage with buzz-sdk builder functions \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/workflows.rs"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"041355bfa9764096fe87c80e92c6951ab067b4d2c835ba16cfd284e4aac1e3db"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(phase-4): Replace raw nostr::EventBuilder usage in cmd_set_presence with buzz-sdk builder \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/users.rs"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e5769f01243aeee5a6521e9c851c943d008246cc24f7b04afe00860b245094a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: /// todo list survives history truncation. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-dev-mcp/src/lib.rs"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"d608bd2576deef41a2fea84491817380706df425282aa00656b67f6b5e863856"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(coverage): \u0060serve\u0060\u0027s shutdown wiring has no automated test. The \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/main.rs"},"region":{"startLine":1562}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d7378d777a44fed058facc6f742eee368936804822ee7508c4dd9cffa84e7aa"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(v2): Add persistent per-pubkey storage quotas. Admission limits below \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/api/media.rs"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"50ee4967e0269b45999615edd707727a9cde755fb6f449967d8d45657583dee3"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: // hack. Postgres FTS over raw JSON content tokenizes through the \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-search/tests/postgres_fts_integration.rs"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0adc724235fec058a73e9b66b8c0625cd235a297c13773efa47cbfcb98923af"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: /// the executor\u0027s approval gate is an explicit TODO \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-test-client/tests/conformance_multitenant.rs"},"region":{"startLine":1865}}}],"partialFingerprints":{"codehealthFindingId/v1":"9804f0aefa40bce032016147f3b87e9d8dad94b400e2d5848b4b22ddc3bd06da"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: /// the executor approval gate is an explicit TODO (WF-08), and"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-test-client/tests/conformance_multitenant.rs"},"region":{"startLine":1933}}}],"partialFingerprints":{"codehealthFindingId/v1":"b02bdb7cdfe514aec68931c7e8cdb6201823d3619e843c58e74c94b1c6e20531"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO (WF-07): emit DM event."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-workflow/src/executor.rs"},"region":{"startLine":657}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0f2fe5ec284c40952508f4ec9bddafc14a4f00569a4495531b4c0f43a57b06a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO (WF-07): update channel topic via DB."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-workflow/src/executor.rs"},"region":{"startLine":663}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6cfcaa7408b8069b37b82a7e61b30d95573083b93782b96c57acf10c8888b59"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO (WF-08): create approval record in DB, emit kind:46010."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-workflow/src/executor.rs"},"region":{"startLine":738}}}],"partialFingerprints":{"codehealthFindingId/v1":"8be1030a6104bc01e6bb41c6494b827928612f6f47d611b0cd242e230fbf0689"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(v2): Stream large video files to the relay instead of buffering in RAM. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/media.rs"},"region":{"startLine":386}}}],"partialFingerprints":{"codehealthFindingId/v1":"97992cf9c9394893c10a6e4128092f383c16d8eda51364419caafd1ed274e579"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: busy/mid-turn deferral would slot in here \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/global_agent_config.rs"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"c96df1b16f5e3777854ed8b181e174f900c04a0980b08ba60d0db1292652c426"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: the three sweeps above each walk the PID table independently. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/restore.rs"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"af32cef8b9b944f806a71e62d64c75fb4a24eec88b698236a18258175b1b2d4d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: replace hardcoded field extraction with schema_walker once goose publishes \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/config_bridge/goose.rs"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"d103d05fcdc896514231143ec106310365ed4041cf3bdf0a1aec5ebb23036ce7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: add a telemetry event here so pathological relay states are \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/projectEnumeration.ts"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"c001f6d10ab2e4da136f3a67bc7fcd445bd8bca8fb18be49ebdfd38ee69c5a18"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: the forum post \u0022Back to posts\u0022 header renders under the fixed top \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/tests/e2e/navigation.spec.ts"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cdec9eb6eb8049e6a12f80898fa65e687b4aae97374d081294ff2ac28d032b5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(presence): once the relay supports a \u0060presence:true\u0060 filter \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/profile/presence_cache_provider.dart"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6e856bfe8879bb0e0dfd1e62a263b27a9cc92bc08b4c3dd3222015372f0589a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Filter by \u0060authors: [relayPubkey]\u0060 once the relay\u0027s own pubkey is \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/features/repos/use-repo-refs.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"d240178b01e589e961dfcd4b931179b66afcee07f121edbf3062a3a0f4f48ab3"}},{"ruleId":"D19","level":"note","message":{"text":"Documentation: no licence statement: No licence statement appears in the document despite being a library crate. Add a LICENSE file and a one-line licence header to the README."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-feature-flags/README.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6745c4b15286596025cf98a7ce982d9b959f9da2d76380fa3b3292de3148f044"}},{"ruleId":"D19","level":"note","message":{"text":"Documentation: written for insiders: The NIP-98 authentication section references \u0060BUZZ_ADMIN_AUTH=nip98\u0060 without explaining what it means for an operator, leaving only the auth-mode configuration present. Add a one-line description of how NIP-98 signing works (event kind, principal model) so new readers can decode it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/admin/README.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c53469932712b68d74a1f6e2d1e5c9869a61c0346c59c9660f965148f786fdb"}},{"ruleId":"D20","level":"note","message":{"text":"No ADRs found: No ADRs found. No recognised ADR directory (\u0060docs/adr/\u0060, \u0060docs/decisions/\u0060, \u0060adr/\u0060, \u0060docs/rfcs/\u0060, an \u0060ADR0001/\u0060 folder, or their siblings) exists anywhere in this tree. What was searched, so you can tell an empty log from a search that missed one: every directory under the tree (build output, dependencies and VCS metadata excepted), for a document that is either any non-index page inside a recognised ADR directory, whatever its name and however deeply nested (\u0060docs/adr/use-postgres.md\u0060, \u0060docs/adr/2024/0001-x.md\u0060); or a file anywhere whose name is ADR-shaped (\u00600001-use-postgres.md\u0060, \u0060adr-012-caching.md\u0060); or, when neither turned anything up, a document carrying the decision-record signature (an \u0022Architecture Decision Record\u0022 heading, or Status / Context / Decision / Consequences as section headings). A decision log that clears none of these \u2014 unnumbered files outside any recognised directory, without those headings \u2014 is not seen by this check and this row is then wrong. If that is your case, say so rather than renaming anything; otherwise, consider recording architectural decisions in \u0060docs/adr/\u0060."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d2bea044ff79d7d275f5a91a6e2f548586178eaf480274c33960ad020c854631"}},{"ruleId":"D22","level":"warning","message":{"text":"Ambiguous distinction between \u0027bearer\u0027 and \u0027bearer_no_browser\u0027. It is unclear if \u0027bearer\u0027 implies a browser-based flow by default or if it is a generic alias. If \u0027bearer\u0027 is the standard method, \u0027bearer_no_browser\u0027 suggests a variant that should perhaps be the default or named more explicitly (e.g., \u0027fetch_silent\u0027).: Rename \u0027bearer\u0027 to \u0027fetch_with_browser\u0027 (or similar) if it triggers UI, or rename \u0027bearer_no_browser\u0027 to \u0027fetch_silent\u0027 and make \u0027bearer\u0027 the generic entry point that delegates based on context. (signatures: buzz_agent.auth.TokenSource.bearer(): Result | buzz_agent.auth.TokenSource.bearer_no_browser(): Result)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"fb2198244b6ec078ead2dc5efb081bfd81e9f14d6186f7d6a2053435b8e11ac4"}},{"ruleId":"D22","level":"warning","message":{"text":"Inconsistent constructor naming and parameter explosion. \u0027new\u0027 takes minimal args, \u0027new_with\u0027 adds an opener, and a third constructor adds timeout. This violates the \u0027new\u0027 convention for primary construction and forces users to guess which constructor to use based on optional-like behavior.: Use a single \u0027new\u0027 constructor with a builder pattern or a single \u0027new\u0027 that accepts a \u0027PkceOAuthTokenSourceConfig\u0027 struct containing optional fields for opener and timeout. (signatures: buzz_agent.auth.PkceOAuthTokenSource.new(cfg: PkceOAuthConfig): Result | buzz_agent.auth.PkceOAuthTokenSource.new_with(cfg: PkceOAuthConfig, opener: AtomicU32): Result | buzz_agent.auth.PkceOAuthTokenSource.new_with_http_timeout(cfg: PkceOAuthConfig, opener: AtomicU32, http_timeout: Duration): Result)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"60b456583570906ac2e5186f6521862c8ac5d4a4a873e39f0270b044c006d107"}},{"ruleId":"D22","level":"warning","message":{"text":"Inconsistent return types for construction. \u0027from_env\u0027 returns \u0027Result\u0027, implying it can fail, while \u0027for_discovery\u0027 returns \u0027Self\u0027 directly, implying it cannot fail. This inconsistency makes error handling patterns unpredictable when constructing Config instances.: Ensure both constructors return \u0027Result\u003CSelf, ConfigError\u003E\u0027 or both return \u0027Self\u0027 (panicking on invalid input if necessary, though Result is preferred). (signatures: buzz_agent.config.Config.from_env(): Result | buzz_agent.config.Config.for_discovery(provider: Provider, api_key: String, base_url: String, databricks_model_filter: DatabricksModelFilter): Self)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f8b6a2cb87f6120cf2ec1cdd65e3936656c7eedd39ba357ccd9024ecf77f21ed"}},{"ruleId":"D22","level":"warning","message":{"text":"Inconsistent naming for version/type identifiers. \u0027code\u0027 is used for error types, \u0027hash_version\u0027 for audit entries, and \u0027schema_version\u0027 for traces. While domains differ, the pattern of using \u0027version\u0027 for numeric identifiers is inconsistent with \u0027code\u0027 for string identifiers in errors. More critically, \u0027AuthError.code()\u0027 returns a string, which is unusual for a \u0027code\u0027 (often numeric), whereas \u0027hash_version\u0027 is numeric. This suggests a lack of unified error/code type.: Define a unified \u0027ErrorCode\u0027 or \u0027ErrorKind\u0027 enum/type across the API surface instead of using raw strings or mixed numeric/string representations for error identification. (signatures: buzz_agent.auth.AuthError.code(): str | buzz_audit.entry.AuditEntry.hash_version: i16 | buzz_conformance.TraceStep.schema_version: u32)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d32187ae416855d5f2cd833337e16ae0de3ffbb2f5704b1ae8933ef1b370a8ad"}},{"ruleId":"D22","level":"warning","message":{"text":"Duplicate method name \u0027estimated_bytes\u0027 on distinct types that likely serve similar purposes (memory estimation). While not strictly an inconsistency in signature, it suggests a missing trait (e.g., \u0027EstimatableSize\u0027) that could unify these behaviors and allow for generic handling of memory pressure.: Introduce a trait \u0027EstimatableSize\u0027 with \u0027estimated_bytes()\u0027 and implement it for both \u0027ToolResultContent\u0027 and \u0027HistoryItem\u0027. (signatures: buzz_agent.types.ToolResultContent.estimated_bytes(): usize | buzz_agent.types.HistoryItem.estimated_bytes(): usize)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"26714282cf0ac1408d125199aa5e1de3fff8a7765a872efb1e30987f34638e6a"}},{"ruleId":"D26","level":"note","message":{"text":"Split crates/buzz-relay: Large at 99k LoC and spread across nine unrelated namespaces (git API, audio, admin bridge, conformance), meeting the size-and-sprawl threshold. Suggested: split into api/git, api/admin, api/bridge, and a dedicated audio namespace"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"316ae24c4dc7fc0ae9ccf71c1fb184c7c2d8fab1e37663f50a0e896ec4f5943b"}},{"ruleId":"D26","level":"note","message":{"text":"Split desktop/src-tauri: A sprawling Tauri desktop project whose namespaces are all UI components (commands, managed_agents, templates) and one split-on-namespace. Suggested: split into commands/personas, commands/teams, commands/discovery, and a dedicated migration namespace"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"46b8e29561f43ba8d3cb5fc002a74eb799418af2e219cfefb2647ffb45cb7bff"}},{"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":"42006f019996aaa77e196c1878955c81e7810517542f7f73f44b7ddf0dd16943"},"properties":{"commitSha":"54638ff4bb5af2d3d3759b44118b43052f814bb1"}},{"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":"5156459d82a1efe5106dc7d6bef5fb978270cc3a898a5242f6b0c09c2dbd511c"},"taxa":[{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"aadc92a8ba929d897e4d43ca98d631da811639bd445e07d20cebb692a3b6a775"},"taxa":[{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c11db9c72f85b4b4fb50c90d143d7999cdfcdeb3499064c95a2f10d10df5ef09"},"taxa":[{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6f2659f285ad0c00c71bfb48b89e47acee2c6be14e46c0b289e51628ca1779ab"},"taxa":[{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3bec5810cad18ab8decc9115fb22dab1fb2cbc82f97a1ac9217a1ea33049f311"},"taxa":[{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5459a86b9e74c79de57ecf716faf3441a3bb69e057f655219fef5bbcceefef1e"},"taxa":[{"id":"CWE-79","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7cf8a78c4a993aecafcb4fe2b18ecb6ff3aced137586a07de2812771fcf18756"},"taxa":[{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1498825690ee691422757d83c6c8726aaf69040fa62a3b6b71a03075f0880320"},"taxa":[{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"85f99189d964cdde824a816d83f2290af0a3f7efe42feb1d6495743a90e33e22"},"taxa":[{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b75b6dde6f513bd6982709b394e4e8e4cfc9bc2bd672350d473d57689a789a42"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"30d54485291f3f82e6ca42fa3901fc4377588923db6b2030d0e1636bb150b0c4"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0e247426ed2b679a7ca6b33592a54dc0c98fd71c6767dde40e0be1e8e20438ee"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8d43e8160c4f6513106d613abb142e90298332e0217d672c7464f8bf0e3fa903"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1bf62d9390db1c7eb25ca5f2f6f6bba4513324eae4836c20ff9ae16e3cc77da6"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"aa8405d0d6203e8c74ad3b2dd31ca0b9e6dbbc803027ab37f92ec7d5f6401815"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"488bcfeab88e83a679eea51e06f7c43fc308622608fc01504517d196de54a09b"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"722c82eb10b4bd7672c5957b7d4aae37d267b0379bee6825531ddaab80836754"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"70960b9e15afb1cb0d9a802a05039f3cae6fc8942752ec9a373720584dae3888"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7e99bdb97af8ceb28d169bbb90b839e0f7a5a60b3adaa37122cc5721dcd71256"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2d5d39a5ea9a40f41ca339478cdca90f420aa610c2dbbca54983682ea5ed2023"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b90eeaf6e27da2ea325a39f2fb002031b012f4a0d19817b37770e761748044cd"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"639fd9b5da6c71bf10435571c315aae92ca44540b98d0d8ebf88b0b443ac219e"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8ed476b6526ad5c916fa528956f85af7771866cdd92ff225dd263953ed792069"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1a17cb9947e492c65a494c94092ae12dd3e8a771d5466b34824eca36ba1e7ce0"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"801f9b06886a14b8011f5f6190c0ac90f55ac367565df1c4023ceb215410c874"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"eab6051ddb64bb402fefbb259c2c85ab890cedd8e7d6d5e7e9faffbb3b07669f"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"740a7d58e96df077d505c792fe844e80869b5f860313c45b557ea0275851b06d"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e85eb18c9356e049bffb1112689f57c88b13fb8904786b1d1bbd0a18c679dd85"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"800bb62d5ae1279b21d7a795b4a52940f48438b04c7f2e04c89c18678ad69f84"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"41d32ca8b118e5b4fceeb7a715b7d61e70690eb2f6d3ff00f8bf775cb26c1430"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9901ecdd24e982c30b4ea17b6ba509db11dd95919a9ec60336033db7de34a435"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a1f3a5af5c6798cc91a658600b160c250f9cd22b93167e6b12ccb62f7e2e8761"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"38700e891f83d592ac4bb1ad26ab3f2f37bcb95b6cee36918d8593ff1d0f83f5"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"213e977f26e4e508c910c4fd2284273eb56710e984154c69278850cfc5799252"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"47c8282ddc21d2c235e25e5105ae9680658e2b7a3ba7c417d87283fef46249c5"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"73cab5c4678ce638f25e318b0e8e08af93874471a0e2a134f26c381cb028210f"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"329ee45bbcfb7ce33032cb8a434d97c37836ca13d3b4169276c5ffd6398f9132"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"cf9b40f84e40f80b2cc338268c231a156cd6a115c56822e0a52b15afda868b7a"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8f7857d1798fc4d86cbe972442b7d2c2501e9c9ba78c064c6af0b6435fca826e"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3fbd3e96c54d146bc22f6811c3faa2a17a5310eee57cdcae813339a53f3946dc"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"90c1f3561a341fed9a1f13325c2e04eb358d9fe0d4a3c0b887599cad478fecf4"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ef13a8c2afa109fcda6e0d025314b524078bdb72a1512f3c16ac6d05df46872a"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"48daf7683e6e5634886981919ad91f1e7dcf8c2b55a27c57c3100281805d7cf6"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a8272b940d533e313e6a21d86922aac90335b81bd052e213f087b4e84bb2fca5"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"65beba66abd721c6834b504193cf7f7922fc2e95e59f7d8c6fb17de6889a0b48"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8cd3c71c19603c000b51f1c31da1ab1c13407693ac8f351d72bc73f73ab4907e"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c6fb236545d301b8829568a17aab344d735586dc79016f582b05736ea3993a06"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"511b52f9b1a4768ac66775ba32f6803b614e5f5d57177a1cbc44f6f1e3cea90c"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4c76d3253c6f491c6d3e6594ec3113eb24d823d3385fd7a6fb51b0f64e8c51a2"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a7a4cce1b15b5fa3e57d89ee1f338160f0a14aac25315032be91da8134d39c1f"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d4af5c099520336043cb767232f861dbb4ff1d85aea32091f4321a3176cde9c5"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c316d4915a165662e50e1f271b2594b94d8d15f696684f1ce6c4de394a542468"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0a50589638679276d0aeb60a9cefd28cead94fc035485d003bf04d9e02ae38a5"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a2487f5269eac9aa12d60a70ee768ba694506d834dcc13908142a517d8be5678"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0359121c44207155bb0258ef4a2fea32236e974790329c5911aa1fec3378de54"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f63ef717625a6cf2c4f56b71b230fa6461ec1d32bdac3170a210bf0235d4f6e3"},"taxa":[{"id":"CWE-939","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5ed384055dc716a282d5e05d367f817795de1f0324f3b20b12b91701c74092f0"},"properties":{"dependency":{"package":"rmcp","version":"1.8.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"13d1f66846050d5ffc185af3e1b7ad95048662afe3c1921594e46722a8768713"},"properties":{"dependency":{"package":"nanoid","version":"3.3.16","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d037f07d43b691e3b7dac32d97da45c81103db8702e12c85fa5d7ae70199a161"},"properties":{"dependency":{"package":"nanoid","version":"3.3.17","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ce9bbfea95fe015374ae86e03b9373fd15c82feee84c4ee070b765207d8d9476"},"properties":{"dependency":{"package":"browserslist","version":"4.28.2","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"56ebbb6338937bd76b379cc75c9950c461ab24efaeb0e95417ea238dddb2bd8c"},"properties":{"dependency":{"package":"@tiptap/core","version":"3.22.5","advisory":"[GHSA redacted]","aliases":["[GHSA redacted]"],"reachability":{"kind":"production","file":"desktop/src/features/messages/lib/codeBlockExtensions.ts","line":1}}}},{"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":"b995e75272b61cf5f3649600c4af60acb108488f8113b0f25a04ec6792e70778"},"properties":{"dependency":{"package":"cmov","version":"0.5.3","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":"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":"1092cdc16bab90e26caa98781415518f2a1a0fec9b43d183894264e01dcc42b6"},"properties":{"dependency":{"package":"event-listener","version":"5.4.1","advisory":"RUSTSEC-2026-0221","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":"a1bed9dc6ee8c20f422e6b754501ea05c489c451fcd53ee8416074700a8292f9"},"properties":{"dependency":{"package":"lru","version":"0.16.4","advisory":"RUSTSEC-2026-0253","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":"99a286cbde1485de8497181703806220034cf280467ceb597376a83901ce6847"},"properties":{"dependency":{"package":"lru","version":"0.18.0","advisory":"RUSTSEC-2026-0253","reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f98a5252cf643899a128d2b6f6d04b7713273d44fa70b088ba81df0a39c759a9"},"properties":{"dependency":{"package":"faster-hex","version":"0.10.0","advisory":"RUSTSEC-2026-0306","reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"998e7d3a60ee0d82ce56de2291d844ee18b9004a70addc96320674fd2b702003"},"properties":{"dependency":{"package":"quick-xml","version":"0.38.4","advisory":"RUSTSEC-2026-0194","aliases":["RUSTSEC-2026-0195"],"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":"bcfb436507870fe5c186b75f7a16742219a6f1ee03051ddd5f2bcc30da25587c"},"properties":{"dependency":{"package":"quick-xml","version":"0.39.4","advisory":"RUSTSEC-2026-0194","aliases":["RUSTSEC-2026-0195"],"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":"d08c4555748d9fbec482eef2c71b5b5cb38552689eb8a013a35199a2db961d6e"},"properties":{"dependency":{"package":"mach","version":"0.1.2","advisory":"RUSTSEC-2020-0168","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":"7e78e6bd699e1b10fb117b3e97dfaaf327ae1354360e1de30558df8cf147a773"},"properties":{"dependency":{"package":"mach","version":"0.3.2","advisory":"RUSTSEC-2020-0168","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":"391dd385dce37c6e76573d4b05c34e0da8d15f97d980ba5180269bb04df26995"},"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":"6b123f24ee3c76da2575442abf4b500172f78b72733a0a7f6e52ea7ab14a8fe2"},"properties":{"dependency":{"package":"unic-char-range","version":"0.9.0","advisory":"RUSTSEC-2025-0075","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":"f87638c08ae88b3d913fba782e1ee3359281a1fa8ba6a8f1099ecec8c02496c2"},"properties":{"dependency":{"package":"unic-common","version":"0.9.0","advisory":"RUSTSEC-2025-0080","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":"be1484827c5d70b9776981ec5ba3c13729ec3c5cc2b4d986e997819bfede14f1"},"properties":{"dependency":{"package":"unic-char-property","version":"0.9.0","advisory":"RUSTSEC-2025-0081","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":"d3151e5dcdf78ef187145d5b7ac8fc0686b47abcabb56e5fa1baaa1c91fdd46d"},"properties":{"dependency":{"package":"unic-ucd-version","version":"0.9.0","advisory":"RUSTSEC-2025-0098","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":"e7f19dcf5d52e7ca1e4387b831df918886da9043b5783d75ca96b8ee89c5e31e"},"properties":{"dependency":{"package":"unic-ucd-ident","version":"0.9.0","advisory":"RUSTSEC-2025-0100","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":"4dacd576c672d281d913d35cccbad18a1643414c146a776af8a528686371243c"},"properties":{"dependency":{"package":"audiopus_sys","version":"0.2.2","advisory":"RUSTSEC-2026-0150","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":"70d7722ede33fc8362848eeea5c04d3580b1fddc891234e18eba2fc017a8bca7"},"properties":{"dependency":{"package":"lru","version":"0.18.1","advisory":"RUSTSEC-2026-0253","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":"75eef380a4e4cbf3b08e4c68cc83830f3b856c36ba4c87b133139ac6404bba38"},"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":"0b341e54c9a8b043e1a118f026b6a2fa12b24a1e25ff239160ea72053f94834d"},"properties":{"dependency":{"package":"h2","version":"0.4.15","advisory":"RUSTSEC-2026-0258","aliases":["[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"09487125899260c9a347a133d56ba80f670aec6faa82b998b470c6c1c83e924a"},"properties":{"dependency":{"package":"rtrb","version":"0.3.4","advisory":"RUSTSEC-2026-0274","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":"b0676b213b7ba02f3dcc6b8f3e786f0fe7f2e53a412c491a3fbaa89b25af55ed"},"properties":{"dependency":{"package":"ringbuf","version":"0.3.3","advisory":"RUSTSEC-2026-0293","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":"b565fc9bda380181b4f59abc3b88c1b1276bbfbe9d4d13fba57d3da65be2575c"},"properties":{"dependency":{"package":"markdown-it","version":"14.1.1","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"00d0eb45c81c70cca167aab54fd64f595fa1925a111085d303735b82c9e824f8"},"properties":{"dependency":{"package":"postcss","version":"8.5.19","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"test-or-tooling","file":"desktop/package.json"}}}},{"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":"16bc49aac72eafef4ac9a880a9755121d0367a6bdf3e48689c49c4d9d8c09a58"},"properties":{"dependency":{"package":"baseline-browser-mapping","version":"2.10.32","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f392b1419f96aa208ac2115d3c34c2f00540ad0c5381e81423f8727e54319f35"},"properties":{"dependency":{"package":"@babel/core","version":"7.29.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D31","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d9dbdf561b7f8e41a0acff443083331e68337e3934a801e3960d92ae1b016119"}},{"ruleId":"D31","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6eda44eb12973f3bd40e0c8b65eb4ce411724070e0517f8cedae5d64b1271f70"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b432433c86970c04d556bb95010a976195bb97e2893e43708e684d8d36bff9d0"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"8b96745ef67193d0a6a8c3841e70f121d14b645c27e414a8b29aecf946062072"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"0fdeeca554792c351f6e943bb32c7bd5f57f5798f241e6290c4d9cffe2836af2"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"1f3de5ef0b48ca1917c9f9f2286bd0eae7c590636bcadbe579e0347bfdcbbb38"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"dad0246d0e1f5a3a5c25b55aeda00a112c29f5f548324f687698bd6e6eba5d17"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"2ee3a31ad2efdb933cde3fa9e14c9792a7d11cdc369a56e098996064e0def1b1"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"6d3ffd70a3c2cde54f69db8a321642325aedf66da36052a84ec020267405b48a"}},{"ruleId":"D31","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":"8bdf979f4b8dd8284ef988b424091d01a92bee009c492b1a85dfb27f01975684"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"31ae759119a5738a45fc6706061a44fbbb0b1465eeff1ddf1f9ae3ddfa67e370"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"bd7219a258ff24c618f88b01d7648fc43aaab2bbc21004013f6cd259179ab43a"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"8ad0fb46e2bf930b0f2dfb40fe66f5a3067a0cb18e6c9e4449c0eeba26442ce3"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"a5d3a544eaca0b1a3986f0680e47a6cddf697f23bde009e55decb675428b553c"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"dede8d0201b6d839f4b9f5617ef18e52300e341c9a966851dab6ce989b6d4ed6"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"1c091e4abba7779afe33f300b950e1720dcd1f98a9628e12b4c6c857d345eaab"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"c9afe3d92035fb469120f6b98c01923f66f3f2314fd2a0fae0180f41da316aae"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"0eb0a3b1ee91e5f909e0714c7bfb0c7d825788fc2414437ae0b98e3c6e91282c"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"926693c94c5dfc4af2ee89189df006894cc5ab3edc02bce79645867b6eacf3a4"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"1eb3d2561dd9e4d4fec191c401d8b417d827b8d6e0fdfdee08a7abfc15be875d"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"1f51a163f26d94ce6b6f473117dde579d091c8cbf9e59810475c94d9fc921120"}},{"ruleId":"D31","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":"eac6fcdee5ee647c33e17bed4c2f47b2c63bb100476fee60caeffce401009321"}},{"ruleId":"D31","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":"1bc10d498a2619d4bcd10f78ccb535f3308276f7f736e09e6360fc2f0ba58a5b"}},{"ruleId":"D31","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":"ae79adb754c1bdb0c117519cbc58500d8653729dbbc564bc4bfdcc36ff9cbac4"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"50c2d542fdc75130574783f335807bdd6a43ad51374e218278545b51cc8d5da0"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: ChannelPane.types.ts \u2194 ChannelScreen.tsx: \u0060desktop/src/features/channels/ui/ChannelPane.types.ts\u0060 and \u0060desktop/src/features/channels/ui/ChannelScreen.tsx\u0060 change together 85% of the time (11 of the 13 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 11 shared commits counted here, the most recent 3 are \u006000e61eaf\u0060 fix(desktop): surface channel history load failures (#7013); \u0060f6e6617a\u0060 fix(desktop): bound thread /query and surface load errors, not false-\u2026; \u00604bf80978\u0060 fix(messages): route edits to the owning composer (#6575) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/ChannelPane.types.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1e019b9ef8041d0e674529410f343cd955e2b2a9f9f6f573273aef7f4c0c40e"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: AppSidebar.tsx \u2192 ChatHeader.tsx, ProfilePopover.tsx, TopbarSearch.tsx, ViewLoadingFallback.tsx: \u0060desktop/src/features/sidebar/ui/AppSidebar.tsx\u0060 changes together with 4 other files \u2014 \u0060desktop/src/features/chat/ui/ChatHeader.tsx\u0060, \u0060desktop/src/features/profile/ui/ProfilePopover.tsx\u0060, \u0060desktop/src/features/search/ui/TopbarSearch.tsx\u0060, \u0060desktop/src/shared/ui/ViewLoadingFallback.tsx\u0060 \u2014 none of which declares a dependency on it: one file is the hub of 4 separate couplings, not 4 unrelated pairs. Read the hub first: if the others each duplicate a part of what it does, the shared concern belongs in ONE unit and extracting it clears every edge at once; if the hub is a registry, dispatcher or barrel that must name each of them, the coupling is structural and the question is whether that list can be discovered instead of enumerated. Fixing the hub is one change; breaking the couplings one pair at a time is 4."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/AppSidebar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e580fc1f0c1c105fe8e1b3d0fc5736f926a80fc64191d64eb66fef553f96d27c"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: e2eBridge.ts \u2192 tests.rs, hooks.ts, SetupStep.tsx: \u0060desktop/src/testing/e2eBridge.ts\u0060 changes together with 3 other files \u2014 \u0060desktop/src-tauri/src/managed_agents/personas/tests.rs\u0060, \u0060desktop/src/features/onboarding/hooks.ts\u0060, \u0060desktop/src/features/onboarding/ui/SetupStep.tsx\u0060 \u2014 none of which declares a dependency on it: one file is the hub of 3 separate couplings, not 3 unrelated pairs. Read the hub first: if the others each duplicate a part of what it does, the shared concern belongs in ONE unit and extracting it clears every edge at once; if the hub is a registry, dispatcher or barrel that must name each of them, the coupling is structural and the question is whether that list can be discovered instead of enumerated. Fixing the hub is one change; breaking the couplings one pair at a time is 3."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/testing/e2eBridge.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"30cc178d55c5cd1c8d1fff4745b0fdae804aa50fbcc8946bef3742c74c77919c"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: MessageRow.tsx \u2192 inbox.ts, InboxMessageRow.tsx, threadPanel.ts, SystemMessageRow.tsx, TimelineMessageList.tsx: \u0060desktop/src/features/messages/ui/MessageRow.tsx\u0060 changes together with 5 other files \u2014 \u0060desktop/src/features/home/lib/inbox.ts\u0060, \u0060desktop/src/features/home/ui/InboxMessageRow.tsx\u0060, \u0060desktop/src/features/messages/lib/threadPanel.ts\u0060, \u0060desktop/src/features/messages/ui/SystemMessageRow.tsx\u0060, \u0060desktop/src/features/messages/ui/TimelineMessageList.tsx\u0060 \u2014 none of which declares a dependency on it: one file is the hub of 5 separate couplings, not 5 unrelated pairs. Read the hub first: if the others each duplicate a part of what it does, the shared concern belongs in ONE unit and extracting it clears every edge at once; if the hub is a registry, dispatcher or barrel that must name each of them, the coupling is structural and the question is whether that list can be discovered instead of enumerated. Fixing the hub is one change; breaking the couplings one pair at a time is 5."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/MessageRow.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d569180d6f6e4c1e015a58f443edc47081ea51849d68cbcfc3074f09125157f5"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: ChannelPane.tsx \u2192 AppShellContext.tsx, ChannelScreen.tsx, useChannelPaneHandlers.ts, threadPanel.ts, TimelineMessageList.tsx, TypingIndicatorRow.tsx: \u0060desktop/src/features/channels/ui/ChannelPane.tsx\u0060 changes together with 6 other files \u2014 \u0060desktop/src/app/AppShellContext.tsx\u0060, \u0060desktop/src/features/channels/ui/ChannelScreen.tsx\u0060, \u0060desktop/src/features/channels/useChannelPaneHandlers.ts\u0060, \u0060desktop/src/features/messages/lib/threadPanel.ts\u0060, \u0060desktop/src/features/messages/ui/TimelineMessageList.tsx\u0060, \u0060desktop/src/features/messages/ui/TypingIndicatorRow.tsx\u0060 \u2014 none of which declares a dependency on it: one file is the hub of 6 separate couplings, not 6 unrelated pairs. Read the hub first: if the others each duplicate a part of what it does, the shared concern belongs in ONE unit and extracting it clears every edge at once; if the hub is a registry, dispatcher or barrel that must name each of them, the coupling is structural and the question is whether that list can be discovered instead of enumerated. Fixing the hub is one change; breaking the couplings one pair at a time is 6."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/ChannelPane.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b11def44545de6094845f5ae25c03ce740627b4e00af050f8e7fa580e6afdf4"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: search_page.dart \u2192 activity_page.dart, channels_page.dart, thread_detail_page.dart: \u0060mobile/lib/features/search/search_page.dart\u0060 changes together with 3 other files \u2014 \u0060mobile/lib/features/activity/activity_page.dart\u0060, \u0060mobile/lib/features/channels/channels_page.dart\u0060, \u0060mobile/lib/features/channels/thread_detail_page.dart\u0060 \u2014 none of which declares a dependency on it: one file is the hub of 3 separate couplings, not 3 unrelated pairs. Read the hub first: if the others each duplicate a part of what it does, the shared concern belongs in ONE unit and extracting it clears every edge at once; if the hub is a registry, dispatcher or barrel that must name each of them, the coupling is structural and the question is whether that list can be discovered instead of enumerated. Fixing the hub is one change; breaking the couplings one pair at a time is 3."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/search/search_page.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b448a09c354a0ccc824405e42587297881f432d63c97a317acd6a7f9cf7fad9"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: ForumComposer.tsx \u2194 MessageComposer.tsx: \u0060desktop/src/features/forum/ui/ForumComposer.tsx\u0060 and \u0060desktop/src/features/messages/ui/MessageComposer.tsx\u0060 change together 69% of the time (11 of the 16 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 11 shared commits counted here, the most recent 3 are \u0060571c1902\u0060 fix(desktop): scope composer autocomplete to focus (#6860); \u0060b4967589\u0060 fix(desktop): resolve exact typed mentions on space (#6862); \u0060bcf353c9\u0060 fix(desktop): enforce agent mention authorization at send boundaries \u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/forum/ui/ForumComposer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"48a7e6332d30fb3c992fa0be179ee8774ceefaf299a883cb1df6644c19fe0cdc"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: events.rs \u2194 tauri.ts: \u0060desktop/src-tauri/src/events.rs\u0060 and \u0060desktop/src/shared/api/tauri.ts\u0060 change together 67% of the time (8 of the 12 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) and are written in DIFFERENT LANGUAGES, so no import can join them and they cannot be co-located into one unit \u2014 they compile and ship as separate artifacts. What binds them is a CONTRACT across that boundary \u2014 an event or message name, a route, a serialised shape \u2014 that each side currently spells out on its own, which is exactly why a change to one drags the other. Declare that contract once where both sides read it (a shared schema, a generated constants file, an interface-definition file) so a change on one side fails the other\u0027s build instead of drifting silently; where the surface is too small to be worth that, name the counterpart in a comment on both sides so the next reader finds it. There is nothing here to merge. You can check this without leaving the row: of the 8 shared commits counted here, the most recent 3 are \u00603e56331e\u0060 fix(delete): make agent-deleted messages disappear from desktop UI im\u2026; \u00607dd5b345\u0060 Add channel visibility \u0026 ephemeral TTL controls to manage sidebar (#911); \u00605d7c7489\u0060 fix(presence): clear on disconnect, fix heartbeat/TTL, drop broken RE\u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/events.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ab46928ef95f9a25d711492d6bce0c7f1adc45f2af171de83d480e1340b3f8a"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: tauriPersonas.ts \u2192 personas.rs, types.rs, AgentDefinitionDialog.tsx: \u0060desktop/src/shared/api/tauriPersonas.ts\u0060 changes together with 3 other files \u2014 \u0060desktop/src-tauri/src/managed_agents/personas.rs\u0060, \u0060desktop/src-tauri/src/managed_agents/types.rs\u0060, \u0060desktop/src/features/agents/ui/AgentDefinitionDialog.tsx\u0060 \u2014 none of which declares a dependency on it: one file is the hub of 3 separate couplings, not 3 unrelated pairs. Read the hub first: if the others each duplicate a part of what it does, the shared concern belongs in ONE unit and extracting it clears every edge at once; if the hub is a registry, dispatcher or barrel that must name each of them, the coupling is structural and the question is whether that list can be discovered instead of enumerated. Fixing the hub is one change; breaking the couplings one pair at a time is 3."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/api/tauriPersonas.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f53cdb3a3435f0e302df4ef79b3fd82773d923e96b7d371461b852769707add"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: AppShell.tsx \u2192 ChannelBrowserDialog.tsx, ChatHeader.tsx, types.ts, ProfilePopover.tsx, TopbarSearch.tsx, SettingsView.tsx, SidebarProfileCard.tsx, kinds.ts, ViewLoadingFallback.tsx: \u0060desktop/src/app/AppShell.tsx\u0060 changes together with 9 other files \u2014 \u0060desktop/src/features/channels/ui/ChannelBrowserDialog.tsx\u0060, \u0060desktop/src/features/chat/ui/ChatHeader.tsx\u0060, \u0060desktop/src/features/messages/types.ts\u0060, \u0060desktop/src/features/profile/ui/ProfilePopover.tsx\u0060, \u0060desktop/src/features/search/ui/TopbarSearch.tsx\u0060, \u0060desktop/src/features/settings/ui/SettingsView.tsx\u0060, \u0060desktop/src/features/sidebar/ui/SidebarProfileCard.tsx\u0060, \u0060desktop/src/shared/constants/kinds.ts\u0060, \u0060desktop/src/shared/ui/ViewLoadingFallback.tsx\u0060 \u2014 none of which declares a dependency on it: one file is the hub of 9 separate couplings, not 9 unrelated pairs. Read the hub first: if the others each duplicate a part of what it does, the shared concern belongs in ONE unit and extracting it clears every edge at once; if the hub is a registry, dispatcher or barrel that must name each of them, the coupling is structural and the question is whether that list can be discovered instead of enumerated. Fixing the hub is one change; breaking the couplings one pair at a time is 9."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/app/AppShell.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e62e59ea26112515eef9fcb6e24bee3fab6c683428d429189d97f3eb048c8753"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: agents.rs \u2194 restore.rs: \u0060desktop/src-tauri/src/commands/agents.rs\u0060 and \u0060desktop/src-tauri/src/managed_agents/restore.rs\u0060 change together 61% of the time (14 of the 23 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 14 shared commits counted here, the most recent 3 are \u0060076081bf\u0060 Rename Bumble agent to Pollen (#5864); \u00601f48860b\u0060 fix(desktop): propagate agent definition edits to instances and remov\u2026; \u006079a05753\u0060 fix(desktop): refresh persona env vars on respawn \u2014 record.env_vars i\u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/agents.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d86e74da352f4065a7f71690c13c7073b615c7899f47e7e9322c4673fc9a292"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: mod.rs \u2194 builders.rs: \u0060crates/buzz-cli/src/commands/mod.rs\u0060 and \u0060crates/buzz-sdk/src/builders.rs\u0060 change together 60% of the time (6 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 6 shared commits counted here, the most recent 3 are \u006047d068e2\u0060 feat(cli): add buzz gifs command group and NIP-30 emoji tags on messa\u2026; \u0060b7bb1512\u0060 feat(projects): add buzz projects CLI commands (NIP-MP kind:30621) (#\u2026; \u00605fef9b72\u0060 Add NIP-34 git pull request CLI support (#1279) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-cli/src/commands/mod.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dd48d199c83405d624a5239dc24cf38eb2c5ef95ddcda15d1ed6b3dd34cd1b6"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: teams.rs \u2194 types.ts: \u0060desktop/src-tauri/src/managed_agents/teams.rs\u0060 and \u0060desktop/src/shared/api/types.ts\u0060 change together 58% of the time (7 of the 12 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) and are written in DIFFERENT LANGUAGES, so no import can join them and they cannot be co-located into one unit \u2014 they compile and ship as separate artifacts. What binds them is a CONTRACT across that boundary \u2014 an event or message name, a route, a serialised shape \u2014 that each side currently spells out on its own, which is exactly why a change to one drags the other. Declare that contract once where both sides read it (a shared schema, a generated constants file, an interface-definition file) so a change on one side fails the other\u0027s build instead of drifting silently; where the surface is too small to be worth that, name the counterpart in a comment on both sides so the next reader finds it. There is nothing here to merge. You can check this without leaving the row: of the 7 shared commits counted here, the most recent 3 are \u0060ba2fdbf6\u0060 refactor(desktop): consolidate packs into teams (#852); \u00609a98e60f\u0060 feat: provider/model selection for personas and runtime-aware env inj\u2026; \u006032347d11\u0060 feat(desktop): per-persona and per-agent env var overrides (#594) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/teams.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b45d38dea9311d35ef86448b390da9817b69f6a597fafbb94d22babbb57242c3"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: DayDivider.tsx \u2194 MessageTimeline.tsx: \u0060desktop/src/features/messages/ui/DayDivider.tsx\u0060 and \u0060desktop/src/features/messages/ui/MessageTimeline.tsx\u0060 change together 58% of the time (7 of the 12 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 7 shared commits counted here, the most recent 3 are \u0060a5bf3c5a\u0060 Refine desktop timeline activity presentation (#4582); \u00608c388479\u0060 Keep channel day dividers sticky (#1420); \u0060047db421\u0060 fix(desktop): single-owner anchored scroll for dynamic loading (#1115) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/DayDivider.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4052a280d7415903461659422de003f3ff484eb27d8fd8bf616da48ef629081"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: MessageComposer.tsx \u2194 MessageComposerToolbar.tsx: \u0060desktop/src/features/messages/ui/MessageComposer.tsx\u0060 and \u0060desktop/src/features/messages/ui/MessageComposerToolbar.tsx\u0060 change together 56% of the time (9 of the 16 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 9 shared commits counted here, the most recent 3 are \u00601aa87bb2\u0060 feat(composer): compose spoiler, annotation, and tooltip controls (#1\u2026; \u0060770266d2\u0060 feat(composer): link editing \u2014 inline popover, modal picker, buzz:// \u2026; \u006005fc69b8\u0060 Video Player Improvements  (#993) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/MessageComposer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"092216ec8bb47c44d19f4672dae570f57ebd71fb9cff3439fef2ebdd9880d2c3"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: activity_page.dart \u2194 thread_detail_page.dart: \u0060mobile/lib/features/activity/activity_page.dart\u0060 and \u0060mobile/lib/features/channels/thread_detail_page.dart\u0060 change together 53% of the time (8 of the 15 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 8 shared commits counted here, the most recent 3 are \u006093114c9c\u0060 Fix mobile Activity thread navigation (#5850); \u006069107dc3\u0060 Polish mobile message threads and composer (#5645); \u006006582ee6\u0060 Render mobile agent mention chips (#3702) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/features/activity/activity_page.dart"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d260f04ef55f6389edc1392c8577cda2d3977200b68e6491b0481f3a8ea5e04"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: HomeView.tsx \u2194 InboxMessageRow.tsx: \u0060desktop/src/features/home/ui/HomeView.tsx\u0060 and \u0060desktop/src/features/home/ui/InboxMessageRow.tsx\u0060 change together 53% of the time (10 of the 19 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 10 shared commits counted here, the most recent 3 are \u0060514195b1\u0060 feat(desktop): add Inbox message delete action (#5779); \u0060eb6a3756\u0060 fix(desktop): enable message editing in Inbox (#2198); \u00607f769b24\u0060 fix(desktop): align inbox layout and draft details (#2143) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/ui/HomeView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ef100e923a6f57655e2425e584aa75aef074aef530bc0a92f6caa69e041a6c1"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: lib.rs \u2194 mod.rs: \u0060crates/buzz-db/src/lib.rs\u0060 and \u0060crates/buzz-relay/src/api/mod.rs\u0060 change together 52% of the time (11 of the 21 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 11 shared commits counted here, the most recent 3 are \u00602693e0db\u0060 Make workflow run history authoritative in Desktop (#5780); \u0060e0f76b0e\u0060 feat(relay): add operator community provisioning (#1657); \u00608bfce097\u0060 feat: social notes MCP \u002B CLI tools (kind:1/kind:3) (#268) (at that commit the files were still \u0060crates/sprout-db/src/lib.rs\u0060 and \u0060crates/sprout-relay/src/api/mod.rs\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/lib.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e940668e7906edc1ba227c5667c399ee1525e41476b38651dd9fa0679775aaf"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: InboxDetailPane.tsx \u2194 InboxListPane.tsx: \u0060desktop/src/features/home/ui/InboxDetailPane.tsx\u0060 and \u0060desktop/src/features/home/ui/InboxListPane.tsx\u0060 change together 52% of the time (11 of the 21 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 11 shared commits counted here, the most recent 3 are \u00604d77175c\u0060 fix(client): resurface hidden DMs from live activity (#6885); \u006017d2147e\u0060 Fix video comment effect wrapping (#5748); \u00607f769b24\u0060 fix(desktop): align inbox layout and draft details (#2143) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/ui/InboxDetailPane.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"55f9c5cf5bb1295bc3c56e86c39806f2e098a5956866c37c89efc9873265c82d"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: AgentSessionThreadPanel.tsx \u2194 UserProfilePanel.tsx: \u0060desktop/src/features/channels/ui/AgentSessionThreadPanel.tsx\u0060 and \u0060desktop/src/features/profile/ui/UserProfilePanel.tsx\u0060 change together 52% of the time (12 of the 23 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 12 shared commits counted here, the most recent 3 are \u0060fd5d04de\u0060 fix(desktop): scope observer feed by channel and add session-boundary\u2026; \u00601f5ba5bb\u0060 fix(desktop): sync derived active-turn liveness in channel activity p\u2026; \u0060360d2e54\u0060 Fix channel header shared blur layering (#1336) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/AgentSessionThreadPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8afcae45a7a3d2ed190f0c94148f0db1db2b914be61a93263b85b1d058f09d60"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: lib.rs \u2194 router.rs: \u0060crates/buzz-db/src/lib.rs\u0060 and \u0060crates/buzz-relay/src/router.rs\u0060 change together 51% of the time (18 of the 35 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 18 shared commits counted here, the most recent 3 are \u006015d44dcc\u0060 Add owner deletion admission control plane (#7818); \u0060c4c86006\u0060 feat(relay): deliver pubkey mentions to relay companions (#7793); \u0060beb76406\u0060 feat(relay): add detailed readiness metrics (#7149) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/lib.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f53bfd117d81a4cb190087f64793cb224f31265c5cb2d42938777459fd496388"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: MessageThreadPanel.tsx \u2194 TimelineMessageList.tsx: \u0060desktop/src/features/messages/ui/MessageThreadPanel.tsx\u0060 and \u0060desktop/src/features/messages/ui/TimelineMessageList.tsx\u0060 change together 50% of the time (21 of the 42 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 21 shared commits counted here, the most recent 3 are \u00608e81afa4\u0060 fix(desktop): keep thread-open affordance in archived channels (#4012); \u0060f48f3f05\u0060 Fix video reviews in thread replies (#3719); \u0060095f3c72\u0060 fix(desktop): centralize known-agent trust set in useKnownAgentPubkey\u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/MessageThreadPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"61997eb33125090fe925f15b146dc98e7d94efcf8c393e7827cc7b43a1e0ed05"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: formatTimelineMessages.ts \u2194 MessageTimeline.tsx: \u0060desktop/src/features/messages/lib/formatTimelineMessages.ts\u0060 and \u0060desktop/src/features/messages/ui/MessageTimeline.tsx\u0060 change together 50% of the time (15 of the 30 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 15 shared commits counted here, the most recent 3 are \u0060463db6de\u0060 feat(desktop): show agent owners in messages (#2080); \u00606cca7599\u0060 desktop: fix scrollback paging and visible history depth (#1153); \u0060047db421\u0060 fix(desktop): single-owner anchored scroll for dynamic loading (#1115) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/formatTimelineMessages.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fc6d94230e4441b503d15be0b82318ce3c995bf9a379ff788cc6dc4ee2ab1e4"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: types.ts \u2194 tauri.ts: \u0060desktop/src/features/messages/types.ts\u0060 and \u0060desktop/src/shared/api/tauri.ts\u0060 change together 50% of the time (8 of the 16 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 8 shared commits counted here, the most recent 3 are \u00603d61fd60\u0060 feat(desktop): add message editing support (#182); \u0060fa939ec1\u0060 Polish chat replies and managed agent creation (#81); \u0060d9f81322\u0060 Add end-to-end emoji reactions (#57) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/types.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"32e54bcad53206cb8671d3da1b21cf8c98016f36fffc0172f19aaf7b805700c6"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: auth.rs \u2194 event.rs: \u0060crates/buzz-relay/src/handlers/auth.rs\u0060 and \u0060crates/buzz-relay/src/handlers/event.rs\u0060 change together 50% of the time (6 of the 12 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 6 shared commits counted here, the most recent 3 are \u006089120891\u0060 Add authenticated WebSocket recovery telemetry (#7546); \u0060b9f54c43\u0060 relay: add author_type label to buzz_events_stored_total (#2243); \u0060d52dedb0\u0060 Scope relay runtime state by community (#1658) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-relay/src/handlers/auth.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4ee7c0f0ac59a480c15cbfb613bd46fab14ac7803c520f1e54e78ed23c654a8"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: hooks.ts \u2194 OnboardingFlow.tsx: \u0060desktop/src/features/onboarding/hooks.ts\u0060 and \u0060desktop/src/features/onboarding/ui/OnboardingFlow.tsx\u0060 change together 50% of the time (6 of the 12 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 6 shared commits counted here, the most recent 3 are \u00608688c041\u0060 Rework first-launch community onboarding (#1936); \u00605bb61929\u0060 fix(desktop): remediate all onboarding dead paths (D1-D7) (#1856); \u0060e4a0824c\u0060 fix(onboarding): skip onboarding when relay already has a profile (#973) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/hooks.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7a5c849ec6fcf72537acc4014e9732965069324aa6303dc9c8b7f8a24a08e28"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: AgentSessionTranscriptList.tsx \u2194 agentSessionTranscript.ts: \u0060desktop/src/features/agents/ui/AgentSessionTranscriptList.tsx\u0060 and \u0060desktop/src/features/agents/ui/agentSessionTranscript.ts\u0060 change together 50% of the time (6 of the 12 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 6 shared commits counted here, the most recent 3 are \u00601df4a4e7\u0060 fix(observer): align scroll-anchor ids with transcript display-block \u2026; \u006084ec63aa\u0060 fix(desktop): separate system prompt from turn context (#1754); \u0060426f0448\u0060 feat(agents): group activity tool bursts (#1571) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentSessionTranscriptList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"57f3c956d918962c9fdcb0fb3cb47ff0f06b965dd2414a1d06c15d994e805bef"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: readStateManager.ts \u2194 useUnreadChannels.ts: \u0060desktop/src/features/channels/readState/readStateManager.ts\u0060 and \u0060desktop/src/features/channels/useUnreadChannels.ts\u0060 change together 50% of the time (6 of the 12 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 6 shared commits counted here, the most recent 3 are \u0060733c766e\u0060 fix(desktop): clear unread projections from message read markers (#1242); \u00605268fac2\u0060 Fix monotonic read-state merges (#884); \u0060269b35e8\u0060 fix(mobile\u002Bdesktop): cross-device read state sync \u002B diagnostic loggin\u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/readState/readStateManager.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbdae05485f63758a250f9785d5f7e94a72d9131d445005dd29bbfcb39eb2b93"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: AgentSessionTranscriptList.tsx \u2194 AgentSessionThreadPanel.tsx: \u0060desktop/src/features/agents/ui/AgentSessionTranscriptList.tsx\u0060 and \u0060desktop/src/features/channels/ui/AgentSessionThreadPanel.tsx\u0060 change together 50% of the time (6 of the 12 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 6 shared commits counted here, the most recent 3 are \u00601df4a4e7\u0060 fix(observer): align scroll-anchor ids with transcript display-block \u2026; \u006051234bd8\u0060 fix(desktop): preserve archived observer history (#1752); \u0060fd5d04de\u0060 fix(desktop): scope observer feed by channel and add session-boundary\u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentSessionTranscriptList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe74717cd6f970b7146521d71333a454f1e25858495d1e302dfa1e65ccdb1129"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: MessageThreadPanel.tsx \u2194 ViewLoadingFallback.tsx: \u0060desktop/src/features/messages/ui/MessageThreadPanel.tsx\u0060 and \u0060desktop/src/shared/ui/ViewLoadingFallback.tsx\u0060 change together 50% of the time (5 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 5 shared commits counted here, the most recent 3 are \u006009254649\u0060 Polish desktop navigation chrome (#1238); \u00606b5cf325\u0060 Update navigation header height (#1212); \u0060c30d7274\u0060 Refine app loading skeletons (#1001) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/MessageThreadPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a8d39834b2e6712e1629010f959f956392953e379fb76bb0ba3ff786ede3b1c"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: AddTeamToChannelDialog.tsx \u2194 AgentDefinitionDialog.tsx: \u0060desktop/src/features/agents/ui/AddTeamToChannelDialog.tsx\u0060 and \u0060desktop/src/features/agents/ui/AgentDefinitionDialog.tsx\u0060 change together 50% of the time (5 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 5 shared commits counted here, the most recent 3 are \u0060c19e0ce2\u0060 Add preferred runtime onboarding (#2040); \u0060f3319dd1\u0060 fix(desktop): correct provider and model handling in agent config dia\u2026; \u00604269fd27\u0060 Show all ACP runtimes with install status and one-click install (#724) (at that commit the file was still \u0060desktop/src/features/agents/ui/PersonaDialog.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AddTeamToChannelDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5eeac06872970e6c3bc6bfb780bf20892a46e6ca430caee179666f133d29cf6"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: ChatHeader.tsx \u2194 ViewLoadingFallback.tsx: \u0060desktop/src/features/chat/ui/ChatHeader.tsx\u0060 and \u0060desktop/src/shared/ui/ViewLoadingFallback.tsx\u0060 change together 50% of the time (5 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 5 shared commits counted here, the most recent 3 are \u006009254649\u0060 Polish desktop navigation chrome (#1238); \u00606b5cf325\u0060 Update navigation header height (#1212); \u00609e76a08a\u0060 fix(desktop): refine header scaling and shadow (#573) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/chat/ui/ChatHeader.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2f42b57aab5dff0bccf33a1b574818184927c0fb18e8b3e08dfff8781cea647"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: lib.rs \u2194 deep-link.ts: \u0060desktop/src-tauri/src/lib.rs\u0060 and \u0060desktop/src/shared/deep-link.ts\u0060 change together 50% of the time (5 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) and are written in DIFFERENT LANGUAGES, so no import can join them and they cannot be co-located into one unit \u2014 they compile and ship as separate artifacts. What binds them is a CONTRACT across that boundary \u2014 an event or message name, a route, a serialised shape \u2014 that each side currently spells out on its own, which is exactly why a change to one drags the other. Declare that contract once where both sides read it (a shared schema, a generated constants file, an interface-definition file) so a change on one side fails the other\u0027s build instead of drifting silently; where the surface is too small to be worth that, name the counterpart in a comment on both sides so the next reader finds it. There is nothing here to merge. You can check this without leaving the row: of the 5 shared commits counted here, the most recent 3 are \u00608688c041\u0060 Rework first-launch community onboarding (#1936); \u0060cecd0314\u0060 feat: add deeplink nostr identity binding flow (#1648); \u0060c5a54dcc\u0060 Rename web app to Buzz (#959) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/lib.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9449cd037d988e3581b12c85df783c8a89c9f1767365a90588882d4b510cd81"}},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0752d0df7434000fcabf1048e2de30a7a1a8b982b3db9a19898c4dec199856b4"}},{"ruleId":"D41","level":"note","message":{"text":"No AppArmor/SELinux confinement: Workloads declare no AppArmor or SELinux profile. A mandatory-access-control profile confines what a compromised container can touch on the host, complementing seccomp\u0027s syscall filter."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e83fbc31033373d6c51983ed230eb4ba61f7775ed02afb30f5fc1840bde01d4f"}},{"ruleId":"D44","level":"warning","message":{"text":"End-of-life runtime: Rust 1.95: rust-toolchain.toml declares Rust 1.95 as this project\u0027s toolchain file, and Rust 1.95, superseded by 1.96 on 2026-05-28 (the Rust project patches only the current stable). An unsupported runtime receives no security patches, so every vulnerability disclosed in it since 2026-05-28 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":[],"partialFingerprints":{"codehealthFindingId/v1":"dde701f9c40b0b8cb202babf3f8d8da48dda44162595030f1b0a8f7d57710684"}},{"ruleId":"AC1","level":"warning","message":{"text":"\u003Cvideo\u003E without a captions track: Video with no captions \u003Ctrack\u003E offers no captions. This player\u0027s source is set at runtime, so there is no caption file to author here: give the player a way to carry captions \u2014 accept a track/captions URL alongside the media and render a \u003Ctrack kind=\u0022captions\u0022\u003E when one is supplied \u2014 and capture that asset wherever the media enters the product (upload, import or generation)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/ComposerAttachments.tsx"},"region":{"startLine":432}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e85e05e5cc903595874361d197c9f8f62c77aeab5e7c7ce05d5a8da413df6f4"}},{"ruleId":"AC1","level":"warning","message":{"text":"\u003Ccanvas\u003E without a text alternative: A \u003Ccanvas\u003E with no aria-label/title and no inner fallback content can\u0027t be described by assistive tech. Add a name or fallback content."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/AnimatedAvatarCapture.tsx"},"region":{"startLine":768}}}],"partialFingerprints":{"codehealthFindingId/v1":"87f37c7f9e389fbd91c951c956ad02a58cc50d908558513e6c938300c4a32c80"}},{"ruleId":"AC1","level":"warning","message":{"text":"\u003Ccanvas\u003E without a text alternative: A \u003Ccanvas\u003E with no aria-label/title and no inner fallback content can\u0027t be described by assistive tech. Add a name or fallback content."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/terminal/TerminalSubstrate.tsx"},"region":{"startLine":681}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c9a06437d915ae5e1ffa43738b7bae697bbd6eae31df863a9824ad273759586"}},{"ruleId":"AC1","level":"warning","message":{"text":"\u003Ccanvas\u003E without a text alternative: A \u003Ccanvas\u003E with no aria-label/title and no inner fallback content can\u0027t be described by assistive tech. Add a name or fallback content."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/terminal/TerminalSubstrate.tsx"},"region":{"startLine":759}}}],"partialFingerprints":{"codehealthFindingId/v1":"cadef420f32e34ac02f24aa29134afab5b27f07721bc9b6de57b9f15cc310785"}},{"ruleId":"AC1","level":"warning","message":{"text":"\u003Ccanvas\u003E without a text alternative: A \u003Ccanvas\u003E with no aria-label/title and no inner fallback content can\u0027t be described by assistive tech. Add a name or fallback content."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/EmojiBurstProvider.tsx"},"region":{"startLine":720}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b23b79af0818927ab8866ae082419e60f40c072232211fa83ce36a3c9966373"}},{"ruleId":"AC1","level":"warning","message":{"text":"\u003Ccanvas\u003E without a text alternative: A \u003Ccanvas\u003E with no aria-label/title and no inner fallback content can\u0027t be described by assistive tech. Add a name or fallback content."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/SpoilerParticles.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f7ab23badde7fc028e123ac7f00c2cd993eb300b5c613eb963bc1c475a7b4e7"}},{"ruleId":"AC1","level":"warning","message":{"text":"\u003Cvideo\u003E without a captions track: Video with no captions \u003Ctrack\u003E offers no captions. This player\u0027s source is set at runtime, so there is no caption file to author here: give the player a way to carry captions \u2014 accept a track/captions URL alongside the media and render a \u003Ctrack kind=\u0022captions\u0022\u003E when one is supplied \u2014 and capture that asset wherever the media enters the product (upload, import or generation)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/VideoPlayer.tsx"},"region":{"startLine":992}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3f0a12e6c0121feccd5a5fa19e9d1ca5614da1e92977c3fd3382fa186e97929"}},{"ruleId":"AC1","level":"warning","message":{"text":"\u003Cvideo\u003E without a captions track: Video with no captions \u003Ctrack\u003E offers no captions. This player\u0027s source is set at runtime, so there is no caption file to author here: give the player a way to carry captions \u2014 accept a track/captions URL alongside the media and render a \u003Ctrack kind=\u0022captions\u0022\u003E when one is supplied \u2014 and capture that asset wherever the media enters the product (upload, import or generation)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/VideoPlayer.tsx"},"region":{"startLine":1698}}}],"partialFingerprints":{"codehealthFindingId/v1":"90976b2c03c8a56aba173cb13a002befd542aaf4879cb3db186544d232dc6b3e"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel htmlFor\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/AdminConsoleReportsTab.tsx"},"region":{"startLine":488}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea4f7769e6550584d80d72154f6dedfca1688015fc2582eebfd944fdde3c80a4"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel htmlFor\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/AdminConsoleReportsTab.tsx"},"region":{"startLine":608}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a9f1e1115317fb9aba8ae01fcd98cab6e89aba73233991ad3a81ddfbf4abbe6"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel htmlFor\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/AdminConsoleStaffingTab.tsx"},"region":{"startLine":657}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b037367798e749c1503c3bb487c284e8188957230afad7647d61922aedc1057"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cselect\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel htmlFor\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/AdminConsoleStaffingTab.tsx"},"region":{"startLine":666}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a2c15de96e50d6c4cb841a9069e19947f571bf72eded315dc9d0c93dd6fffd6"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CTextarea\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentCardMintDialog.tsx"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"33cce426a0b40da6efc2cfe99e3f33fd056956d08ca1f1d142597d030ac4cae7"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel htmlFor\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentCreationPreview.tsx"},"region":{"startLine":499}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd59d881e9ca2a8f05dd752282f8a2f2b7a4f61d54ed190a24d60fd965c9e26a"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel htmlFor\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentSessionToolItem/TodoToolSummary.tsx"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"96ad625a52847827905bf2cff6d236d29c9fe165cf4a4ff195ab9efa39235c9e"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CTextarea\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/RespondToField.tsx"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"833db0f777c74a583a91fa49c601ed6cc6b984c7c84fa3020f9715e8c2375e42"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cselect\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel htmlFor\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/agentConfigControls.tsx"},"region":{"startLine":547}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d49e989cdb533bd81c0e06239f1081d76bbd3203da21a750d1cbeb1b6b2132c"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cselect\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel htmlFor\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/agentConfigControls.tsx"},"region":{"startLine":641}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c61fab34b9aee659ccfe1ca9d5eb63daaa4aab56009ce5521adb1e55514cf33"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cbutton\u003E with no accessible text: A button with no text and no aria-label has no accessible name. Add visible text or an aria-label (an icon-only button still needs one)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/MembersSidebarAgentControls.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"acea5e92f3ad144c0c6e43dd675df4fb185b04307af15c92dee20e1537c1b48b"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cbutton\u003E with no accessible text: A button with no text and no aria-label has no accessible name. Add visible text or an aria-label (an icon-only button still needs one)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/MembersSidebarMemberCard.tsx"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"a18e74c99d19f792bdcca5be84945f639e7af64fd8bdc0bb806e0cf334ef4362"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel htmlFor\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/community-members/ui/CommunityMembersSettingsCard.tsx"},"region":{"startLine":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8fa29617a6db3c01fba7a0d8c8889434667c1afb573d8ddd3e981c504edf2d2"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cbutton\u003E with no accessible text: A button with no text and no aria-label has no accessible name. Add visible text or an aria-label (an icon-only button still needs one)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/forum/ui/DeleteActionMenu.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"72ebbac64b11ff34286ce0a85dbe905e938aeddaf3f198a74f21a9e11fcbfc76"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003Cfieldset\u003E without a \u003Clegend\u003E: A fieldset groups related controls but has no \u003Clegend\u003E to name the group. Add a \u003Clegend\u003E as its first child \u2014 or, if the group already has a visible caption beside it (or the fieldset is there only to disable its subtree and carries no group box), point aria-labelledby at that caption\u0027s id instead, which names the group without rendering a second one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/forum/ui/ForumComposer.tsx"},"region":{"startLine":681}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4857bd95526fca2bd3c50ec3e7bc22b2747d691445eef9c8ef24c6cb83d0d0c"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel htmlFor\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/BackupTestFlow.tsx"},"region":{"startLine":530}}}],"partialFingerprints":{"codehealthFindingId/v1":"c16383d3550bce1553cf63d330d3c60d9203fdeff256e9a2b446c6f81a1ccc76"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003Cfieldset\u003E without a \u003Clegend\u003E: A fieldset groups related controls but has no \u003Clegend\u003E to name the group. Add a \u003Clegend\u003E as its first child \u2014 or, if the group already has a visible caption beside it (or the fieldset is there only to disable its subtree and carries no group box), point aria-labelledby at that caption\u0027s id instead, which names the group without rendering a second one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/DefaultConfigStep.tsx"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ca9c2dfc41b9d21b821d0c30cd2b1a71b49eddb5fcc75dc9f6ac033f88971a9"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel htmlFor\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/NostrKeyImportForm.tsx"},"region":{"startLine":415}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd635961659d638ccfc08594272d91552c7d45256ba51a24b80f760154abc910"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003Cfieldset\u003E without a \u003Clegend\u003E: A fieldset groups related controls but has no \u003Clegend\u003E to name the group. Add a \u003Clegend\u003E as its first child \u2014 or, if the group already has a visible caption beside it (or the fieldset is there only to disable its subtree and carries no group box), point aria-labelledby at that caption\u0027s id instead, which names the group without rendering a second one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/NostrKeyImportForm.tsx"},"region":{"startLine":454}}}],"partialFingerprints":{"codehealthFindingId/v1":"0778304db5b99722cec5a3f4ba359bdd44f903632348696550ceb72d93d85b5d"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel htmlFor\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/ProfileAvatarEditor.tsx"},"region":{"startLine":725}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac9f0d6f3d32da0b6be7e3ced592b0835fd1d0f42767508d42608ddd9f4e015f"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel htmlFor\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/BackupTestFlow.tsx"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"41cd0268bbaa07268f8d72ae1c0e738ecefad934d69bb411794bcf7e009e54e4"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cselect\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel htmlFor\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/ChannelTemplatesSettingsCard.tsx"},"region":{"startLine":776}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac502af8d3ea189a60b4e9a9da864008f35c102dc52ff2f275fcd4de18eb1022"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CTextarea\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/SendFeedbackDialog.tsx"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a62bb6cb6b5faeeff00d946d206d5aab4e1482335ae3506114bb5020d8d14d6"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel htmlFor\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/user-status/ui/SetStatusDialog.tsx"},"region":{"startLine":407}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd168bdf509a66b07bec8d5dabd52301833a90d4cfd7eb3457e71a2e4503f873"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cselect\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel htmlFor\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/workflowFormPrimitives.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"f16b02bb06eb0ccfb8bf2d14e698dd81a31bf88aeaa877094c93d503f57209ee"}},{"ruleId":"AC2","level":"error","message":{"text":"Custom control with no accessible name on \u003Cvideo\u003E: This \u003Cvideo\u003E carries a click handler, which makes it a control, but it has no text, aria-label or labelled child (the icon-only case), so assistive tech has no name to announce for it. Note that switching it to \u003Cbutton type=\u0022button\u0022\u003E \u2014 the right fix for its keyboard operability \u2014 does not give it a name either: an icon-only button still needs one. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/VideoPlayer.tsx"},"region":{"startLine":992}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a02a45a1061c7907e1302008925effe7b6566f195379db8825f16d868490f52"}},{"ruleId":"AC2","level":"error","message":{"text":"Custom control with no accessible name on \u003Cvideo\u003E: This \u003Cvideo\u003E carries a click handler, which makes it a control, but it has no text, aria-label or labelled child (the icon-only case), so assistive tech has no name to announce for it. Note that switching it to \u003Cbutton type=\u0022button\u0022\u003E \u2014 the right fix for its keyboard operability \u2014 does not give it a name either: an icon-only button still needs one. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/VideoPlayer.tsx"},"region":{"startLine":1698}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a0a9a022f083e0cd8ec86c77417584ac28aafa4f376e12391f209758577ef28"}},{"ruleId":"AC3","level":"error","message":{"text":"Document \u003Ctitle\u003E is empty: An empty \u003Ctitle\u003E gives no page name in the tab, history or screen-reader page list. Put descriptive text in the \u003Ctitle\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/index.html"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"deff01c15f15b4e5a3d3e7774898a3f2192464700df628e3773c769e14b78d61"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cimg\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0} \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentSessionToolItem/ViewImageToolPreview.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a732fc287a63f7c095a09263daa6450b0a934204f77d5ae8588773aca7b2eca"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0} \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/communities/ui/CommunityChangeOverlay.tsx"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"db119f66143dff77868570f8ed3aa64e3252d3f4fa36c3951c724214e1adbe66"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0} \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/ui/InboxListPane.tsx"},"region":{"startLine":373}}}],"partialFingerprints":{"codehealthFindingId/v1":"bca842daadc40b89ee304aeab72bf1320e9f7e1ec1063276b5fd774bb1bdf6bd"}},{"ruleId":"AC4","level":"error","message":{"text":"Clickable element isn\u0027t keyboard-operable: The repo\u0027s own CSS styles .buzz-avatar-framing-slider-hashmark with \u0060cursor: pointer\u0060, so this \u003Cspan\u003E is a control \u2014 but it has no role, no tabIndex={0} and no key handler, so it can only be reached with a mouse. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0} \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/AnimatedAvatarControls.tsx"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"20a3dfedad503ec59bc2d939945b6283fa66a60230112f46224ff494719d96c2"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0} \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/ui/SidebarProfileCard.tsx"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"6803acd238824219a5287d5ff0138ed2fb2c261b115360c414eb28d60c3c3609"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0} \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/OverlayPanelBackdrop.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f5b2f87cd6363a2a385d193520f20afd9bf011271d129fa8f6c45de9746c7dd"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cvideo\u003E: A click handler on a plain element with no role and no tabindex: even where another element\u0027s key handler can reach it, assistive tech can neither focus it nor announce what it is. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0}."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/VideoPlayer.tsx"},"region":{"startLine":992}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a24af4be6146c9800430dc20fa8e6ad1ba590f69d0bb0e5bacb9b69a8b836e6"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cvideo\u003E: A click handler on a plain element with no role and no tabindex: even where another element\u0027s key handler can reach it, assistive tech can neither focus it nor announce what it is. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0}."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/VideoPlayer.tsx"},"region":{"startLine":1698}}}],"partialFingerprints":{"codehealthFindingId/v1":"72224e495647528f20f3ed1b35142946aa4442ed80dbb28d1a00e1ddca9aef6f"}},{"ruleId":"AC4","level":"error","message":{"text":"Clickable element isn\u0027t keyboard-operable: The repo\u0027s own CSS styles .buzz-spoiler with \u0060cursor: pointer\u0060, so this \u003Cdiv\u003E is a control \u2014 but it has no role, no tabIndex={0} and no key handler, so it can only be reached with a mouse. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0} \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/markdown/SpoilerInline.tsx"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"e05ef40f2a7ba9b91676482bfa6639c375f1cbcae6c357ca9bb2633b9c7f6b5d"}},{"ruleId":"AC4","level":"error","message":{"text":"Clickable element isn\u0027t keyboard-operable: The repo\u0027s own CSS styles .buzz-spoiler with \u0060cursor: pointer\u0060, so this \u003Cspan\u003E is a control \u2014 but it has no role, no tabIndex={0} and no key handler, so it can only be reached with a mouse. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0} \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/markdown/SpoilerInline.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"0aa8ac0eec14373118817250e8e3c02cba1e44767f712d0bfe43e81b0b00317e"}},{"ruleId":"AC7","level":"warning","message":{"text":"Accessibility enforcement below the top rung: No accessibility enforcement found \u2014 your Biome config enables no a11y rules and there\u0027s no axe/pa11y/Lighthouse in tests or CI. Start by turning on Biome\u0027s own a11y rule group to catch issues at author time. What was searched, so you can tell an absence from a miss: the 739 markup file(s) this pass actually assessed, the linter configuration checked in beside them, and this repository\u0027s test and CI files \u2014 matched by name against the accessibility checkers this dimension carries. An audit run outside the repository, a hosted scanner, or a check whose name is not one of those, is not seen here."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d46019b86eff5ddad9db289e6802ac158899e980df54c34f67722442787ead62"}},{"ruleId":"AX9","level":"error","message":{"text":"Query writes persistent state on the read path: CommunityStorage.loadAll: \u0060CommunityStorage.loadAll\u0060 is a read-named query yet it performs a durable write on the read path (a persist to a store/repository). A query must stay side-effect-free so reads are safe to retry, cache, and route to a read replica; move the write into a command."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/lib/shared/community/community_storage.dart"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"34833442a356a5d82d1b5260531375f6b64af326c218b5b510c55226c2c381ed"}},{"ruleId":"M2","level":"note","message":{"text":"No ADRs: No Architecture Decision Records found \u2014 no conventional ADR directory, no numbered \u0060NNNN-title\u0060 documents in any markup this check reads, and nothing ADR-shaped by content. Design rationale recorded elsewhere (a design-notes tree, a mailing list, pull-request discussion) is not visible to this check and is not re-findable per decision, so a future maintainer cannot ask why one choice was made and get an answer."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"670b3d6e36a756d63097d0dfbf90afd5fc761308800b9354894a07c3f4e4aa14"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: README omits the admin-web project (buzz-admin-web) \u2014 reported by the model that read the README against this repository; no term search was run for this one, so nothing here has been checked against the tree. Treat it as a reading to confirm, not as a measured contradiction: verify it against the code before acting on it, and if the footprint it describes does exist, this row is wrong."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"8fc71a8414dbdfcb807bf80d8424c359104635a2331c4f6ba43961665e04536b"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: omits the hosted relay deployment guide \u2014 reported by the model that read the README against this repository; no term search was run for this one, so nothing here has been checked against the tree. Treat it as a reading to confirm, not as a measured contradiction: verify it against the code before acting on it, and if the footprint it describes does exist, this row is wrong."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"877083bc5b3bc6b2658828143ef9ee01d665c1e8bfc498fc846da42123e3e5d2"}},{"ruleId":"P2","level":"note","message":{"text":"Logging is not universal: Only 19/27 runnable modules use logging (modules with no entry point or server are excluded \u2014 they are libraries a runnable module hosts). Silent: \u0060.\u0060, \u0060crates/buzz-backend-kubernetes\u0060, \u0060crates/buzz-cli\u0060, \u0060crates/buzz-pair-relay\u0060, \u0060crates/buzz-pairing-cli\u0060 and 3 more."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"91a94e21d6d4d0e6a2003f94505b0b02b157176f0b24c4820f3f82b4447a97fe"}},{"ruleId":"P7","level":"warning","message":{"text":"Outbound HTTP without resilience: \u0060reqwest::Client::builder(\u0060 makes an outbound HTTP call, and nothing bounds it: no timeout, deadline, retry or circuit breaker is set for it here, and the client has no process-wide default. A slow or failing dependency will hold this service\u0027s request, thread or connection until the call gives up on its own \u2014 or never, for a client with no default timeout."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/app_state.rs"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"c628eed984f68482228a9c23f19ce597f0cce758e26588acbfe3af2207c7206e"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060load\u0060 is async and calls readFileSync \u2014 a blocking call inside async code stalls the event loop \u2014 every other request waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/test-loader-hooks.mjs"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"d55ae4603e538d6ce5aa61a5091767b73b9c1ca5af5d0dbcd0423b8e0962a743"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 28 sibling directories (281 clone groups): 281 duplicated blocks under desktop/src/features/ have copies in at least two of the sibling directories admin-console, agents, channel-templates, channels, communities, community-members (\u002B22 more sibling(s) not listed) \u2014 140 of them are reported below, and 141 are counted here but not reported individually: those copies match on shape but no longer clear R10\u0027s bar for an individually reported row \u2014 either they kept neither their own names nor their values, or what was copied is too small to stand on its own (it reports near-exact duplication only, and only of substantial extent). What this row states is the concentration, which the detector measured over all 281 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 281 local ones: the siblings replicate behaviour none of them owns, which is the shape of a missing shared module \u2014 a common library every sibling imports \u2014 rather than 281 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/ui/EncryptedBackupCreator.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"b91c393a8da40acdca1f1225fc183eb04d46d331f39ec042bc2d054ff1c623ac"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 5 sibling directories (109 clone groups): 109 duplicated blocks under desktop/src/ have copies in at least two of the sibling directories app, features, protectedFeatures, shared, testing \u2014 55 of them are reported below, and 54 are counted here but not reported individually: those copies match on shape but no longer clear R10\u0027s bar for an individually reported row \u2014 either they kept neither their own names nor their values, or what was copied is too small to stand on its own (it reports near-exact duplication only, and only of substantial extent). What this row states is the concentration, which the detector measured over all 109 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 109 local ones: the siblings replicate behaviour none of them owns, which is the shape of a missing shared module \u2014 a common library every sibling imports \u2014 rather than 109 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/ui/MessageReactions.tsx"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"051b2e4e25d5773c92125957756884088970958009653e43731434b5b741df88"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 3 sibling directories (20 clone groups): 20 duplicated blocks under the repository root have copies in at least two of the sibling directories desktop, mobile, web \u2014 13 of them are reported below, and 7 are counted here but not reported individually: those copies match on shape but no longer clear R10\u0027s bar for an individually reported row \u2014 either they kept neither their own names nor their values, or what was copied is too small to stand on its own (it reports near-exact duplication only, and only of substantial extent). What this row states is the concentration, which the detector measured over all 20 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 20 local ones: the siblings replicate behaviour none of them owns, which is the shape of a missing shared module \u2014 a common library every sibling imports \u2014 rather than 20 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/card.tsx"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b654e38da6bdfa434ae0855a47c1b79eeb1b0ae5ce5ac16f3220a7079fe5b55"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 3 sibling directories (7 clone groups): 7 duplicated blocks under desktop/src/features/huddle/ have copies in at least two of the sibling directories components, hooks, lib \u2014 4 of them are reported below, and 3 are counted here but not reported individually: those copies match on shape but no longer clear R10\u0027s bar for an individually reported row \u2014 either they kept neither their own names nor their values, or what was copied is too small to stand on its own (it reports near-exact duplication only, and only of substantial extent). What this row states is the concentration, which the detector measured over all 7 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 7 local ones: the siblings replicate behaviour none of them owns, which is the shape of a missing shared module \u2014 a common library every sibling imports \u2014 rather than 7 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/hooks/useHuddleParticipantRoster.ts"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"b04b77c2e157adbea3d8a37f36c02eb5656ef8133b82dc03aa2b8a2d40aaef2f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 2 sibling directories (6 clone groups): 6 duplicated blocks under desktop/src/features/messages/ have copies in at least two of the sibling directories lib, ui \u2014 2 of them are reported below, and 4 are counted here but not reported individually: those copies match on shape but no longer clear R10\u0027s bar for an individually reported row \u2014 either they kept neither their own names nor their values, or what was copied is too small to stand on its own (it reports near-exact duplication only, and only of substantial extent). What this row states is the concentration, which the detector measured over all 6 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 6 local ones: the siblings replicate behaviour none of them owns, which is the shape of a missing shared module \u2014 a common library every sibling imports \u2014 rather than 6 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/lib/useThreadFollows.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2b01c75a0dcde285e3a52c1843005fbf1d13ba8760f943c75eba4c4ee316beb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (191 matched lines \u00D7 2 locations): desktop/src/features/onboarding/ui/EncryptedBackupCreator.tsx:49 \u00B7 desktop/src/features/settings/ui/EncryptedBackupCreator.tsx:19 \u2014 the two spans are one implementation copied and then locally edited \u2014 1024 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":"desktop/src/features/onboarding/ui/EncryptedBackupCreator.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb7de6f20409750728ab98f478e942e8907c5cbca0f608256ff5b388264cb84a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (189 lines \u00D7 2 locations): desktop/src/features/sidebar/lib/useChannelMutes.ts:19 \u00B7 desktop/src/features/sidebar/lib/useChannelStars.ts:19 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/lib/useChannelMutes.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"26b910b9b6df3c9d9be0aba87d3359f365753ff9cbeff5ccbdb0f8fef5829d05"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (166 matched lines \u00D7 2 locations): desktop/src/shared/ui/context-menu.tsx:13 \u00B7 desktop/src/shared/ui/dropdown-menu.tsx:13 \u2014 the two spans are one implementation copied and then locally edited \u2014 902 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":"desktop/src/shared/ui/context-menu.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"84ee6633ff28e2e07c39e37fd9b862a40c242aade8ed099196274da7ed88afc2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (161 lines \u00D7 2 locations): desktop/src/features/projects/ui/ProjectsIssuesList.tsx:196 \u00B7 desktop/src/features/projects/ui/ProjectsPullRequestsList.tsx:203 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectsIssuesList.tsx"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"871d4c5d85f1f5512c1c0e66f297a96c68e32462de2eb90af8af9b4131839795"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (153 matched lines \u00D7 2 locations): desktop/src/features/agents/ui/EditAgentAdvancedFields.tsx:119 \u00B7 desktop/src/features/agents/ui/PersonaAdvancedFields.tsx:100 \u2014 the two spans are one implementation copied and then locally edited \u2014 607 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":"desktop/src/features/agents/ui/EditAgentAdvancedFields.tsx"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5f5cbf7bd333533af9db64019f88eb474601a01f018a6f063ab3dc478f9fe4c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (153 matched lines \u00D7 2 locations): desktop/src/features/onboarding/ui/BackupTestFlow.tsx:277 \u00B7 desktop/src/features/settings/ui/BackupTestFlow.tsx:160 \u2014 the two spans are one implementation copied and then locally edited \u2014 823 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":"desktop/src/features/onboarding/ui/BackupTestFlow.tsx"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"24ea0aa86d6cd39a67dcc8b2bcf74a4322445e314a0d75da281de3cd85f90cb6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (153 matched lines \u00D7 2 locations): desktop/src/features/workflows/ui/WorkflowAuthorPicker.tsx:114 \u00B7 desktop/src/features/workflows/ui/WorkflowMessagePicker.tsx:195 \u2014 the two spans are one implementation copied and then locally edited \u2014 720 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":"desktop/src/features/workflows/ui/WorkflowAuthorPicker.tsx"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"f48246cb3832b5a47ad5ec1b002cebd4e846933f6a6b52a06e018d2e1982c1d6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (152 matched lines \u00D7 2 locations): desktop/src/features/projects/ui/ProjectPullRequestFilesChangedPanel.tsx:120 \u00B7 desktop/src/features/projects/ui/ProjectRepositoryPanel.tsx:233 \u2014 the two spans are one implementation copied and then locally edited \u2014 666 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":"desktop/src/features/projects/ui/ProjectPullRequestFilesChangedPanel.tsx"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"964a3e6347d68c4252f4c8db967d7fa6c81b1f471c470438b1bd04f8bd3116c8"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (152 identical lines \u00D7 2 files): desktop/src/features/sidebar/lib/channelMutesSync.ts:1 \u00B7 desktop/src/features/sidebar/lib/channelStarsSync.ts:1 \u2014 these 2 files are line-for-line copies of one another \u2014 152 lines are identical, in the same order, in every one of them \u2014 so this is one fact about the file set, not a block to extract. An edit made to one file and not the others changes behaviour silently, which is the failure a wholesale copy guarantees. Pick one file as the single source and derive the others from it (re-export it, spread it into the local overrides each variant genuinely needs, or generate the copies at build time) \u2014 the few lines that differ between the files are exactly the part each variant should still own. Check first whether the copies are deliberately standalone deliverables (a translation file seeded from its sibling and waiting to be translated); where they are, the duplication is the design, and the honest move is to mark the seeded file as untranslated rather than to let it pass as done."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/lib/channelMutesSync.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"56a3807ae504f6f820f563612884fa54e615450df3defb4c65a09acab4956f65"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (143 matched lines \u00D7 2 locations): desktop/src/features/agents/ui/AgentSnapshotImportDialog.tsx:24 \u00B7 desktop/src/features/agents/ui/TeamSnapshotImportDialog.tsx:22 \u2014 the two spans are one implementation copied and then locally edited \u2014 629 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":"desktop/src/features/agents/ui/AgentSnapshotImportDialog.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"36f6e5f5052de56a79df526380aac286dfe5617df337b7f38166626c7f050019"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (129 matched lines \u00D7 2 locations): desktop/src/features/projects/ui/IssueAssigneesRow.tsx:31 \u00B7 desktop/src/features/projects/ui/PullRequestReviewersRow.tsx:38 \u2014 the two spans are one implementation copied and then locally edited \u2014 652 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":"desktop/src/features/projects/ui/IssueAssigneesRow.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dfa2953f38ce0509a0ae3f615617b3532406d9747d67313481ddde5330f2de7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (128 matched lines \u00D7 2 locations): desktop/src/shared/theme/ThemePreviewFrame.tsx:63 \u00B7 desktop/src/shared/theme/ThemePreviewFrame.tsx:267 \u2014 the two spans are one implementation copied and then locally edited \u2014 565 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/theme/ThemePreviewFrame.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7d6d06e92002cdba0184f74b39d797049213bb7f94d44f3bc5fd70715561cd0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (123 matched lines \u00D7 2 locations): desktop/src/features/channels/ui/MembersSidebar.tsx:268 \u00B7 desktop/src/features/messages/ui/useNewMessageRecipients.ts:102 \u2014 the two spans are one implementation copied and then locally edited \u2014 598 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":"desktop/src/features/channels/ui/MembersSidebar.tsx"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"9661e01c3f568c96688a0bfebdf1d440f124c215102de2044218d418b61a6967"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (121 lines \u00D7 2 locations): desktop/src/features/sidebar/lib/channelMutesStorage.ts:2 \u00B7 desktop/src/features/sidebar/lib/channelStarsStorage.ts:2 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/lib/channelMutesStorage.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f0e3d18980ab6c043b80dc391c95030c84e7c3773db20c25db253bff8799616"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (118 matched lines \u00D7 2 locations): desktop/src/features/agents/ui/AddAgentToChannelDialog.tsx:52 \u00B7 desktop/src/features/agents/ui/AddTeamToChannelDialog.tsx:92 \u2014 the two spans are one implementation copied and then locally edited \u2014 607 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":"desktop/src/features/agents/ui/AddAgentToChannelDialog.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"049a9a4ef2cf15aa3dabe83c3bee7e51a52f7862cae798047825484150509b7a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (117 matched lines \u00D7 2 locations): desktop/src/features/agents/ui/usePersonaActions.ts:69 \u00B7 desktop/src/features/agents/ui/useTeamActions.ts:66 \u2014 the two spans are one implementation copied and then locally edited \u2014 647 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":"desktop/src/features/agents/ui/usePersonaActions.ts"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"50e64ed63d2886445980d62936bb7f9f95cceaa4cbe1799cea95338390c74124"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (115 matched lines \u00D7 2 locations): desktop/src/features/agents/ui/AgentsView.tsx:325 \u00B7 desktop/src/features/agents/ui/AgentsView.tsx:550 \u2014 the two spans are one implementation copied and then locally edited \u2014 539 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentsView.tsx"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfcb16330f4b2d4ed3aede63e61c73e3004297cbec833e1d1f1b16d9bc0f1e01"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (111 matched lines \u00D7 2 locations): desktop/src/features/communities/ui/HostedCommunityOnboarding.tsx:115 \u00B7 desktop/src/features/settings/ui/HostedCommunitiesSettingsCard.tsx:127 \u2014 the two spans are one implementation copied and then locally edited \u2014 528 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":"desktop/src/features/communities/ui/HostedCommunityOnboarding.tsx"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"f35bdbffcabf3c69494231d34b6206bd3c26fdc9d212f2b1e939e8db62e46355"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (107 matched lines \u00D7 2 locations): desktop/src/features/onboarding/ui/BackupTestFlow.tsx:33 \u00B7 desktop/src/features/settings/ui/BackupTestFlow.tsx:14 \u2014 the two spans are one implementation copied and then locally edited \u2014 699 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":"desktop/src/features/onboarding/ui/BackupTestFlow.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0cabafb37e9b4a18d9291ffbd2fec2f8a72b505e78c3e1c3b5fa9889d908552"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (104 matched lines \u00D7 2 locations): desktop/src/features/communities/ui/HostedCommunityCreateFlow.tsx:150 \u00B7 desktop/src/features/communities/ui/HostedCommunityOnboarding.tsx:198 \u2014 the two spans are one implementation copied and then locally edited \u2014 511 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":"desktop/src/features/communities/ui/HostedCommunityCreateFlow.tsx"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0bbd3bb763ef542259c17ddaa81f4b275d64cb42c96e303f6b54394f0d38594"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (99 matched lines \u00D7 2 locations): desktop/src/features/messages/lib/useChannelLinks.ts:92 \u00B7 desktop/src/features/messages/lib/useEmojiAutocomplete.ts:151 \u2014 the two spans are one implementation copied and then locally edited \u2014 521 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":"desktop/src/features/messages/lib/useChannelLinks.ts"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b36a1e64d19e3ffe9eeaf2fd5999dc8b225c885a67ac21ba58ff5481a9b7808"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (94 identical lines \u00D7 2 files): desktop/src/features/onboarding/lib/encryptedBackup.ts:2 \u00B7 desktop/src/features/settings/lib/encryptedBackup.ts:2 \u2014 these 2 files are line-for-line copies of one another \u2014 94 lines are identical, in the same order, in every one of them \u2014 so this is one fact about the file set, not a block to extract. An edit made to one file and not the others changes behaviour silently, which is the failure a wholesale copy guarantees. Pick one file as the single source and derive the others from it (re-export it, spread it into the local overrides each variant genuinely needs, or generate the copies at build time) \u2014 the few lines that differ between the files are exactly the part each variant should still own. Check first whether the copies are deliberately standalone deliverables (a translation file seeded from its sibling and waiting to be translated); where they are, the duplication is the design, and the honest move is to mark the seeded file as untranslated rather than to let it pass as done."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/onboarding/lib/encryptedBackup.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"cacb0689e07691f74568a2c19956f06f7ec13ba67286e979e1d2360bf75f8ece"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (92 matched lines \u00D7 2 locations): desktop/src/features/agents/ui/AgentSnapshotExportDialog.tsx:89 \u00B7 desktop/src/features/agents/ui/TeamSnapshotExportDialog.tsx:72 \u2014 the two spans are one implementation copied and then locally edited \u2014 401 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":"desktop/src/features/agents/ui/AgentSnapshotExportDialog.tsx"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"286f0f9856ec79d17e551c71113b80c75199ff017668c90d64032fc9cc97d920"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (92 matched lines \u00D7 2 locations): desktop/src/features/channels/ui/WelcomeComposerBanner.tsx:141 \u00B7 desktop/src/features/search/ui/SearchPromptPlaceholder.tsx:62 \u2014 the two spans are one implementation copied and then locally edited \u2014 526 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":"desktop/src/features/channels/ui/WelcomeComposerBanner.tsx"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f4103647b200c385181a46f954b382f703d60c812e0974d1f515819d73286c7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (83 matched lines \u00D7 2 locations): desktop/src/features/communities/ui/HostedCommunityCreateFlow.tsx:45 \u00B7 desktop/src/features/communities/ui/HostedCommunityOnboarding.tsx:84 \u2014 the two spans are one implementation copied and then locally edited \u2014 579 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":"desktop/src/features/communities/ui/HostedCommunityCreateFlow.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"81ad6c659e2930fcdd96cc97c8e0325f2894f1aefdef2a589555aa541f7c3ae3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (83 matched lines \u00D7 2 locations): desktop/src/features/onboarding/ui/BackupTestFlow.tsx:631 \u00B7 desktop/src/features/settings/ui/BackupTestFlow.tsx:341 \u2014 the two spans are one implementation copied and then locally edited \u2014 358 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":"desktop/src/features/onboarding/ui/BackupTestFlow.tsx"},"region":{"startLine":631}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d8f4538b126483b41364c813bc1ae1c07e4ddc41d29fe3f7c816b79cc9443e6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (79 matched lines \u00D7 2 locations): desktop/src/features/projects/ui/CreateProjectIssueDialog.tsx:13 \u00B7 desktop/src/features/projects/ui/CreatePullRequestDialog.tsx:23 \u2014 the two spans are one implementation copied and then locally edited \u2014 425 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":"desktop/src/features/projects/ui/CreateProjectIssueDialog.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"92cc80890bb923c8ebe14c93fe98aaa798fa410ea0e0e95c4d70180c33e2ed72"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (78 matched lines \u00D7 2 locations): desktop/src/features/messages/ui/MessageRow.tsx:755 \u00B7 desktop/src/features/messages/ui/MessageThreadSummaryRow.tsx:150 \u2014 the two spans are one implementation copied and then locally edited \u2014 297 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":"desktop/src/features/messages/ui/MessageRow.tsx"},"region":{"startLine":755}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac9d4cc047ca57e21cb5810b4742083d92ea55b203e19af0d917a952a8ff8c08"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (66 matched lines \u00D7 2 locations): desktop/src/features/channels/channelSnapshot.ts:46 \u00B7 desktop/src/features/projects/projectSnapshot.ts:113 \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":"desktop/src/features/channels/channelSnapshot.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"9def8299d40a7effc3bcbbbce368cb4bb57186211fbb6fba27b3e7b127cb4bd5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (65 matched lines \u00D7 2 locations): desktop/src/features/projects/ui/ProjectAgentChatPanel.tsx:76 \u00B7 desktop/src/features/projects/ui/ProjectsAgentPromptPage.tsx:427 \u2014 the two spans are one implementation copied and then locally edited \u2014 284 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":"desktop/src/features/projects/ui/ProjectAgentChatPanel.tsx"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0fe235b0d2d1e126cc8c46fca83d679f7713a651995285f3e363d672789537e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (65 matched lines \u00D7 2 locations): desktop/src/shared/ui/rich-link-preview-attachment.tsx:168 \u00B7 desktop/src/shared/ui/rich-link-preview-attachment.tsx:267 \u2014 the two spans are one implementation copied and then locally edited \u2014 282 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/rich-link-preview-attachment.tsx"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a883ad74a69035c80c43a0e2ba223aa2b34faf248de6d7ff57649d4a58928c5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (59 matched lines \u00D7 2 locations): desktop/src/features/agents/ui/AgentSessionToolItem/SentMessageContextDialog.tsx:126 \u00B7 desktop/src/features/agents/ui/PromptSectionAccordion.tsx:17 \u2014 the two spans are one implementation copied and then locally edited \u2014 249 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":"desktop/src/features/agents/ui/AgentSessionToolItem/SentMessageContextDialog.tsx"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"b15663a136ef2603980153949b3211962c5b12ad6cd82b4314b32eee31de1a11"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (58 matched lines \u00D7 2 locations): desktop/src/features/agents/useAgentManagement.ts:42 \u00B7 desktop/src/features/projects/useProjectChannelRequests.ts:24 \u2014 the two spans are one implementation copied and then locally edited \u2014 328 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":"desktop/src/features/agents/useAgentManagement.ts"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"997e0b4dd4d7ab6cc7621dfd482df0c700992420100ff12e55ed5776fb9e0006"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (56 matched lines \u00D7 2 locations): desktop/src/features/projects/ui/AddProjectRepositoryDialog.tsx:148 \u00B7 desktop/src/features/projects/ui/CreateProjectWorkItemDialog.tsx:156 \u2014 the two spans are one implementation copied and then locally edited \u2014 236 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":"desktop/src/features/projects/ui/AddProjectRepositoryDialog.tsx"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a31514a0095b9b42eb5cd73c490e1cf1a4d3412214b2ad445ef70059d3fac91"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (54 matched lines \u00D7 2 locations): desktop/src/features/admin-console/adminConsolePanelFeedback.jsdom-test.mjs:120 \u00B7 desktop/src/features/admin-console/adminConsolePanelFeedback.jsdom-test.mjs:307 \u2014 the two spans are one implementation copied and then locally edited \u2014 325 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/adminConsolePanelFeedback.jsdom-test.mjs"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"440075af44223a16edf11467834bf210a270efcb702071e31046feeb259bf3bc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:relative-cross-package]: desktop/scripts/check-file-sizes.mjs:4 reaches into another package with a relative path (../../scripts/check-file-sizes-core.mjs) \u2014 import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/scripts/check-file-sizes.mjs"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d999b7af4087aab944ae3f2174b480370d4ff1870f4679672b406a551ecaff9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:relative-cross-package]: desktop/scripts/check-pubkey-truncation.mjs:3 reaches into another package with a relative path (../../scripts/check-pubkey-truncation-core.mjs) \u2014 import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/scripts/check-pubkey-truncation.mjs"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"be2b68103cdd475ff1fbef6beddefd449e03e8703ace9f73152523b93fe10df7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:relative-cross-package]: desktop/scripts/check-px-text.mjs:3 reaches into another package with a relative path (../../scripts/check-px-text-core.mjs) \u2014 import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/scripts/check-px-text.mjs"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"421141515871eed72e73824895cee4908805d2d6cd664153f4f9b48cf6f02bc1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/admin-console/AdminConsolePanelHelpers.tsx:11 imports desktop/src/features/forum/lib/time.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/AdminConsolePanelHelpers.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"1314b6834eac4b5211e61ae00ad3dcea248c1c57541de169d2833e6fa4333afd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/admin-console/AdminConsoleReportsTab.tsx:18 imports desktop/src/features/profile/hooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/AdminConsoleReportsTab.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"92e22bc426bf10bfd2c00931b4716cf4b2da3983eff3b9e511c3bea1c8de03d5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/admin-console/AdminConsoleSettingsCard.tsx:33 imports desktop/src/features/settings/ui/SettingsSectionHeader.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/AdminConsoleSettingsCard.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"e68f6bd8ba12df3c9d3aa72c05a9181c69e0e0ae5d1d1004ef9f02946e6ee4c5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/admin-console/AdminConsoleStaffingTab.tsx:23 imports desktop/src/features/profile/hooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/AdminConsoleStaffingTab.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"44137abaa8fa439f86f655c7f7b2a804dffe86e5ee07dc3a7a932fdda6c9c8a8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/admin-console/AdminConsoleStaffingTab.tsx:24 imports desktop/src/features/communities/useCommunities.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/AdminConsoleStaffingTab.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"45d45bd486e22c0a3b96cee67d74076fd7099efc92f13b84e345f0f06cafb603"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/admin-console/adminConsolePanel.test.mjs:461 imports desktop/src/features/communities/useCommunities.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/adminConsolePanel.test.mjs"},"region":{"startLine":461}}}],"partialFingerprints":{"codehealthFindingId/v1":"05b1c0d3d90728941012bfa27334e8f5cf83d61f591c5d42d2f52933521bbbff"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/admin-console/adminConsolePanelTestHelpers.jsdom.mjs:59 imports desktop/src/features/communities/useCommunities.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/adminConsolePanelTestHelpers.jsdom.mjs"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"cff1adcef5a2a92299cd789403aa7c138a50fcd6e7f049d3aa2ad3aea3a8f51a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agent-memory/hooks.ts:4 imports desktop/src/features/agents/hooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agent-memory/hooks.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"68f37aa844eab5e089e700d84f1f75858b65bf53761503eac44d2ee687039784"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/hooks.ts:14 imports desktop/src/features/channels/hooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/hooks.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"2692a702032035a45fdde3febb3ef1bc2660c524956d211f3d6e3f7750d02404"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/hooks.ts:18 imports desktop/src/features/channels/channelMemberProfileCache.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/hooks.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf4a2a5f0e87b91d761cd643c760bcdb722736a773ba7a45df269c3283f945d3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/hooks.ts:19 imports desktop/src/features/profile/hooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/hooks.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"83bd185bd746c0ac0fdfd05177726ee3ef8464b89bc5f197e735297849d64d9a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/lib/managedAgentDeletionAvailability.test.mjs:61 imports desktop/src/features/communities/useCommunities.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/lib/managedAgentDeletionAvailability.test.mjs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc4d5f71fdd2da0168a4d7581d5bd6a719faaf22ace64cf895eff7f7af0cc983"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/lib/managedAgentDeletionAvailability.test.mjs:68 imports desktop/src/features/profile/ui/UserProfilePanelDeletion.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/lib/managedAgentDeletionAvailability.test.mjs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7857c68ea53fa8ac89c323d803b96fb3be37d9adad8a5006df8efa05bc6ee12"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/lib/personaEditCaches.ts:3 imports desktop/src/features/profile/hooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/lib/personaEditCaches.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ca9c50806d58eddb60bc057c9131ecdabc1e416bc02daaad7f9181e491b9c4a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/lib/useAgentAvailability.ts:3 imports desktop/src/features/presence/hooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/lib/useAgentAvailability.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc81ff8c0f7a9eb3cdd66f6b0e835577768010a202fd63c71de5bb9373c0b935"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/managedAgentRuntimeHooks.ts:9 imports desktop/src/features/communities/communityStorage.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/managedAgentRuntimeHooks.ts"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"48f921f26e167ecd76555f8ab92982b54fc64e35181202bf500cd355a6c5f507"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/observerRelayStore.ts:14 imports desktop/src/features/projects/projectChannelRequest.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/observerRelayStore.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"91ea6ac9cd78e7e537c7f1bcc569964b177a109f4426a2c7ae2aba7ff8c42845"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/ui/AddAgentToChannelDialog.tsx:7 imports desktop/src/features/channels/hooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AddAgentToChannelDialog.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d4c1e5152e879845ce55a1236f53a14eec1f0413d1dc7706c5bcfb7f6ddd3ce"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/ui/AddCustomHarnessDialog.tsx:1 imports desktop/src/features/settings/ui/CustomHarnessForm.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AddCustomHarnessDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4dd08432431b9f6b3dfdc98a2690be35c9d941c6d41ec53260bfac9aa559a25"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/ui/AddTeamToChannelDialog.tsx:19 imports desktop/src/features/channels/hooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AddTeamToChannelDialog.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"295ae731b8c05b45757472078e0786d29966b832a219e40cec51078c56b7b5fd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/ui/AddTeamToChannelDialog.tsx:20 imports desktop/src/features/profile/ui/ProfileAvatar.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AddTeamToChannelDialog.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bb6e5360ed1887d11e61d5dbff7e2d859fccf3a4778aa7000eb8546bdbc43ff"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/ui/AgentCardViewerDialog.tsx:16 imports desktop/src/features/channels/hooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentCardViewerDialog.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6e9594c60dd49b0e101085875250c97006fa3f3ea04fa66444c307182e264b4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/ui/AgentConfigFields.tsx:62 imports desktop/src/features/settings/ui/SettingsOptionGroup.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentConfigFields.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"7167b53b5fce439da43595e33c3689463e1bbc239cf7b863402a6342a20f1091"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/ui/AgentCreationPreview.tsx:6 imports desktop/src/features/profile/ui/MaskedAvatarBadgeFrame.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentCreationPreview.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdc1bd57f637b0a190d9c36ee2ad62f02e163af3ad24d8dbb6624c3ba5b1ad5d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/ui/AgentCreationPreview.tsx:7 imports desktop/src/features/profile/ui/ProfileAvatar.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentCreationPreview.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"d01cbebaea5f538c750f222ab4d4cc24b8dc1c4d52d04059204df7f3e8fc8696"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/ui/AgentCreationPreview.tsx:8 imports desktop/src/features/profile/ui/ProfileAvatarEditor.utils.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentCreationPreview.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"6774e1b09ebf16a6a97e5f15348cff68ef387687a55f17c36829521d3140ff10"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/ui/AgentCreationPreview.tsx:27 imports desktop/src/features/profile/ui/AvatarCustomColorPanel.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentCreationPreview.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e039acd31f76ecae1421e131b3c75df255f68f0c8f136cbdcc0a002b9af886b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/ui/AgentCreationPreview.tsx:28 imports desktop/src/features/profile/useAvatarUpload.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentCreationPreview.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"b337f8402ff86643d46bdbb7de0ca95214ba2768cfd9841a3fd876ef69671a11"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/ui/AgentIdentityCard.tsx:3 imports desktop/src/features/profile/ui/ProfileAvatar.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentIdentityCard.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"da9adc853dc770f308089148f61b9288dde153ac8ee681167d10e8a2c891d35d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/ui/AgentManagementDialogs.tsx:2 imports desktop/src/features/projects/ui/ProjectChannelRequestDialog.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentManagementDialogs.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd4c7835d8ae1f294783191b8e083503d20c6dd29208e320eb08ac38549bec94"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/ui/AgentRuntimeAvatarControl.tsx:4 imports desktop/src/features/profile/ui/MaskedAvatarBadgeFrame.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentRuntimeAvatarControl.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e52a5be3bd6c1a69ed002920930bf6908259079516a8e02cfc15b14275db30c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/ui/AgentRuntimeAvatarControl.tsx:9 imports desktop/src/features/profile/ui/ProfileAvatar.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentRuntimeAvatarControl.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffb6864bae1e2c0da069e02d6329cd42fa08ee5cbbe6a774603f6805347625e9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/ui/AgentRuntimeAvatarControl.tsx:10 imports desktop/src/features/presence/lib/presence.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentRuntimeAvatarControl.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf8c4c760a17568e67d6529b5143f891449ffbc7d9bc7f052e9d6890fbb813fa"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: desktop/src/features/agents/ui/AgentSessionToolItem/CompactMessageSummary.tsx:4 imports desktop/src/app/navigation/useAppNavigation.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentSessionToolItem/CompactMessageSummary.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"445a4d007ce197372eec25e1c1df93946abf186cc40396be0a4f437f6e0e9a3f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/ui/AgentSessionToolItem/ToolItem.tsx:3 imports desktop/src/features/profile/lib/identity.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentSessionToolItem/ToolItem.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"a64e2803be731e1e2d5cbb1f23b54513d582fa0367ae5116eb9e6df9eca26aed"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: desktop/src/features/agents/ui/AgentSessionTranscriptList.tsx:14 imports desktop/src/features/messages/ui/useAnchoredScroll.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentSessionTranscriptList.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe88f174dc0e389064f9a933012a55bfbc20b84c73c59ed35efaf7595d9e3018"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: desktop/src/features/agents/ui/AgentsScreen.tsx:3 imports desktop/src/app/navigation/useAppNavigation.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentsScreen.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9b347476bb09b656262687026162f3c28dd3d04e41ece36f07cc9fc62561caa"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 651, cognitive 547): (anonymous) has cyclomatic complexity 651 and cognitive complexity 547; 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 sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. 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":"desktop/src/testing/e2eBridge.ts"},"region":{"startLine":12010}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6124305cdb99819184702c4b7bd6c8170a2a47dcbef9fbdaaa096491de638a1"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function AgentConfigFields (cyclomatic 122, cognitive 112): AgentConfigFields has cyclomatic complexity 122 and cognitive complexity 112; 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 sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. 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":"desktop/src/features/agents/ui/AgentConfigFields.tsx"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e66c2e2a013d7911d3df3c966cad79f90cd1492fece063694a40666c7555d55"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function sendToMockSocket (cyclomatic 118, cognitive 237): sendToMockSocket has cyclomatic complexity 118 and cognitive complexity 237; 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":"desktop/src/testing/e2eBridge.ts"},"region":{"startLine":10879}}}],"partialFingerprints":{"codehealthFindingId/v1":"e869ac4be3c7ad717c4b24c8202496babb73faac9bf61299d471d948892a0f99"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function UserProfilePanel (cyclomatic 112, cognitive 90): UserProfilePanel has cyclomatic complexity 112 and cognitive complexity 90; 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 sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. 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":"desktop/src/features/profile/ui/UserProfilePanel.tsx"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a209d45507dd7ce0e888c0ceba561817e6aa31473d087395b5220cd24e2e370"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function ChannelPane (cyclomatic 108, cognitive 92): ChannelPane has cyclomatic complexity 108 and cognitive complexity 92; 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 sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. 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":"desktop/src/features/channels/ui/ChannelPane.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4246171870f0e187e1307058ce9330c7a5bfa73a6fc09cf16dc6617622dbece"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function AnimatedAvatarCapture (cyclomatic 98, cognitive 91): AnimatedAvatarCapture has cyclomatic complexity 98 and cognitive complexity 91; 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 sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. 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":"desktop/src/features/profile/ui/AnimatedAvatarCapture.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"b584d52ffa37ef5b1061590d186c95c3c32289689e6705ae566dd3a741c75af3"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function processTranscriptEvent (cyclomatic 97, cognitive 166): processTranscriptEvent has cyclomatic complexity 97 and cognitive complexity 166; 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":"desktop/src/features/agents/ui/agentSessionTranscript.ts"},"region":{"startLine":700}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d6650e6bcc1d83816c707e398de92d66e2df615c89c1d2d79ded31afdd3205a"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function ProjectDetailScreen (cyclomatic 95, cognitive 81): ProjectDetailScreen has cyclomatic complexity 95 and cognitive complexity 81; 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 sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. 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":"desktop/src/features/projects/ui/ProjectDetailScreen.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"d07b8985954c6e5fde6e21f3cabb5bcb9dc82e2fdd053e3602c20c845d7e5af6"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 91, cognitive 49): (anonymous) has cyclomatic complexity 91 and cognitive complexity 49; 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 sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. 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":"desktop/tests/e2e/projects-v3-screenshots.spec.ts"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"efccee5c58e1d95c095cd259cbc83213ca7b8f4b7c3ec22aafe4a457132c38fc"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function AgentCreationPreview (cyclomatic 87, cognitive 92): AgentCreationPreview has cyclomatic complexity 87 and cognitive complexity 92; 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":"desktop/src/features/agents/ui/AgentCreationPreview.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"4136a09226a8f2dd0b22182c03e9581ec4e9f7e48a52e8d192cd578cfbb335b3"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function ProfileAvatarEditor (cyclomatic 85, cognitive 76): ProfileAvatarEditor has cyclomatic complexity 85 and cognitive complexity 76; 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 sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. 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":"desktop/src/features/profile/ui/ProfileAvatarEditor.tsx"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"4270bdcafbac8902cf29947bcc2be1038370351fa6bd5ceae697a23846337a1c"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function MessageTimeline (cyclomatic 81, cognitive 71): MessageTimeline has cyclomatic complexity 81 and cognitive complexity 71; 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 sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. 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":"desktop/src/features/messages/ui/MessageTimeline.tsx"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c97fa3335b32816760198ed2ce6b383fef371509c65cc45110ecbc539cb087e"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function ProfileSummaryView (cyclomatic 70, cognitive 55): ProfileSummaryView has cyclomatic complexity 70 and cognitive complexity 55; 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 sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. 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":"desktop/src/features/profile/ui/UserProfilePanelSections.tsx"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d83bb1bcabd8777b54d314aff4e7deb30cb95a43fe718bc278ab0da9736aab9"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function AgentDefinitionDialog (cyclomatic 69, cognitive 62): AgentDefinitionDialog has cyclomatic complexity 69 and cognitive complexity 62; 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 sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. 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":"desktop/src/features/agents/ui/AgentDefinitionDialog.tsx"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b9d92e5ce8c4f8b63edbf929d6917d677760181658a1089d3c22db1943ef639"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function NostrKeyImportForm (cyclomatic 68, cognitive 64): NostrKeyImportForm has cyclomatic complexity 68 and cognitive complexity 64; 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 sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. 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":"desktop/src/features/onboarding/ui/NostrKeyImportForm.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b617194bb81501fe72562306f50baf4860ee4010d157482c369a3b46a644edf"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function ProjectRepositoryActionsPanel (cyclomatic 68, cognitive 59): ProjectRepositoryActionsPanel has cyclomatic complexity 68 and cognitive complexity 59; 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 sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. 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":"desktop/src/features/projects/ui/ProjectRepositoryActionsPanel.tsx"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a43942d3d5aed75570b5dce4cb2c79a61d674992e7e22446399871d87e2a2f0"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function UserProfilePopoverBody (cyclomatic 68, cognitive 55): UserProfilePopoverBody has cyclomatic complexity 68 and cognitive complexity 55; 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 sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. 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":"desktop/src/features/profile/ui/UserProfilePopover.tsx"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"51bb555a463b4e77b7f32a7750f5b43352ba36740346f0e75a384054745bc350"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function MessageRow (cyclomatic 67, cognitive 63): MessageRow has cyclomatic complexity 67 and cognitive complexity 63; 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 sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. 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":"desktop/src/features/messages/ui/MessageRow.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b949cb5b9fd6cebf53f79120d66b4839e8e7ca70892c9acf462a62447b7e66a"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function apply (cyclomatic 64, cognitive 86): apply has cyclomatic complexity 64 and cognitive complexity 86; 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":"desktop/src/features/huddle/lib/huddlePresence.ts"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5c57a253b200241d6c946ba460362f4a50d8296daf1a4e1190fe7dd83e7c3bb"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function InboxMessageDetailPane (cyclomatic 61, cognitive 58): InboxMessageDetailPane has cyclomatic complexity 61 and cognitive complexity 58; 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 sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. 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":"desktop/src/features/home/ui/InboxDetailPane.tsx"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"c40e681e4e4a0b0630999fd9b8f619bb4a022f1d996c2600bb73d9d0eab26f66"}},{"ruleId":"R3","level":"warning","message":{"text":"Large Files: 215 file(s) over 400 lines (counted as significant lines \u2014 blank lines excluded \u2014 over production source only, tests excluded), largest first: desktop/src/testing/e2eBridge.ts (14643), desktop/src/features/admin-console/adminConsolePanelReports.jsdom-test.mjs (2539), desktop/src/shared/ui/VideoPlayer.tsx (2094), desktop/src/shared/ui/markdown.tsx (1751), desktop/src/features/admin-console/adminConsolePanelStaffing.jsdom-test.mjs (1512), desktop/src/features/admin-console/adminConsolePanelSession.jsdom-test.mjs (1434) (\u002B209 more)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"cecee31b569df4f07e06db732f1ca037af27b5afef9023da51f9673d931a142f"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/adminConsolePanelReports.jsdom-test.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9eb097cff1dfe8f88587bf011bcf05a50df962a7a692dbec84ff03d5118df25"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/adminConsolePanelStaffing.jsdom-test.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fcfe3ae4dc017b75f9d8ec022ea2716d868f8e837054818c0948bb20dd615b7"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/adminConsolePanelSession.jsdom-test.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"add782b8f22d553eb65256498ccf435d6371d59ac547cda88552abe87771759b"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/adminConsolePanelFeedback.jsdom-test.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8556d0e23317481e7ba1344094c715dc6be30d155c6d464db47dcd0ae68cd6c7"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/protectedFeatures/bestie/BestiePopover.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b30de038745a4a783a8374cb340fdf041b40f24830382c35a8adcc1be5cc8539"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/ManagedAgentRow.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"103aa947c62b922158d2efe5f083a7d912927ec6343f58f52b7b70f01fcc1ee2"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/ChannelMemberInviteCard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4dff82292d8c52d2ed001f1dd0291256f5042ae9b3ae46e654321df5db2d2c96"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/protectedFeatures/bestie/BloomMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8249ca8907a53127ed718f5b9f611248ba440d0155dec0fc1b00d8f363895e91"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/adminConsolePanelTestHelpers.jsdom.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d93652b2a3a53d5da1cd23f716983c203be6e00d186daa89e8810934335ed567"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/ModelPicker.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2908f9b58bc59599ed77d62f6e1e0db447ca14284116a3f19b9e69ef566bafe8"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/community-members/ui/CommunityMembersCard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7971cc3425064bbdb7d557b5721ba79cc23316042bd0bfc9a9727198348af9e5"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/settingsNavModeration.jsdom-test.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4843c2a99cd3573598df6c806f95775575e36a394ae30474846f174d02d6313c"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/ui/FeedSection.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cf037fba83db5d5b7a56651eec89ae025d7d2446fe0f103d216e7a2faca03f8"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/protectedFeatures/bestie/BestieGlobalOverlay.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"205cba6e01e039ca45ce1d112d33180ecc9d947f472e2a6a2a5dae640264b7b6"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/AvatarUpload.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a82006d2eb04f47112f6787ab1bd3523c31f6b6313b8256b2ba5a9ce8858eb6c"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/test-loader-hooks.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ade13471dfed8e32cde55148f22ef1c3a701df91c7b121dfcfff6f4ae9040e28"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/protectedFeatures/bestie/useBestie.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"101fd4df1cb7c8e62d18e09dd76bc38717ea42e0cd36505464e997a645381ccc"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/moderation/lib/timeoutStore.jsdom-test.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c353e76978652fc8710dbaad90b0a7b3f9d0b34ecc66fdbf93bfd7d550f143b"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/scripts/generate-sound-waveforms.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c07307b49ef0221564428e7e19d4e49f6cc59ffe68bd4a9657a9ec621e45a33d"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/check-px-text-core.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf9cc57953fc11878d7125ce70840404462485abc6518cbb081a12842c3d7634"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/scripts/texture-card/generate-card-texture.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8885a0d777fc696b0d58a480e90e09a4014f6891ed24273662b7f6e8e6fdd546"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/check-pubkey-truncation-core.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"365e98ffbecef973be140fb5ee46b834cf85b161c747fc0dac7bb58f1fbfd8fa"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/useLoadMissingAncestors.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc44418e41dba52eeb7bc379a0d41ef5a5ce3c2464790aaaae70f5058fa86305"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/QuickBotBar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b9cbcf7b5df177b1cea137b37565247a677864f874eb22311a1f518920b3ce9"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/ui/RecentNotesSection.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0963eb04a0f4ecc05f050a2d08684a10a4da2286ba8b06d5d62a6bcc6179d90"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/community-members/ui/ConfirmRemoveDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"97e778922ef098ce04530aa0ac2b40ded818be2b7f499482fb3f5b0badf4424b"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/protectedFeatures/internalUi.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1398ed6fc9e1b457f636875c9fb3fb3b3915bc61f9dacac6cd0f58f8a81da263"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/protectedFeatures/bestie/BestieProfileSection.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8b9f51a60e52168de727bcd5307c3f570a69c65d136c0b0948182d991fd8c7a"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mobile/scripts/generate-emoji-data.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e12a62b8b110c678a571eec9817b8a8309b98f710a4f41e3e425764a12120393"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/shared/ui/card.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f3f820932ddd006d79a87cff4f9a4f94c3582205c851ee7b0b755bcd30047f2"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/MembersSidebarAgentControls.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"19b3bef7de70e7d00faf394c701f983ab71428e0d71d9089b73d1cf07382b442"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/lib/pickBotName.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a00e474c8961be5249edbb20e0750bf2fc3e2031c0ec35065032693ba133697"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/useWindowFileDragOver.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ab395e6b6604b23f0eecc2cbf08af1c6ed791de4a0327ded66b77927901f68c"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/scripts/summarize-flaky-tests.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f016ce2ae432cdb9827193f0f945d4aecf5bccf34de3741d2c3fd5445ba0aca0"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/useQuickBotDrop.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f45238f64b7f09138c00c52f52537c6b053eba118440c6cfcee1628484edcf7c"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/public/worklet.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef4525bf6f5d1a228e73460919454930d934616ee2e2643fc6911463cef73939"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/scripts/build-release-config.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea6865e73b3f7deac260cb49b4d5ee424e2058f688c0f77ea34277cb7bc2f6a6"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/useReusableAgentDetection.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4633768520eb3a53b29313735efd61a25544bdc580b5a351307325108c6c2a3"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/AddChannelBotGenericSection.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"110a27cd40468ea50a44db2ca771916552036dc6d5267bc0515944643b5cc9aa"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/hooks/useFileImportZone.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e243cfa1647a415f5928f580d7222ad5b0fe60fac5e7b04fc4f28b3752f695c4"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~2784 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/adminConsolePanelReports.jsdom-test.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f53a3640d9c16809cafd213ea3a61179565a66ede4d0f84822428f6f14e64a1"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~1659 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/adminConsolePanelStaffing.jsdom-test.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cebd85fdea52e8612aa53a1cd71344ada745f34d66b143cc20d347940217102"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~1616 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/adminConsolePanelSession.jsdom-test.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"15d9e237abe6a706e01e28beaf96b0f4e821062e391d409035346593e2daa52f"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~891 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/adminConsolePanelFeedback.jsdom-test.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf55a591dd6c593c65da35a24bea6e319cf3d4654267657626c7122f5fcc58e8"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~429 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), but 1 in-repo import(s) from 1 other file(s) do name it (desktop/src/features/agents/ui/AgentGroupRows.tsx) \u2014 every one of those referrers is itself unreachable, so this file is dead only as a member of that cluster: if any referrer is in fact alive, this row falls with it"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/ManagedAgentRow.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b6712510e9afff719947ecb98a3f15448ad4b56fa05f79487f9d8d01dbf8c56"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~380 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/ChannelMemberInviteCard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab97a635d8c943b8ff3da6acad611b46879092207616d763f4eb842a4d5a3fc9"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~338 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), but 4 in-repo import(s) from 4 other file(s) do name it (desktop/src/features/admin-console/adminConsolePanelFeedback.jsdom-test.mjs, desktop/src/features/admin-console/adminConsolePanelReports.jsdom-test.mjs, desktop/src/features/admin-console/adminConsolePanelSession.jsdom-test.mjs and 1 more) \u2014 every one of those referrers is itself unreachable, so this file is dead only as a member of that cluster: if any referrer is in fact alive, this row falls with it"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/admin-console/adminConsolePanelTestHelpers.jsdom.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"480c9b916fda666e83e81f221dc93f40929190b59b195994e77bd1cc1813ba40"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~320 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/ModelPicker.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"32ce75e5b99aaca16857fd28d45fbf19057190bf2cd9a45cfe2097372c827776"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~289 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/community-members/ui/CommunityMembersCard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ae8d7ee8ec5caac89fb6abd952fd22374cc50bd38781e66b10be43883a1e370"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~288 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/settings/ui/settingsNavModeration.jsdom-test.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8202d3e645f62060058f1bdc1e84b9c5a74a3b24f6b38ddc459092f65dd75281"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~272 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/ui/FeedSection.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4228e5cd708fc3f80fce791a378451ed9dd24333c8e2d09e4098157357bd2209"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~211 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/profile/ui/AvatarUpload.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e99bd44dd88d18fb52112acaf060b42c4f1772847cb584958deec72c228e02e"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~170 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/moderation/lib/timeoutStore.jsdom-test.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e57d0e01d893940f3e37388f3055844003a6cf89e2c21adb638dd9a53e785ba"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~106 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/messages/useLoadMissingAncestors.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d3043b47937aec82d631d21c009dff5f5352e9e93c88295783bef5718347366"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~98 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/QuickBotBar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"546fa077e8f401b437d93ca90d469a959853ed95db5cfc188d59502b172d1d59"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~98 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/home/ui/RecentNotesSection.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6fe4f39b6725c18e680eeb1170cb0a8493f50c6667df049d9be23d8fe9cd1fb"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~92 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), but 1 in-repo import(s) from 1 other file(s) do name it (desktop/src/features/community-members/ui/CommunityMembersCard.tsx) \u2014 every one of those referrers is itself unreachable, so this file is dead only as a member of that cluster: if any referrer is in fact alive, this row falls with it"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/community-members/ui/ConfirmRemoveDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6900885fe5b6092150be2e24142dc261cc8fbaca59167d3fbe34fc3de6667a0d"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~83 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/shared/ui/card.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e21bc7968fb6c65aada4dedecfad344130a8acb4aed192cd478110f6fde381ff"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~78 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/MembersSidebarAgentControls.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"06c9483a0aa75326ea067e5d8f209f1f2cb5797f8711cf1cfe79cb7ade50fff0"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~75 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/lib/pickBotName.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"70233fe74e796cdfae81033df95a9cb0b2b28c33ccad739cfa8bb7914eef0bff"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~74 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/useWindowFileDragOver.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f8773678ad81dc8895e809620101cb7b2b87e983f91d6e548d2194b166f59d7"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~71 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/useQuickBotDrop.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e3026f3930eb80bda794b061a3441f7c766690c39d6dcabced9871e1e8e9e51"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~66 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/useReusableAgentDetection.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"640107746df96858e01e38b89191f04adbe1e74d9dbef3e4506f7546692666a6"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~64 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/AddChannelBotGenericSection.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc4a0bbd5b1c8d5915d2719038b09ccafe4fced569a517e302dc4077b8a3f00c"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~60 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/hooks/useFileImportZone.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f85961d8d2a4ae0a5a397f7453e0fd4fd7b0147bebd754e2a789c9b546016b44"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~58 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/moderation/ui/TimeoutDurationSubmenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6968be7978eee7dee4953c85188d218f78e3b9ebab4787d3681010b5bbaea01e"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~57 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/AgentGroupRows.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7abc20398379975cc2f2f9c9b5b1aaace67939dff7f56654847bd08579ab1cd8"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~56 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/sidebar/data/sidebarData.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f72b5ee7882e80e4dfa7af0d2ecec7cee766371061eaf4981db8501b73309ee3"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~56 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/step-progress.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"09cda04805869913cfab69a38ef687e70aecb5d874358cfc31e981e22c955e88"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~52 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectsListScopeDropdown.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"94f370327644d31b4ae19db91a24e1adfa0d74d86204b7704af0341f88c8c24a"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~51 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/useEffectiveRuntimes.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"61e76a2bee2b7bd96480465bbc8a7761e590bab6e06df40b41b99a888d67f8a2"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~45 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/channels/ui/AddChannelBotReuseGuard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4590b6252e145151f5ada66f00f90d73edf7a07001c17d73d1d38c3e532729cc"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~45 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/lib/projectLanguages.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"91668296e39b34e525264f54e21fd1b48b22aa4d806106e09bc5e814e1fa08cb"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~37 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/projects/ui/ProjectsOverviewChatToggle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbefd978b37cbb843c502b1a8fa88368ae08fc99ca5a9034215f60d680802fb9"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~33 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/ui/CreateNewButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"612bda609c0759eb999a60edd0b470aeabb46898399860cb4739e64f87114c5a"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~32 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/shared/theme/ThemeToggle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f12aebaaa04b992dac4704cf41cc9a154778f1058b129e7d3fad83e1d65a8e8b"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~29 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/import-status-icon.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc4b45ea53ad181efc7a702393adbed561f58e60dc2ebc52c8e9400a0ca97a79"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~28 LoC): no import path from any entry point (87 application, 32 tooling, 911 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/ui/TopChromeBackdrop.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"03d7e642b2e4ee1ed6a30ddab5a8737831d31070816e5bc02ef35ccd28a8018b"}},{"ruleId":"R8","level":"warning","message":{"text":"Unused dependency \u0027qrcode.react\u0027: Declared in desktop/package.json but never imported anywhere in that package or its workspace members \u2014 no static import reaches it. Usually that is dead weight and attack surface, but two shapes are indistinguishable from source and are NOT dead: an optional or native peer that another dependency loads dynamically at runtime, and a package a build, docs or test step installs and invokes separately. Confirm which of the three this is before removing it."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6a0b27a7fe87812b131bbb0c64c693bbb372250442beceea6e7500179b71e127"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (4 files): desktop/src/features/agents/activeAgentTurnsStore.ts \u2192 desktop/src/features/agents/observerRelayStore.ts \u2192 desktop/src/features/agents/hooks.ts \u2192 desktop/src/features/agents/managedAgentRuntimeHooks.ts \u2192 desktop/src/features/agents/activeAgentTurnsStore.ts (one verified cycle inside a mutually-dependent group of 8 files)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/agents/activeAgentTurnsStore.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d602d78c7010370273a71acf5fafd398ddfe64d86c4c219e5d39efc6fbea9a44"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (5 files): desktop/src/features/huddle/components/HuddleBar.tsx \u2192 desktop/src/features/huddle/components/ParticipantList.tsx \u2192 desktop/src/features/profile/ui/UserProfilePopover.tsx \u2192 desktop/src/features/profile/ui/useProfileInteractionActions.ts \u2192 desktop/src/features/huddle/index.ts \u2192 desktop/src/features/huddle/components/HuddleBar.tsx (one verified cycle inside a mutually-dependent group of 6 files)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/huddle/components/HuddleBar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a2b0f370fda4fefca5c3e5578979b04e2ef5c7e92d45dce1614cca80feebad8"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (2 files): desktop/src/shared/api/editMessage.ts \u2192 desktop/src/shared/api/tauri.ts \u2192 desktop/src/shared/api/editMessage.ts (one verified cycle inside a mutually-dependent group of 6 files)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/api/editMessage.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"84b382a37e967c3376a34cd480d9c197ee132843f7c9c55e46270bc6ae460b4f"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (3 files): desktop/src/shared/hooks/use-mobile.tsx \u2192 desktop/src/shared/layout/AuxiliaryPanel/index.ts \u2192 desktop/src/shared/layout/AuxiliaryPanelShell.tsx \u2192 desktop/src/shared/hooks/use-mobile.tsx"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/shared/hooks/use-mobile.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"98d24e32440240b64e32034b683517462e2b1e45de20af493a8c1e7db2d04e63"}},{"ruleId":"S1","level":"note","message":{"text":"No security response headers detected: No Content-Security-Policy / X-Frame-Options / X-Content-Type-Options configuration found \u2014 defense in depth, even when a reverse proxy could set them. This is reported because \u0060Caddyfile\u0060 is committed to this repository and declares the server that serves it, so the configuration that would carry these headers is in this repository and was read in full. (\u22122.0 on this card.)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"deploy/compose/Caddyfile"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"23633bb148e1f8683d133b289b329ec94cff919a8fb7a260260e85212f85641c"}},{"ruleId":"X9","level":"note","message":{"text":"Subsumed condition operand: \u0060msg_lower.contains(\u0022relay signed only\u0022)\u0060 can never decide this \u0060||\u0060 \u2014 every value satisfying \u0060msg_lower.contains(\u0022relay signed only\u0022)\u0060 also satisfies \u0060msg_lower.contains(\u0022relay\u0022)\u0060, so the \u0060||\u0060 chain is already decided by the latter. The expression is equivalent to the chain without it, which means it is wider than it reads. Delete the dead operand, or narrow the surviving one if IT is the accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-test-client/tests/e2e_relay.rs"},"region":{"startLine":1721}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae00c11025912d00a4c33fea1238cb7f8dbca0742a85a35ed55d9430d2da8a8f"}},{"ruleId":"X9","level":"note","message":{"text":"Subsumed condition operand: \u0060ref.startsWith(\u0022//\u0022)\u0060 can never decide this \u0060||\u0060 \u2014 every value satisfying \u0060ref.startsWith(\u0022//\u0022)\u0060 also satisfies \u0060ref.startsWith(\u0022/\u0022)\u0060, so the \u0060||\u0060 chain is already decided by the latter. The expression is equivalent to the chain without it, which means it is wider than it reads. Delete the dead operand, or narrow the surviving one if IT is the accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/features/repos/git-client.ts"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"96405182d9f4635c38b953504e46c0b65d5f105a78a22c56dbb08d4bd9303cb5"}},{"ruleId":"X9","level":"note","message":{"text":"Subsumed condition operand: \u0060err.contains(\u0022insert blocked by test trigger\u0022)\u0060 can never decide this \u0060||\u0060 \u2014 every value satisfying \u0060err.contains(\u0022insert blocked by test trigger\u0022)\u0060 also satisfies \u0060err.contains(\u0022blocked\u0022)\u0060, so the \u0060||\u0060 chain is already decided by the latter. The expression is equivalent to the chain without it, which means it is wider than it reads. Delete the dead operand, or narrow the surviving one if IT is the accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/agents_pending.rs"},"region":{"startLine":333}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb1c1942eaf1bac2f9afe75c63fcde3590106ca68d5dac95cddded87134f32d2"}},{"ruleId":"X9","level":"note","message":{"text":"Subsumed condition operand: \u0060err.contains(\u0022archive insert blocked\u0022)\u0060 can never decide this \u0060||\u0060 \u2014 every value satisfying \u0060err.contains(\u0022archive insert blocked\u0022)\u0060 also satisfies \u0060err.contains(\u0022blocked\u0022)\u0060, so the \u0060||\u0060 chain is already decided by the latter. The expression is equivalent to the chain without it, which means it is wider than it reads. Delete the dead operand, or narrow the surviving one if IT is the accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/agents_pending.rs"},"region":{"startLine":419}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e596e469222cbbe9b4e037b9c9589ae82473c9de90fb5d3c78c365d98298984"}},{"ruleId":"X9","level":"note","message":{"text":"Subsumed condition operand: \u0060normalized.contains(\u0022community_id\u0022)\u0060 can never decide this \u0060\u0026\u0026\u0060 \u2014 every value satisfying \u0060normalized.contains(\u0022old.community_id\u0022)\u0060 also satisfies \u0060normalized.contains(\u0022community_id\u0022)\u0060, so the \u0060\u0026\u0026\u0060 chain is already decided by the former. The expression is equivalent to the chain without it, which means it is narrower than it reads. Delete the dead operand, or narrow the surviving one if IT is the accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/buzz-db/src/runtime/migration.rs"},"region":{"startLine":667}}}],"partialFingerprints":{"codehealthFindingId/v1":"59a75f2cdc4bbf219084284972be1bfed6a484bddcc1a7df15b35b228b3b8895"}},{"ruleId":"X9","level":"note","message":{"text":"Subsumed condition operand: \u0060detail.startsWith(\u0022 is not \u0022)\u0060 can never decide this \u0060||\u0060 \u2014 every value satisfying \u0060detail.startsWith(\u0022 is not \u0022)\u0060 also satisfies \u0060detail.startsWith(\u0022 is \u0022)\u0060, so the \u0060||\u0060 chain is already decided by the latter. The expression is equivalent to the chain without it, which means it is wider than it reads. Delete the dead operand, or narrow the surviving one if IT is the accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src/features/workflows/ui/workflowDefinition.ts"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba14fa641034074aee5895e7de919ee81a26ada869cfbc7f116d1c88a5d6755a"}},{"ruleId":"X9","level":"note","message":{"text":"Subsumed condition operand: \u0060err.contains(\u0022insert blocked by test trigger\u0022)\u0060 can never decide this \u0060||\u0060 \u2014 every value satisfying \u0060err.contains(\u0022insert blocked by test trigger\u0022)\u0060 also satisfies \u0060err.contains(\u0022blocked\u0022)\u0060, so the \u0060||\u0060 chain is already decided by the latter. The expression is equivalent to the chain without it, which means it is wider than it reads. Delete the dead operand, or narrow the surviving one if IT is the accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/managed_agents/team_catalog/tests.rs"},"region":{"startLine":939}}}],"partialFingerprints":{"codehealthFindingId/v1":"a17357febc38c9267f52408211111ea48624ef40a3dbb9d27d625ed32f37ad61"}},{"ruleId":"X9","level":"note","message":{"text":"Subsumed condition operand: \u0060err.contains(\u0022insert blocked by test trigger\u0022)\u0060 can never decide this \u0060||\u0060 \u2014 every value satisfying \u0060err.contains(\u0022insert blocked by test trigger\u0022)\u0060 also satisfies \u0060err.contains(\u0022blocked\u0022)\u0060, so the \u0060||\u0060 chain is already decided by the latter. The expression is equivalent to the chain without it, which means it is wider than it reads. Delete the dead operand, or narrow the surviving one if IT is the accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/teams/tests.rs"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"af580079f74651bc10a26cdd0b0b8a2689f0767bc0dc1f9089b9f712c94d902e"}},{"ruleId":"X9","level":"note","message":{"text":"Subsumed condition operand: \u0060err.contains(\u0022insert blocked by test trigger\u0022)\u0060 can never decide this \u0060||\u0060 \u2014 every value satisfying \u0060err.contains(\u0022insert blocked by test trigger\u0022)\u0060 also satisfies \u0060err.contains(\u0022blocked\u0022)\u0060, so the \u0060||\u0060 chain is already decided by the latter. The expression is equivalent to the chain without it, which means it is wider than it reads. Delete the dead operand, or narrow the surviving one if IT is the accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"desktop/src-tauri/src/commands/personas/pending.rs"},"region":{"startLine":575}}}],"partialFingerprints":{"codehealthFindingId/v1":"1434e2f4a352f4915686c9bfb16381def3ecd8d86cc42e96bed13a717bc7d4a2"}}],"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-1032","guid":"5f21e517-68aa-a650-9a25-5771ef024637","name":"OWASP Top Ten \u2014 Security Misconfiguration category","shortDescription":{"text":"OWASP Top Ten \u2014 Security Misconfiguration category"},"helpUri":"https://cwe.mitre.org/data/definitions/1032.html"},{"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-125","guid":"98717707-96bf-ca5b-9568-8d1d257574c1","name":"CWE-125","shortDescription":{"text":"CWE-125"},"helpUri":"https://cwe.mitre.org/data/definitions/125.html"},{"id":"CWE-1357","guid":"e4d2e772-757e-0a5c-bd7d-77052949d866","name":"Reliance on Insufficiently Trustworthy Component","shortDescription":{"text":"Reliance on Insufficiently Trustworthy Component"},"helpUri":"https://cwe.mitre.org/data/definitions/1357.html"},{"id":"CWE-1395","guid":"800e09e7-c11a-8654-9fa6-86f398995fed","name":"Dependency on Vulnerable Third-Party Component","shortDescription":{"text":"Dependency on Vulnerable Third-Party Component"},"helpUri":"https://cwe.mitre.org/data/definitions/1395.html"},{"id":"CWE-16","guid":"659db3ea-affc-8453-8add-c1218fbfcb92","name":"Configuration","shortDescription":{"text":"Configuration"},"helpUri":"https://cwe.mitre.org/data/definitions/16.html"},{"id":"CWE-250","guid":"52ee12e8-390a-7351-b1e6-388afa694e54","name":"CWE-250","shortDescription":{"text":"CWE-250"},"helpUri":"https://cwe.mitre.org/data/definitions/250.html"},{"id":"CWE-259","guid":"ae9ad959-fbb6-9d5e-892d-3dca66da0b69","name":"Use of Hard-coded Password","shortDescription":{"text":"Use of Hard-coded Password"},"helpUri":"https://cwe.mitre.org/data/definitions/259.html"},{"id":"CWE-353","guid":"09d7e902-d4ee-f05d-ae6c-0a1554d0c18f","name":"CWE-353","shortDescription":{"text":"CWE-353"},"helpUri":"https://cwe.mitre.org/data/definitions/353.html"},{"id":"CWE-494","guid":"b8a65e0d-e459-4a55-a931-fc1136482375","name":"Download of Code Without Integrity Check","shortDescription":{"text":"Download of Code Without Integrity Check"},"helpUri":"https://cwe.mitre.org/data/definitions/494.html"},{"id":"CWE-506","guid":"401d6455-56e3-0552-9a39-f77461673e3f","name":"CWE-506","shortDescription":{"text":"CWE-506"},"helpUri":"https://cwe.mitre.org/data/definitions/506.html"},{"id":"CWE-522","guid":"71fb233e-ce6a-ae57-9419-ef8373540b09","name":"CWE-522","shortDescription":{"text":"CWE-522"},"helpUri":"https://cwe.mitre.org/data/definitions/522.html"},{"id":"CWE-732","guid":"1da27e8f-b330-7650-ab63-bd61953eae5d","name":"Incorrect Permission Assignment for Critical Resource","shortDescription":{"text":"Incorrect Permission Assignment for Critical Resource"},"helpUri":"https://cwe.mitre.org/data/definitions/732.html"},{"id":"CWE-77","guid":"332c8ade-6612-9f56-a06b-d8d90b1a8750","name":"Command Injection","shortDescription":{"text":"Command Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/77.html"},{"id":"CWE-78","guid":"2e31ceaf-c7ae-2e5e-9661-cfb1362789cf","name":"OS Command Injection","shortDescription":{"text":"OS Command Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/78.html"},{"id":"CWE-79","guid":"fd45580b-e8c4-fc5e-8c2f-aa8fab0b4dbf","name":"Cross-site Scripting (XSS)","shortDescription":{"text":"Cross-site Scripting (XSS)"},"helpUri":"https://cwe.mitre.org/data/definitions/79.html"},{"id":"CWE-798","guid":"5e8f057d-fee3-995a-a0cb-9fc5b0d174d1","name":"Use of Hard-coded Credentials","shortDescription":{"text":"Use of Hard-coded Credentials"},"helpUri":"https://cwe.mitre.org/data/definitions/798.html"},{"id":"CWE-829","guid":"13c33925-97fb-5a5e-b40c-56d328b8a4d7","name":"CWE-829","shortDescription":{"text":"CWE-829"},"helpUri":"https://cwe.mitre.org/data/definitions/829.html"},{"id":"CWE-89","guid":"6d08fdad-37eb-c150-bbf0-d7d946863407","name":"SQL Injection","shortDescription":{"text":"SQL Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/89.html"},{"id":"CWE-937","guid":"16f316ae-415c-b354-a59b-1f7905f756e9","name":"Using Components with Known Vulnerabilities","shortDescription":{"text":"Using Components with Known Vulnerabilities"},"helpUri":"https://cwe.mitre.org/data/definitions/937.html"},{"id":"CWE-939","guid":"12397742-f2c4-8254-8012-482c3356c551","name":"CWE-939","shortDescription":{"text":"CWE-939"},"helpUri":"https://cwe.mitre.org/data/definitions/939.html"},{"id":"CWE-94","guid":"75e7f50c-6c2f-dd52-bf40-bf6c52b861fd","name":"Code Injection","shortDescription":{"text":"Code Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/94.html"}]}],"properties":{"codehealthPublication":{"public":true,"notice":"This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings \u2014 which rule fired, in which file, on which line, and how to fix it \u2014 are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.","securityFindingsRedacted":121,"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."]}]}