{"$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":"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":"D14","name":"License Compliance","shortDescription":{"text":"License Compliance"},"helpUri":"https://codehealth.canine.dev/dimensions/D14"},{"id":"D15","name":"Churn \u00D7 Complexity Hotspots","shortDescription":{"text":"Churn \u00D7 Complexity Hotspots"},"helpUri":"https://codehealth.canine.dev/dimensions/D15"},{"id":"D16","name":"Bus Factor","shortDescription":{"text":"Bus Factor"},"helpUri":"https://codehealth.canine.dev/dimensions/D16"},{"id":"D17","name":"Explicit Debt","shortDescription":{"text":"Explicit Debt"},"helpUri":"https://codehealth.canine.dev/dimensions/D17"},{"id":"D19","name":"Documentation Quality","shortDescription":{"text":"Documentation Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D19"},{"id":"D20","name":"ADR Quality","shortDescription":{"text":"ADR Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D20"},{"id":"D21","name":"Naming Consistency","shortDescription":{"text":"Naming Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D21"},{"id":"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":"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":"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":"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":"AX5","name":"Architecture \u0026 structure","shortDescription":{"text":"Architecture \u0026 structure"},"helpUri":"https://codehealth.canine.dev/dimensions/AX5"},{"id":"AXB2","name":"Runtime readiness","shortDescription":{"text":"Runtime readiness"},"helpUri":"https://codehealth.canine.dev/dimensions/AXB2"},{"id":"ED5","name":"Idempotency","shortDescription":{"text":"Idempotency"},"helpUri":"https://codehealth.canine.dev/dimensions/ED5"},{"id":"GD1","name":"Unfinished \u0026 placeholder code","shortDescription":{"text":"Unfinished \u0026 placeholder code"},"helpUri":"https://codehealth.canine.dev/dimensions/GD1"},{"id":"IC1","name":"Incompleteness \u0026 stubs","shortDescription":{"text":"Incompleteness \u0026 stubs"},"helpUri":"https://codehealth.canine.dev/dimensions/IC1"},{"id":"M1","name":"Documentation (README)","shortDescription":{"text":"Documentation (README)"},"helpUri":"https://codehealth.canine.dev/dimensions/M1"},{"id":"M2","name":"Architecture documentation","shortDescription":{"text":"Architecture documentation"},"helpUri":"https://codehealth.canine.dev/dimensions/M2"},{"id":"M3","name":"Folder \u0026 project structure","shortDescription":{"text":"Folder \u0026 project structure"},"helpUri":"https://codehealth.canine.dev/dimensions/M3"},{"id":"M4","name":"Documentation accuracy","shortDescription":{"text":"Documentation accuracy"},"helpUri":"https://codehealth.canine.dev/dimensions/M4"},{"id":"P1","name":"CI/CD gates","shortDescription":{"text":"CI/CD gates"},"helpUri":"https://codehealth.canine.dev/dimensions/P1"},{"id":"P12","name":"CI test-gate honesty","shortDescription":{"text":"CI test-gate honesty"},"helpUri":"https://codehealth.canine.dev/dimensions/P12"},{"id":"P3","name":"Security \u0026 performance tooling","shortDescription":{"text":"Security \u0026 performance tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/P3"},{"id":"P4","name":"Deployment \u0026 Rollback","shortDescription":{"text":"Deployment \u0026 Rollback"},"helpUri":"https://codehealth.canine.dev/dimensions/P4"},{"id":"P6","name":"Release Hygiene","shortDescription":{"text":"Release Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/P6"},{"id":"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":"R5","name":"Dependency Freshness","shortDescription":{"text":"Dependency Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/R5"},{"id":"R6","name":"Tooling","shortDescription":{"text":"Tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/R6"},{"id":"R7","name":"Dead Code","shortDescription":{"text":"Dead Code"},"helpUri":"https://codehealth.canine.dev/dimensions/R7"},{"id":"R8","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/R8"},{"id":"R9","name":"Circular Imports","shortDescription":{"text":"Circular Imports"},"helpUri":"https://codehealth.canine.dev/dimensions/R9"},{"id":"SC1","name":"Supply-chain hygiene","shortDescription":{"text":"Supply-chain hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/SC1"},{"id":"X1","name":"Async correctness","shortDescription":{"text":"Async correctness"},"helpUri":"https://codehealth.canine.dev/dimensions/X1"},{"id":"X12","name":"Unreachable branch","shortDescription":{"text":"Unreachable branch"},"helpUri":"https://codehealth.canine.dev/dimensions/X12"},{"id":"X13","name":"Undrained process stream","shortDescription":{"text":"Undrained process stream"},"helpUri":"https://codehealth.canine.dev/dimensions/X13"},{"id":"X14","name":"Bypassable address classification","shortDescription":{"text":"Bypassable address classification"},"helpUri":"https://codehealth.canine.dev/dimensions/X14"},{"id":"X15","name":"Unvalidated length from an untrusted reader","shortDescription":{"text":"Unvalidated length from an untrusted reader"},"helpUri":"https://codehealth.canine.dev/dimensions/X15"},{"id":"X16","name":"Unfloored truncation loop","shortDescription":{"text":"Unfloored truncation loop"},"helpUri":"https://codehealth.canine.dev/dimensions/X16"},{"id":"X17","name":"Uncapped recursion over a caller-supplied document","shortDescription":{"text":"Uncapped recursion over a caller-supplied document"},"helpUri":"https://codehealth.canine.dev/dimensions/X17"},{"id":"X18","name":"Disposal-pattern correctness","shortDescription":{"text":"Disposal-pattern correctness"},"helpUri":"https://codehealth.canine.dev/dimensions/X18"},{"id":"X19","name":"Unrestored process-global state","shortDescription":{"text":"Unrestored process-global state"},"helpUri":"https://codehealth.canine.dev/dimensions/X19"},{"id":"X20","name":"Mistyped argument guard","shortDescription":{"text":"Mistyped argument guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X20"},{"id":"X21","name":"Side-effecting pattern guard","shortDescription":{"text":"Side-effecting pattern guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X21"},{"id":"X22","name":"Contradicted release guard","shortDescription":{"text":"Contradicted release guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X22"},{"id":"X23","name":"Unguarded diagnostic materialisation","shortDescription":{"text":"Unguarded diagnostic materialisation"},"helpUri":"https://codehealth.canine.dev/dimensions/X23"},{"id":"X25","name":"Inert configuration knob","shortDescription":{"text":"Inert configuration knob"},"helpUri":"https://codehealth.canine.dev/dimensions/X25"},{"id":"X26","name":"Unsynchronised callback handoff","shortDescription":{"text":"Unsynchronised callback handoff"},"helpUri":"https://codehealth.canine.dev/dimensions/X26"},{"id":"X28","name":"Index access outside its own emptiness guard","shortDescription":{"text":"Index access outside its own emptiness guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X28"},{"id":"X29","name":"Per-element action decided by a fixed element","shortDescription":{"text":"Per-element action decided by a fixed element"},"helpUri":"https://codehealth.canine.dev/dimensions/X29"},{"id":"X3","name":"Exception handling","shortDescription":{"text":"Exception handling"},"helpUri":"https://codehealth.canine.dev/dimensions/X3"},{"id":"X30","name":"Support guard that admits what it rejects","shortDescription":{"text":"Support guard that admits what it rejects"},"helpUri":"https://codehealth.canine.dev/dimensions/X30"},{"id":"X32","name":"Type resolved by simple name across every loaded assembly","shortDescription":{"text":"Type resolved by simple name across every loaded assembly"},"helpUri":"https://codehealth.canine.dev/dimensions/X32"},{"id":"X4","name":"Structured logging","shortDescription":{"text":"Structured logging"},"helpUri":"https://codehealth.canine.dev/dimensions/X4"},{"id":"X9","name":"Subsumed condition operand","shortDescription":{"text":"Subsumed condition operand"},"helpUri":"https://codehealth.canine.dev/dimensions/X9"}]}},"results":[{"ruleId":"D1","level":"warning","message":{"text":"InputPrompt.InputPrompt (cyclomatic 350): InputPrompt.InputPrompt has cyclomatic complexity 350 (threshold 15). Of this number, 41 points are the body\u0027s own statements and 309 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":"packages/cli/src/ui/components/InputPrompt.tsx"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"83c3d1c7788c8ff4095accdac5a07163223add5d4ab53a0a88e9584c5f7f54de"}},{"ruleId":"D1","level":"warning","message":{"text":"AppContainer.AppContainer (cyclomatic 276): AppContainer.AppContainer has cyclomatic complexity 276 (threshold 15). Of this number, 71 points are the body\u0027s own statements and 205 belong to 53 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":"packages/cli/src/ui/AppContainer.tsx"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb1c404826ba89be8a046bb5cae08fed0758a255d2b36d427e08a4baebaf5b76"}},{"ruleId":"D1","level":"warning","message":{"text":"useGeminiStream.useGeminiStream (cyclomatic 261): useGeminiStream.useGeminiStream has cyclomatic complexity 261 (threshold 15). Most of this is not in the body itself: 2 of the 261 points are its own statements and the rest belongs to 45 function literals inside it that branch (lines 452, 1973, 1534, \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":"packages/cli/src/ui/hooks/useGeminiStream.ts"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0648f215f988f39184a118459c77b5987cb4c2335f895bb027d265ef3b282fc"}},{"ruleId":"D1","level":"warning","message":{"text":"vim-buffer-actions.handleVimAction (cyclomatic 246): vim-buffer-actions.handleVimAction has cyclomatic complexity 246 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/shared/vim-buffer-actions.ts"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e0ec7e7fcf54482967ee9f5049c4f95ddcbc8b410d9c077401d797ec0accd36"}},{"ruleId":"D1","level":"warning","message":{"text":"vim.useVim (cyclomatic 213): vim.useVim has cyclomatic complexity 213 (threshold 15). Most of this is not in the body itself: 1 of the 213 points is its own statement and the rest belongs to 6 function literals inside it that branch (lines 660, 230, 473, \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":"packages/cli/src/ui/hooks/vim.ts"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"b25d39c2d200a6d6a9dfd1241cad10f370a5700e91f8770a7059617c8bdf777e"}},{"ruleId":"D1","level":"warning","message":{"text":"text-buffer.textBufferReducerLogic (cyclomatic 182): text-buffer.textBufferReducerLogic has cyclomatic complexity 182 (threshold 15). Of this number, 176 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":"packages/cli/src/ui/components/shared/text-buffer.ts"},"region":{"startLine":1787}}}],"partialFingerprints":{"codehealthFindingId/v1":"e979cb98d0ba997eb4140888f577290abf0001b9e814e1951cc8d84bbad61820"}},{"ruleId":"D1","level":"warning","message":{"text":"ToolConfirmationMessage.ToolConfirmationMessage (cyclomatic 156): ToolConfirmationMessage.ToolConfirmationMessage has cyclomatic complexity 156 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 136 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":"packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"f268cf39834bbf945f8f3069805e82f981b4e66f0537e48f8b88145069ee14b7"}},{"ruleId":"D1","level":"warning","message":{"text":"sandbox.start_sandbox (cyclomatic 146): sandbox.start_sandbox has cyclomatic complexity 146 (threshold 15). Of this number, 131 points are the body\u0027s own statements and 15 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":"packages/cli/src/utils/sandbox.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d87d59163521b1a68d238139c66bd99c2b96b40769b8c46c6d40894b9a0f6e7"}},{"ruleId":"D1","level":"warning","message":{"text":"ShellToolInvocation.execute (cyclomatic 130): ShellToolInvocation.execute has cyclomatic complexity 130 (threshold 15). Of this number, 106 points are the body\u0027s own statements and 24 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":"packages/core/src/tools/shell.ts"},"region":{"startLine":523}}}],"partialFingerprints":{"codehealthFindingId/v1":"9867565a8f3369b79199cdcd405b1441dbe9760aaf448fa21ed6fe8f546f5b6a"}},{"ruleId":"D1","level":"warning","message":{"text":"TriageDuplicates.TriageDuplicates (cyclomatic 124): TriageDuplicates.TriageDuplicates has cyclomatic complexity 124 (threshold 15). Of this number, 31 points are the body\u0027s own statements and 93 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":"packages/cli/src/ui/components/triage/TriageDuplicates.tsx"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b3231decba6fc43ff6360df3615b3809d337347c06d2e5e84af3b060fffe832"}},{"ruleId":"D1","level":"warning","message":{"text":"nonInteractiveCliAgentSession.runNonInteractive (cyclomatic 118): nonInteractiveCliAgentSession.runNonInteractive has cyclomatic complexity 118 (threshold 15). Most of this is not in the body itself: 1 of the 118 points is its own statement and the rest belongs to 10 function literals inside it that branch (lines 82, 371, 151, \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":"packages/cli/src/nonInteractiveCliAgentSession.ts"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"6754787fc6f2a3a92ce6d12b6a465e35dc1626076b480a2bd1c57fc3156e0df3"}},{"ruleId":"D1","level":"warning","message":{"text":"InboxDialog.InboxDialog (cyclomatic 118): InboxDialog.InboxDialog has cyclomatic complexity 118 (threshold 15). Of this number, 41 points are the body\u0027s own statements and 77 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":"packages/cli/src/ui/components/InboxDialog.tsx"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc05d818c333bf050dcb1d4d189813bfa63d9a4a3f545cf9843cce8bb38d7e90"}},{"ruleId":"D1","level":"warning","message":{"text":"VirtualizedList.VirtualizedList (cyclomatic 106): VirtualizedList.VirtualizedList has cyclomatic complexity 106 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 82 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":"packages/cli/src/ui/components/shared/VirtualizedList.tsx"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa5de1e25ae6e135e16411a073a79aff33d5e370d2830b42955aaf01c51b764e"}},{"ruleId":"D1","level":"warning","message":{"text":"config.loadCliConfig (cyclomatic 101): config.loadCliConfig has cyclomatic complexity 101 (threshold 15). Of this number, 98 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":"packages/cli/src/config/config.ts"},"region":{"startLine":583}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f97939164b88c65ad0e20bd78da2bf2bd3024f695d18d4fb50bacf8e8d4726d"}},{"ruleId":"D1","level":"warning","message":{"text":"nonInteractiveCli.runNonInteractive (cyclomatic 94): nonInteractiveCli.runNonInteractive has cyclomatic complexity 94 (threshold 15). Most of this is not in the body itself: 2 of the 94 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 85, 154, 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":"packages/cli/src/nonInteractiveCli.ts"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"b42681ed4d2241bcb038dca0caa7468a13466a981f179f7c524b6cf323936434"}},{"ruleId":"D1","level":"warning","message":{"text":"Session.#resolvePrompt (cyclomatic 91): Session.#resolvePrompt has cyclomatic complexity 91 (threshold 15). Of this number, 83 points are the body\u0027s own statements and 8 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":"packages/cli/src/acp/acpSession.ts"},"region":{"startLine":969}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7c177bbe6dc5e6dd0c12785d12d3cea2559377890d8eb25ceda57c6f15301ca"}},{"ruleId":"D1","level":"warning","message":{"text":"KeypressContext.emitKeys (cyclomatic 91): KeypressContext.emitKeys has cyclomatic complexity 91 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/contexts/KeypressContext.tsx"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"1db4816d2eaa3609b9ada86253df6e94895288119adf526f2ab2245102789186"}},{"ruleId":"D1","level":"warning","message":{"text":"AskUserDialog.ChoiceQuestionView (cyclomatic 87): AskUserDialog.ChoiceQuestionView has cyclomatic complexity 87 (threshold 15). Most of this is not in the body itself: 15 of the 87 points are its own statements and the rest belongs to 14 function literals inside it that branch (lines 921, 673, 796, \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":"packages/cli/src/ui/components/AskUserDialog.tsx"},"region":{"startLine":520}}}],"partialFingerprints":{"codehealthFindingId/v1":"98945f2ba1fecb50dbf6922f499609cf3f06d2edd01e0e7b4c2913b9b0bff140"}},{"ruleId":"D1","level":"warning","message":{"text":"ToolGroupMessage.ToolGroupMessage (cyclomatic 83): ToolGroupMessage.ToolGroupMessage has cyclomatic complexity 83 (threshold 15). Most of this is not in the body itself: 15 of the 83 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 353, 182, 163, \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":"packages/cli/src/ui/components/messages/ToolGroupMessage.tsx"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d40a1c4e3e996161aa582707a109f8117d7e4fb8d12eec254d19817f384cdf2"}},{"ruleId":"D1","level":"warning","message":{"text":"ShellExecutionService.executeWithPty (cyclomatic 79): ShellExecutionService.executeWithPty has cyclomatic complexity 79 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 57 belong to 20 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":"packages/core/src/services/shellExecutionService.ts"},"region":{"startLine":1103}}}],"partialFingerprints":{"codehealthFindingId/v1":"356219a8370ad29ba8e5e7bb03628b52a9ae5a6a9d8509c6a9b8d58eeb30b818"}},{"ruleId":"D1","level":"warning","message":{"text":"chatRecordingService.loadConversationRecord (cyclomatic 78): chatRecordingService.loadConversationRecord has cyclomatic complexity 78 (threshold 15). Of this number, 74 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":"packages/core/src/services/chatRecordingService.ts"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a16e93b7c6c82675996a054db8576ef2eefd105cb35d204b977a58fc5d6b7e3"}},{"ruleId":"D1","level":"warning","message":{"text":"useExecutionLifecycle.useExecutionLifecycle (cyclomatic 76): useExecutionLifecycle.useExecutionLifecycle has cyclomatic complexity 76 (threshold 15). Most of this is not in the body itself: 2 of the 76 points are its own statements and the rest belongs to 16 function literals inside it that branch (lines 365, 425, 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":"packages/cli/src/ui/hooks/useExecutionLifecycle.ts"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2d93c94190be4f5adcab3fda12289d908775fbc005e26c3422fa39f6cc462b2"}},{"ruleId":"D1","level":"warning","message":{"text":"slashCommandProcessor.useSlashCommandProcessor (cyclomatic 75): slashCommandProcessor.useSlashCommandProcessor has cyclomatic complexity 75 (threshold 15). Most of this is not in the body itself: 1 of the 75 points is its own statement and the rest belongs to 13 function literals inside it that branch (lines 355, 159, 585, \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":"packages/cli/src/ui/hooks/slashCommandProcessor.ts"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"45e2a7d56b44824a96763d846912d41b4a1d7f69d0ecff370def2bb3add62035"}},{"ruleId":"D1","level":"warning","message":{"text":"useCommandCompletion.useCommandCompletion (cyclomatic 74): useCommandCompletion.useCommandCompletion has cyclomatic complexity 74 (threshold 15). Most of this is not in the body itself: 14 of the 74 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 121, 405, 253, \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":"packages/cli/src/ui/hooks/useCommandCompletion.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"b80598254993dc5e092676b981c8d6732e0b0f09db407e9490fd4ac81c226a2d"}},{"ruleId":"D1","level":"warning","message":{"text":"gemini.main (cyclomatic 71): gemini.main has cyclomatic complexity 71 (threshold 15). Of this number, 66 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":"packages/cli/src/gemini.tsx"},"region":{"startLine":466}}}],"partialFingerprints":{"codehealthFindingId/v1":"c58fd84d66f3123b41367ba06af317c91c0b8f0dca3169dfc595dd35455505c5"}},{"ruleId":"D1","level":"warning","message":{"text":"BaseSettingsDialog.BaseSettingsDialog (cyclomatic 71): BaseSettingsDialog.BaseSettingsDialog has cyclomatic complexity 71 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 53 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":"packages/cli/src/ui/components/shared/BaseSettingsDialog.tsx"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"e82eaae6d622446c5a9b636a4a85d978cd4eae9b6f5f1a6a1d55c4346f8e5b59"}},{"ruleId":"D1","level":"warning","message":{"text":"StatusRow.StatusRow (cyclomatic 70): StatusRow.StatusRow has cyclomatic complexity 70 (threshold 15). Of this number, 50 points are the body\u0027s own statements and 20 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":"packages/cli/src/ui/components/StatusRow.tsx"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"e80dc69ab93e28a35b6ac745155977e523ab0833c86c82780ad55eda2dd55798"}},{"ruleId":"D1","level":"warning","message":{"text":"text-buffer.useTextBuffer (cyclomatic 69): text-buffer.useTextBuffer has cyclomatic complexity 69 (threshold 15). Most of this is not in the body itself: 4 of the 69 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 3372, 2948, 3552, \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":"packages/cli/src/ui/components/shared/text-buffer.ts"},"region":{"startLine":2832}}}],"partialFingerprints":{"codehealthFindingId/v1":"e52e0c2018495099c73a3276026a0e9ffe5ae3a49f0ceede124b496393e6f3c4"}},{"ruleId":"D1","level":"warning","message":{"text":"useVoiceMode.useVoiceMode (cyclomatic 68): useVoiceMode.useVoiceMode has cyclomatic complexity 68 (threshold 15). Most of this is not in the body itself: 1 of the 68 points is its own statement and the rest belongs to 12 function literals inside it that branch (lines 319, 131, 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":"packages/cli/src/ui/hooks/useVoiceMode.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"131ec7dbb9c95eee954f2a6de4f47ce7b6dbcc2599a717e3660330d5a8628a24"}},{"ruleId":"D1","level":"warning","message":{"text":"GeminiChat.processStreamResponse (cyclomatic 68): GeminiChat.processStreamResponse has cyclomatic complexity 68 (threshold 15). Of this number, 66 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":"packages/core/src/core/geminiChat.ts"},"region":{"startLine":1354}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f4765293135946800ee9a2382109692e88bec0eafb5859aab7aa5f486000e22"}},{"ruleId":"D1","level":"warning","message":{"text":"CoderAgentExecutor.execute (cyclomatic 65): CoderAgentExecutor.execute has cyclomatic complexity 65 (threshold 15). Most of this is not in the body itself: 12 of the 65 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 490, 565, 524, \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":"packages/a2a-server/src/agent/executor.ts"},"region":{"startLine":439}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca55e45aa7b3765142c92242ed5cdf2e055a44b195adc24a6ee16a8a6e4c625b"}},{"ruleId":"D1","level":"warning","message":{"text":"useAgentStream.useAgentStream (cyclomatic 64): useAgentStream.useAgentStream has cyclomatic complexity 64 (threshold 15). Most of this is not in the body itself: 2 of the 64 points are its own statements and the rest belongs to 14 function literals inside it that branch (lines 149, 485, 412, \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":"packages/cli/src/ui/hooks/useAgentStream.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"d720ea6bb6053cea7f17b82eb20363b9dff41c5f1b302568bd1e1d273c92e706"}},{"ruleId":"D1","level":"warning","message":{"text":"PolicyEngine.check (cyclomatic 61): PolicyEngine.check has cyclomatic complexity 61 (threshold 15). Of this number, 58 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":"packages/core/src/policy/policy-engine.ts"},"region":{"startLine":600}}}],"partialFingerprints":{"codehealthFindingId/v1":"f34bd5a481f1606890f9418b12b51355d555584d1d95658b2b96c75d8ff5faa9"}},{"ruleId":"D1","level":"warning","message":{"text":"ExtensionManager.installOrUpdateExtension (cyclomatic 60): ExtensionManager.installOrUpdateExtension has cyclomatic complexity 60 (threshold 15). Of this number, 58 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":"packages/cli/src/config/extension-manager.ts"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecd782ee8d2c7313fef73a170f0e4f0e6f7465d841f975e2c19dcdf7b91f8508"}},{"ruleId":"D1","level":"warning","message":{"text":"LocalSessionInvocation.execute (cyclomatic 60): LocalSessionInvocation.execute has cyclomatic complexity 60 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 39 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":"packages/core/src/agents/local-session-invocation.ts"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"568f8a54233119102f41c11af30d2121b182b34793b2eb861d403cdd15175689"}},{"ruleId":"D1","level":"warning","message":{"text":"Footer.Footer (cyclomatic 59): Footer.Footer has cyclomatic complexity 59 (threshold 15). Of this number, 47 points are the body\u0027s own statements and 12 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":"packages/cli/src/ui/components/Footer.tsx"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"a37e6cd2068d4ae39a9e221a33a63d3a324a330b2044d7fcbcaf3028db84687c"}},{"ruleId":"D1","level":"warning","message":{"text":"ContextCompressionService.compressHistory (cyclomatic 57): ContextCompressionService.compressHistory has cyclomatic complexity 57 (threshold 15). Of this number, 56 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":"packages/core/src/context/contextCompressionService.ts"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9db10dcb5adeb74b1c69adebaacc451d8f53fffaaaad6839b0186451b8ea3ad"}},{"ruleId":"D1","level":"warning","message":{"text":"googleQuotaErrors.classifyGoogleError (cyclomatic 57): googleQuotaErrors.classifyGoogleError 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":"packages/core/src/utils/googleQuotaErrors.ts"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e7a8f0850fa29ec153ecb0ea8217549b3277b1ea4428c811ffaaff69ca32d5b"}},{"ruleId":"D1","level":"warning","message":{"text":"TriageIssues.TriageIssues (cyclomatic 56): TriageIssues.TriageIssues has cyclomatic complexity 56 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 36 belong to 13 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":"packages/cli/src/ui/components/triage/TriageIssues.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"497dbd1cb829c2caee402b8480505d025c35f930caa7e3705c240f5fc3a6fb72"}},{"ruleId":"D1","level":"warning","message":{"text":"App.App (cyclomatic 56): App.App has cyclomatic complexity 56 (threshold 15). Of this number, 16 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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"004b25b232a7baeeed2e23b182b25f455d4a7f7b12509e8aae47c9108b411f32"}},{"ruleId":"D1","level":"warning","message":{"text":"BrowserAgentInvocation.execute (cyclomatic 55): BrowserAgentInvocation.execute has cyclomatic complexity 55 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 32 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":"packages/core/src/agents/browser/browserAgentInvocation.ts"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"edcf41cb3f6182ec91de2b4209700c68a1091e009eea9b8b5ae9ee081b4d6595"}},{"ruleId":"D1","level":"warning","message":{"text":"retry.retryWithBackoff (cyclomatic 55): retry.retryWithBackoff has cyclomatic complexity 55 (threshold 15). 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, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/retry.ts"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"d70bb3acafac8bd62fa440e786373e54a1595a21cbf54f35150f51c1189f1a61"}},{"ruleId":"D1","level":"warning","message":{"text":"LocalSubagentInvocation.execute (cyclomatic 54): LocalSubagentInvocation.execute has cyclomatic complexity 54 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 35 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":"packages/core/src/agents/local-invocation.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcc51554aaf3eba7265ca72b1ddd3886b600827426346ad9467c0d69699063a7"}},{"ruleId":"D1","level":"warning","message":{"text":"patch-create-comment.main (cyclomatic 54): patch-create-comment.main 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":"scripts/releasing/patch-create-comment.js"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"70a4b99a99a2613bf5e283befbfded175a316a5ba2301721bbcfa8e8c3a8a436"}},{"ruleId":"D1","level":"warning","message":{"text":"McpStatus.McpStatus (cyclomatic 53): McpStatus.McpStatus has cyclomatic complexity 53 (threshold 15). Most of this is not in the body itself: 4 of the 53 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 89, 284, 220, \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":"packages/cli/src/ui/components/views/McpStatus.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"c30469e26fbb5626af7e579547f7e32a1c80978c90b89626a4f70f155d03dc86"}},{"ruleId":"D1","level":"warning","message":{"text":"useSlashCompletion.useCommandSuggestions (cyclomatic 52): useSlashCompletion.useCommandSuggestions has cyclomatic complexity 52 (threshold 15). Most of this is not in the body itself: 1 of the 52 points is its own statement and the rest belongs to 7 function literals inside it that branch (lines 278, 229, 173, \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":"packages/cli/src/ui/hooks/useSlashCompletion.ts"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"93e3b401133717adb06dff2b2b0bb91a1af4ff4451d82b6786fb2df057379e03"}},{"ruleId":"D1","level":"warning","message":{"text":"Session.prompt (cyclomatic 51): Session.prompt 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":"packages/cli/src/acp/acpSession.ts"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f86f52e2502d3e1c1dee559a19b22eab9e0f07a42faeaab6fa554a3e7df8eb2"}},{"ruleId":"D1","level":"warning","message":{"text":"GeminiClient.processTurn (cyclomatic 51): GeminiClient.processTurn 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":"packages/core/src/core/client.ts"},"region":{"startLine":614}}}],"partialFingerprints":{"codehealthFindingId/v1":"69f84aa65bad5b2ad1160c8bfe2a2e0a990dc38c0252800a9c4cc26600c221a1"}},{"ruleId":"D1","level":"warning","message":{"text":"contentGenerator.createContentGenerator (cyclomatic 50): contentGenerator.createContentGenerator 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 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":"packages/core/src/core/contentGenerator.ts"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5c9de60f0d959b8a7f191892fddf7fa625fc33e31233fa021fb831972a8ffa1"}},{"ruleId":"D1","level":"warning","message":{"text":"GeminiChat.sendMessageStream (cyclomatic 50): GeminiChat.sendMessageStream has cyclomatic complexity 50 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 29 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":"packages/core/src/core/geminiChat.ts"},"region":{"startLine":480}}}],"partialFingerprints":{"codehealthFindingId/v1":"308a8f0ea127a1a7045cecb86045425b87824a3b818e2841d4a59be9ff89ab2b"}},{"ruleId":"D1","level":"warning","message":{"text":"ExtensionManager._buildExtension (cyclomatic 48): ExtensionManager._buildExtension has cyclomatic complexity 48 (threshold 15). Of this number, 47 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":"packages/cli/src/config/extension-manager.ts"},"region":{"startLine":708}}}],"partialFingerprints":{"codehealthFindingId/v1":"2499d948db88c65368c83e11f5710394ceab7a7e957204681f0f3d7165fc0258"}},{"ruleId":"D1","level":"warning","message":{"text":"BackgroundTaskDisplay.BackgroundTaskDisplay (cyclomatic 48): BackgroundTaskDisplay.BackgroundTaskDisplay has cyclomatic complexity 48 (threshold 15). Most of this is not in the body itself: 7 of the 48 points are its own statements and the rest belongs to 14 function literals inside it that branch (lines 146, 228, 111, \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":"packages/cli/src/ui/components/BackgroundTaskDisplay.tsx"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"797f249024c759cbdf7eb71e820f355e381c684a8abc76c29a74e87f486125e2"}},{"ruleId":"D1","level":"warning","message":{"text":"GrepToolInvocation.performGrepSearch (cyclomatic 47): GrepToolInvocation.performGrepSearch has cyclomatic complexity 47 (threshold 15). Of this number, 41 points are the body\u0027s own statements and 6 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":"packages/core/src/tools/grep.ts"},"region":{"startLine":413}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3cda868189d761fc962ce069a852e2e3204adff1983f0b87f758875ed9d42cf"}},{"ruleId":"D1","level":"warning","message":{"text":"consent.extensionConsentString (cyclomatic 46): consent.extensionConsentString 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":"packages/cli/src/config/extensions/consent.ts"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e86180c370406f8f1bee046d377a953ed0b24a9b646e10797d9b8926d943323"}},{"ruleId":"D1","level":"warning","message":{"text":"ScrollProvider.ScrollProvider (cyclomatic 46): ScrollProvider.ScrollProvider has cyclomatic complexity 46 (threshold 15). Most of this is not in the body itself: 1 of the 46 points is its own statement and the rest belongs to 7 function literals inside it that branch (lines 258, 190, 360, \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":"packages/cli/src/ui/contexts/ScrollProvider.tsx"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ccfad035f8ece329a65834dd097202802d97e582d5a1fa63a2681b34e46083a"}},{"ruleId":"D1","level":"warning","message":{"text":"ActivityLogger.patchNodeHttp (cyclomatic 46): ActivityLogger.patchNodeHttp has cyclomatic complexity 46 (threshold 15). Most of this is not in the body itself: 1 of the 46 points is its own statement and the rest belongs to 9 function literals inside it that branch (lines 447, 529, 508, \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":"packages/cli/src/utils/activityLogger.ts"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"34e8fceac79f04f0080a3d31467ff9e6ae6359f33477e3cd0419b4d323d5f84c"}},{"ruleId":"D1","level":"warning","message":{"text":"config.createPolicyEngineConfig (cyclomatic 46): config.createPolicyEngineConfig has cyclomatic complexity 46 (threshold 15). Of this number, 35 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":"packages/core/src/policy/config.ts"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"a18ef3f7112882d9e8a9064039c2f7849a496cb36fa9f339f3fa907c4b6932b3"}},{"ruleId":"D1","level":"warning","message":{"text":"memoryService.startMemoryService (cyclomatic 46): memoryService.startMemoryService has cyclomatic complexity 46 (threshold 15). Of this number, 38 points are the body\u0027s own statements and 8 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":"packages/core/src/services/memoryService.ts"},"region":{"startLine":1133}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d284608c3b252c76621c8653fef3e7f25fe70e3c12cffc9a49da7052bdb5b51"}},{"ruleId":"D1","level":"warning","message":{"text":"MarkdownDisplay.MarkdownDisplayInternal (cyclomatic 44): MarkdownDisplay.MarkdownDisplayInternal has cyclomatic complexity 44 (threshold 15). Most of this is not in the body itself: 10 of the 44 points are its own statements and the rest belongs to one function literal inside it that branches (line 88). 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":"packages/cli/src/ui/utils/MarkdownDisplay.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e4f46695ee6dbd5b0f5cc0482dbc78df89118689c525b7081774d2364d15129"}},{"ruleId":"D1","level":"warning","message":{"text":"ShellExecutionService.childProcessFallback (cyclomatic 44): ShellExecutionService.childProcessFallback has cyclomatic complexity 44 (threshold 15). Most of this is not in the body itself: 15 of the 44 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 768, 838, 728, \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":"packages/core/src/services/shellExecutionService.ts"},"region":{"startLine":652}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac69650cf63cdd6a426cc64022373947e180866b6e933ebaafb8252638f0402b"}},{"ruleId":"D1","level":"warning","message":{"text":"DenseToolMessage.DenseToolMessage (cyclomatic 43): DenseToolMessage.DenseToolMessage has cyclomatic complexity 43 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 26 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":"packages/cli/src/ui/components/messages/DenseToolMessage.tsx"},"region":{"startLine":261}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a0e18b2d8161235f01ea535101b07353354c1840185cc1dfe21be989acd2f91"}},{"ruleId":"D1","level":"warning","message":{"text":"useQuotaAndFallback.useQuotaAndFallback (cyclomatic 42): useQuotaAndFallback.useQuotaAndFallback 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 6 function literals inside it that branch (lines 75, 293, 321, \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":"packages/cli/src/ui/hooks/useQuotaAndFallback.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ae3d79fa198c28b282d6343fedb8c7eb388707278358d5677eebe579b69ccbf"}},{"ruleId":"D1","level":"warning","message":{"text":"LocalAgentExecutor.runInternal (cyclomatic 41): LocalAgentExecutor.runInternal has cyclomatic complexity 41 (threshold 15). Of this number, 38 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":"packages/core/src/agents/local-executor.ts"},"region":{"startLine":571}}}],"partialFingerprints":{"codehealthFindingId/v1":"0298a242189be5dac5a882f00e362ccaa5584d9a7b6dcf4a7fc0a284607f82b9"}},{"ruleId":"D1","level":"warning","message":{"text":"sea-launch.prepareRuntime (cyclomatic 41): sea-launch.prepareRuntime has cyclomatic complexity 41 (threshold 15). Of this number, 33 points are the body\u0027s own statements and 8 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":"sea/sea-launch.cjs"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"1db3781fa7f195d26e860b0cd230220f109d473d8e54540e3d1683cf6e542650"}},{"ruleId":"D1","level":"warning","message":{"text":"config.parseArguments (cyclomatic 40): config.parseArguments has cyclomatic complexity 40 (threshold 15). Most of this is not in the body itself: 12 of the 40 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 230, 192, 183, \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":"packages/cli/src/config/config.ts"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a579d39674d586167901980a139b3de08c253ec83f056227e252e879a11f77d"}},{"ruleId":"D1","level":"warning","message":{"text":"SettingsDialog.SettingsDialog (cyclomatic 40): SettingsDialog.SettingsDialog has cyclomatic complexity 40 (threshold 15). Most of this is not in the body itself: 6 of the 40 points are its own statements and the rest belongs to 14 function literals inside it that branch (lines 300, 222, 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":"packages/cli/src/ui/components/SettingsDialog.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1177e45f70a63eae11cb07fef836e4a3fe5452010991633ac38c4e47616237e"}},{"ruleId":"D1","level":"warning","message":{"text":"policy-engine.ruleMatches (cyclomatic 40): policy-engine.ruleMatches 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":"packages/core/src/policy/policy-engine.ts"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"31974f6cab0f093bfe01ec90a9d9a3835619d6d6ad9435ceae48351e415efc08"}},{"ruleId":"D1","level":"warning","message":{"text":"setup.handleSetup (cyclomatic 39): setup.handleSetup 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":"packages/cli/src/commands/gemma/setup.ts"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"50cae8e9af3b8da2623a0d76e2a876010e4e1c8b6b6520eb142be0cab2096282"}},{"ruleId":"D1","level":"warning","message":{"text":"text-buffer.findWordEndInLine (cyclomatic 39): text-buffer.findWordEndInLine has cyclomatic complexity 39 (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":"packages/cli/src/ui/components/shared/text-buffer.ts"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"d856b2fdf7714f463ded5af402068554cc53c7602b00b8d116ceefcf7504a4a3"}},{"ruleId":"D1","level":"warning","message":{"text":"MCPOAuthProvider.authenticate (cyclomatic 39): MCPOAuthProvider.authenticate 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":"packages/core/src/mcp/oauth-provider.ts"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"f07fda0e9e40eec25684e38aad8f25b3a3c1ab813240ae6117fd359098b93dc5"}},{"ruleId":"D1","level":"warning","message":{"text":"settings.migrateDeprecatedSettings (cyclomatic 38): settings.migrateDeprecatedSettings has cyclomatic complexity 38 (threshold 15). Most of this is not in the body itself: 4 of the 38 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 1044, 1011). 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":"packages/cli/src/config/settings.ts"},"region":{"startLine":1001}}}],"partialFingerprints":{"codehealthFindingId/v1":"327c4753e19122d78004a18b036e8d3202ce80803dbf2ccb3c54d4d0d4df53e0"}},{"ruleId":"D1","level":"warning","message":{"text":"SubagentGroupDisplay.SubagentGroupDisplay (cyclomatic 38): SubagentGroupDisplay.SubagentGroupDisplay has cyclomatic complexity 38 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 22 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":"packages/cli/src/ui/components/messages/SubagentGroupDisplay.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"55c39cfa970085b33899131cbed18396297b6269eb25310ebd1f54d8a20c1b74"}},{"ruleId":"D1","level":"warning","message":{"text":"markdownParsingUtils.parseMarkdownToANSI (cyclomatic 38): markdownParsingUtils.parseMarkdownToANSI has cyclomatic complexity 38 (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":"packages/cli/src/ui/utils/markdownParsingUtils.ts"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b2aca5e069d83d74bdf6d679278d73de65414387ad215d566f51b77958ac2c6"}},{"ruleId":"D1","level":"warning","message":{"text":"sessionCleanup.cleanupExpiredSessions (cyclomatic 38): sessionCleanup.cleanupExpiredSessions has cyclomatic complexity 38 (threshold 15). Of this number, 36 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":"packages/cli/src/utils/sessionCleanup.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"834309a6a39d6a9f6848671e7696678570e05f2abf41575add8b0d5e972bf202"}},{"ruleId":"D1","level":"warning","message":{"text":"config.createPolicyUpdater (cyclomatic 38): config.createPolicyUpdater has cyclomatic complexity 38 (threshold 15). Most of this is not in the body itself: 1 of the 38 points is its own statement and the rest belongs to 2 function literals inside it that branch (lines 796, 722). 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":"packages/core/src/policy/config.ts"},"region":{"startLine":712}}}],"partialFingerprints":{"codehealthFindingId/v1":"67dbfca2cc22541624ac71a8b58ec6ef72d4a0b3b332db961f37058e33659246"}},{"ruleId":"D1","level":"warning","message":{"text":"mcp-client.connectToMcpServer (cyclomatic 38): mcp-client.connectToMcpServer has cyclomatic complexity 38 (threshold 15). 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, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/mcp-client.ts"},"region":{"startLine":1839}}}],"partialFingerprints":{"codehealthFindingId/v1":"10efc49068867a4de809bab9dac632418d8df11aaa707984f4281fd3c9071aa3"}},{"ruleId":"D1","level":"warning","message":{"text":"patch-trigger.main (cyclomatic 38): patch-trigger.main 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":"scripts/releasing/patch-trigger.js"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"53db5725ace15da4f26766e42ff9980fb0841a6f1f9e4fa793232381645556be"}},{"ruleId":"D1","level":"warning","message":{"text":"DialogManager.DialogManager (cyclomatic 37): DialogManager.DialogManager 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, 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":"packages/cli/src/ui/components/DialogManager.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c03d7e6f0a5eb091efbed4c2af658d9b517fd6b1e75edc358e9c9309072d735"}},{"ruleId":"D1","level":"warning","message":{"text":"HistoryItemDisplay.HistoryItemDisplay (cyclomatic 37): HistoryItemDisplay.HistoryItemDisplay has cyclomatic complexity 37 (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":"packages/cli/src/ui/components/HistoryItemDisplay.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"e17547cc017e1bef3aeb8967b8dbc1025b392a1649b2b4981e4308e6c813ca01"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelDialog.ModelDialog (cyclomatic 37): ModelDialog.ModelDialog has cyclomatic complexity 37 (threshold 15). Most of this is not in the body itself: 4 of the 37 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 192, 75, 106, \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":"packages/cli/src/ui/components/ModelDialog.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfb48ae0c0d8aa74e469ee02db8136e089507e6ce609ca88677da52d0ef47634"}},{"ruleId":"D1","level":"warning","message":{"text":"ExtensionDetails.ExtensionDetails (cyclomatic 37): ExtensionDetails.ExtensionDetails has cyclomatic complexity 37 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 15 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":"packages/cli/src/ui/components/views/ExtensionDetails.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3efb2038d980e3e565a9315ca247c6fb4e6b327ab354d4ceb4b05106db9e1ec"}},{"ruleId":"D1","level":"warning","message":{"text":"ReadManyFilesToolInvocation.execute (cyclomatic 37): ReadManyFilesToolInvocation.execute has cyclomatic complexity 37 (threshold 15). Of this number, 29 points are the body\u0027s own statements and 8 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":"packages/core/src/tools/read-many-files.ts"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dee9efdf7f9048237c0aa8ce20294825baf54e9bd9e374e0e846071c3980fc7"}},{"ruleId":"D1","level":"warning","message":{"text":"LoadingIndicator.LoadingIndicator (cyclomatic 36): LoadingIndicator.LoadingIndicator has cyclomatic complexity 36 (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":"packages/cli/src/ui/components/LoadingIndicator.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"824e65aabdc817c41a60568e13cfd7098eff4855faa5f87d355f729d6f32d0ff"}},{"ruleId":"D1","level":"warning","message":{"text":"usePromptCompletion.usePromptCompletion (cyclomatic 36): usePromptCompletion.usePromptCompletion has cyclomatic complexity 36 (threshold 15). Most of this is not in the body itself: 1 of the 36 points is its own statement and the rest belongs to 6 function literals inside it that branch (lines 68, 204, 167, \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":"packages/cli/src/ui/hooks/usePromptCompletion.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0e9b4eadfda24852fa537044070072fca70a519791661284b174341d84c3cf2"}},{"ruleId":"D1","level":"warning","message":{"text":"ContextWorkingBufferImpl.syncPristineHistory (cyclomatic 36): ContextWorkingBufferImpl.syncPristineHistory has cyclomatic complexity 36 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 15 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":"packages/core/src/context/pipeline/contextWorkingBuffer.ts"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"b91a13ab7a3bcf4d77b94fe25491bef4c4fe75213ef77cd6ce2cd6887186c8db"}},{"ruleId":"D1","level":"warning","message":{"text":"GeminiClient.getIdeContextParts (cyclomatic 36): GeminiClient.getIdeContextParts 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":"packages/core/src/core/client.ts"},"region":{"startLine":429}}}],"partialFingerprints":{"codehealthFindingId/v1":"e04a0415d35f16698158331ca1556c04d9de295f21bfb1677f94482d64b2e0ce"}},{"ruleId":"D1","level":"warning","message":{"text":"toml-loader.loadPoliciesFromToml (cyclomatic 36): toml-loader.loadPoliciesFromToml has cyclomatic complexity 36 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 12 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":"packages/core/src/policy/toml-loader.ts"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3fb9db54587befb6aa6edb2bb3f171c1023f77fbe5856cad9aa4c67ae6c54f8"}},{"ruleId":"D1","level":"warning","message":{"text":"SessionBrowser.useSessionBrowserInput (cyclomatic 35): SessionBrowser.useSessionBrowserInput 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 3 function literals inside it that branch (lines 551, 624, 640). 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":"packages/cli/src/ui/components/SessionBrowser.tsx"},"region":{"startLine":542}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cb140a976f9e683760d99574235b934a2bacf24ab062e536a0fd2e6137a4c5d"}},{"ruleId":"D1","level":"warning","message":{"text":"activityLogger.setupNetworkLogging (cyclomatic 35): activityLogger.setupNetworkLogging 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 10 function literals inside it that branch (lines 764, 877, 801, \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":"packages/cli/src/utils/activityLogger.ts"},"region":{"startLine":734}}}],"partialFingerprints":{"codehealthFindingId/v1":"79f414cd34ac519ae8ff68b0d3e99855353276028473b3867520a93e02d2d8fb"}},{"ruleId":"D1","level":"warning","message":{"text":"sandbox.start_lxc_sandbox (cyclomatic 35): sandbox.start_lxc_sandbox has cyclomatic complexity 35 (threshold 15). Of this number, 29 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":"packages/cli/src/utils/sandbox.ts"},"region":{"startLine":1039}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cfdb59e6d74d642a6e4ef5b2b00c26f198af5775deec30ff58fdf41676e737b"}},{"ruleId":"D1","level":"warning","message":{"text":"untrustedContextTracker.findUntrustedFlags (cyclomatic 35): untrustedContextTracker.findUntrustedFlags has cyclomatic complexity 35 (threshold 15). Of this number, 28 points are the body\u0027s own statements and 7 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":"packages/core/src/utils/untrustedContextTracker.ts"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"9512b45872666d1c17f97a05652283f444acc15db7a847c4215391c7602169e3"}},{"ruleId":"D1","level":"warning","message":{"text":"ToolResultDisplay.ToolResultDisplay (cyclomatic 34): ToolResultDisplay.ToolResultDisplay has cyclomatic complexity 34 (threshold 15). Most of this is not in the body itself: 13 of the 34 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 102, 271). 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":"packages/cli/src/ui/components/messages/ToolResultDisplay.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"21f13dbc4625e75328af73333428c83c06511cbb62ca8f5375ba5706e1b18a26"}},{"ruleId":"D1","level":"warning","message":{"text":"useAtCompletion.useAtCompletion (cyclomatic 34): useAtCompletion.useAtCompletion has cyclomatic complexity 34 (threshold 15). Most of this is not in the body itself: 1 of the 34 points is its own statement and the rest belongs to 11 function literals inside it that branch (lines 357, 274, 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":"packages/cli/src/ui/hooks/useAtCompletion.ts"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"f10cccc8a00dc7cf5f6582b529136ede723934a534c1064bcca7a61daa9d284e"}},{"ruleId":"D1","level":"warning","message":{"text":"installationInfo.getInstallationInfo (cyclomatic 34): installationInfo.getInstallationInfo 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":"packages/cli/src/utils/installationInfo.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"d906f4572b5f052ec6ec64597a0ac41da00de73c64369620fb673341159f9de9"}},{"ruleId":"D1","level":"warning","message":{"text":"LegacyAgentProtocol._runLoop (cyclomatic 34): LegacyAgentProtocol._runLoop has cyclomatic complexity 34 (threshold 15). Of this number, 33 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":"packages/core/src/agent/legacy-agent-session.ts"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"5105942b4d2d4df5fe9036a967c7359a6963c5dfd4d70631f4033796735d216c"}},{"ruleId":"D1","level":"warning","message":{"text":"models.resolveModel (cyclomatic 34): models.resolveModel 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":"packages/core/src/config/models.ts"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"59adca5b7f257589a3cd7c9f82a0547f14d81705a9115ee4acff169fd6f9b3f0"}},{"ruleId":"D1","level":"warning","message":{"text":"historyHardening.pairToolsAndEnforceSignatures (cyclomatic 34): historyHardening.pairToolsAndEnforceSignatures 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":"packages/core/src/utils/historyHardening.ts"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c269f83255091150a5333ab18a7e23690ac507316e01a165ec6272a46ae5fa3"}},{"ruleId":"D1","level":"warning","message":{"text":"GeminiSandbox.Main (cyclomatic 33): GeminiSandbox.Main has cyclomatic complexity 33 (threshold 15). Of this number, 32 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":"packages/core/src/sandbox/windows/GeminiSandbox.cs"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"55cf26ef35fab6c193740bc2ceb519f2efea625974c0c38dcf61bdef221f4224"}},{"ruleId":"D1","level":"warning","message":{"text":"AskUserDialog.AskUserDialog (cyclomatic 33): AskUserDialog.AskUserDialog has cyclomatic complexity 33 (threshold 15). Of this number, 16 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":"packages/cli/src/ui/components/AskUserDialog.tsx"},"region":{"startLine":1026}}}],"partialFingerprints":{"codehealthFindingId/v1":"062976e80088ddd129cabfbf7876a5a3de0d136512f8452b50e4770609959ee9"}},{"ruleId":"D1","level":"warning","message":{"text":"borderStyles.getToolGroupBorderAppearance (cyclomatic 33): borderStyles.getToolGroupBorderAppearance has cyclomatic complexity 33 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 16 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":"packages/cli/src/ui/utils/borderStyles.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"41de8d42b8f36aac24a286ee4aeca4606e0688766870857bcfe0678ff626f0e9"}},{"ruleId":"D1","level":"warning","message":{"text":"GeminiChat.makeApiCallAndProcessStream (cyclomatic 33): GeminiChat.makeApiCallAndProcessStream has cyclomatic complexity 33 (threshold 15). Most of this is not in the body itself: 3 of the 33 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 917, 1098, 1122). 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":"packages/core/src/core/geminiChat.ts"},"region":{"startLine":870}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2f1bf1d6277086b921cec18b85337b425cfe1e393957b2a56e09b7df197e0eb"}},{"ruleId":"D1","level":"warning","message":{"text":"App.NetworkView (cyclomatic 33): App.NetworkView has cyclomatic complexity 33 (threshold 15). Most of this is not in the body itself: 7 of the 33 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 931, 889, 1081, \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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":831}}}],"partialFingerprints":{"codehealthFindingId/v1":"54b36ec8da6f1945f6f28961594644cbec891580914e0da20a1034b73b085a76"}},{"ruleId":"D1","level":"warning","message":{"text":"McpPromptLoader.loadCommands (cyclomatic 32): McpPromptLoader.loadCommands has cyclomatic complexity 32 (threshold 15). Most of this is not in the body itself: 8 of the 32 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 152, 57, 88, \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":"packages/cli/src/services/McpPromptLoader.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e0a29c41555a672745d2823f11fc8b251bde8ba734d09e100587393f09d0c65"}},{"ruleId":"D1","level":"warning","message":{"text":"MainContent.MainContent (cyclomatic 32): MainContent.MainContent has cyclomatic complexity 32 (threshold 15). Most of this is not in the body itself: 3 of the 32 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 157, 85, 256, \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":"packages/cli/src/ui/components/MainContent.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cd4de399712e9971e9a5aa552f6a44a3c703319833a210d10a1129bbe575c81"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelStatsDisplay.ModelStatsDisplay (cyclomatic 32): ModelStatsDisplay.ModelStatsDisplay has cyclomatic complexity 32 (threshold 15). Of this number, 20 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":"packages/cli/src/ui/components/ModelStatsDisplay.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"e336d438d4456c477c072204577c1ebc92033eb88590c6a8c0e0732cc3a9a9a0"}},{"ruleId":"D1","level":"warning","message":{"text":"atCommandProcessor.resolveFilePaths (cyclomatic 32): atCommandProcessor.resolveFilePaths 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":"packages/cli/src/ui/hooks/atCommandProcessor.ts"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"660fa3953d9c63381f5bc232c7fbf713571468181895eba6b71d16a61d47402b"}},{"ruleId":"D1","level":"warning","message":{"text":"AgentSession.stream (cyclomatic 32): AgentSession.stream has cyclomatic complexity 32 (threshold 15). 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, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/agent/agent-session.ts"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"4360ad31cc4dfdac7c1686e2230ccb51dfd4c077290d00884656635bebd9bb4e"}},{"ruleId":"D1","level":"warning","message":{"text":"oauth2.initOauthClient (cyclomatic 32): oauth2.initOauthClient has cyclomatic complexity 32 (threshold 15). Of this number, 29 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":"packages/core/src/code_assist/oauth2.ts"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e824071066bea66f928480cda8be88b047901613bb8f8c4eae87ab8a3976a46"}},{"ruleId":"D1","level":"warning","message":{"text":"Turn.run (cyclomatic 32): Turn.run 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":"packages/core/src/core/turn.ts"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"844ff9d885772e358557ba987750bf1cfc7512f6e96cb5c4ea252baacaff3b95"}},{"ruleId":"D1","level":"warning","message":{"text":"McpClientManager.maybeDiscoverMcpServer (cyclomatic 32): McpClientManager.maybeDiscoverMcpServer has cyclomatic complexity 32 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 10 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":"packages/core/src/tools/mcp-client-manager.ts"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d723c29c8c4b18ae4267b94d1c4f168a798f0aca789e47d695a08130cc96a8c"}},{"ruleId":"D1","level":"warning","message":{"text":"telemetry_utils.ensureBinary (cyclomatic 32): telemetry_utils.ensureBinary has cyclomatic complexity 32 (threshold 15). Of this number, 22 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":"scripts/telemetry_utils.js"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9dfdd89b0ba0eb676eb7b896edef984e60f7c18bab6defe3d598f3dd3ef15ee"}},{"ruleId":"D1","level":"warning","message":{"text":"Composer.Composer (cyclomatic 31): Composer.Composer has cyclomatic complexity 31 (threshold 15). Of this number, 28 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":"packages/cli/src/ui/components/Composer.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"293bdb44ebb53db77fcbbc571eaa02a45f365315c5bf55f4b717c86f65206eb0"}},{"ruleId":"D1","level":"warning","message":{"text":"ConfigExtensionDialog.ConfigExtensionDialog (cyclomatic 31): ConfigExtensionDialog.ConfigExtensionDialog has cyclomatic complexity 31 (threshold 15). Most of this is not in the body itself: 10 of the 31 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 126, 211, 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":"packages/cli/src/ui/components/ConfigExtensionDialog.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cbeed1c93068ee9df62c741d879f7d8fcd12a102709745bb38a7c56680cba78"}},{"ruleId":"D1","level":"warning","message":{"text":"ThemeDialog.ThemeDialog (cyclomatic 31): ThemeDialog.ThemeDialog has cyclomatic complexity 31 (threshold 15). Of this number, 17 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":"packages/cli/src/ui/components/ThemeDialog.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cd06c3546e4887b0b5f511f05ad9ce9c199ac9993f6ba0ff84839d918fde9a4"}},{"ruleId":"D1","level":"warning","message":{"text":"useShellCompletion.useShellCompletion (cyclomatic 31): useShellCompletion.useShellCompletion has cyclomatic complexity 31 (threshold 15). Most of this is not in the body itself: 5 of the 31 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 489, 616, 458, \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":"packages/cli/src/ui/hooks/useShellCompletion.ts"},"region":{"startLine":443}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab487585c2789099824fd41998ac55224f8778084b1ceaaaf146f8de31259389"}},{"ruleId":"D1","level":"warning","message":{"text":"toolMaskingProcessor.createToolMaskingProcessor (cyclomatic 31): toolMaskingProcessor.createToolMaskingProcessor has cyclomatic complexity 31 (threshold 15). Most of this is not in the body itself: 1 of the 31 points is its own statement and the rest belongs to 3 function literals inside it that branch (lines 92, 160, 112). 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":"packages/core/src/context/processors/toolMaskingProcessor.ts"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d0ac3ad7c399b50dd2c00e61905b37015a14e5d48389142df2fdd95e3dfc17b"}},{"ruleId":"D1","level":"warning","message":{"text":"SnapshotGenerator.synthesizeSnapshot (cyclomatic 31): SnapshotGenerator.synthesizeSnapshot 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":"packages/core/src/context/utils/snapshotGenerator.ts"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"e501d21440229c51f39914f76a7b9d9cc03edd9bc225c87b2830cdcdb9b5f9b0"}},{"ruleId":"D1","level":"warning","message":{"text":"ShellToolInvocation.shouldConfirmExecute (cyclomatic 31): ShellToolInvocation.shouldConfirmExecute has cyclomatic complexity 31 (threshold 15). Of this number, 27 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":"packages/core/src/tools/shell.ts"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"311602c867d3aa58b022a0428f3006e3fd5e85babc8890b9ac4210f626daeecd"}},{"ruleId":"D1","level":"warning","message":{"text":"paths.shortenPath (cyclomatic 31): paths.shortenPath has cyclomatic complexity 31 (threshold 15). Most of this is not in the body itself: 10 of the 31 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 71, 162, 209, \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":"packages/core/src/utils/paths.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"e886e562315622a6bdd7142b6c2a2494916ff1c93a90dfd870750b50502fc132"}},{"ruleId":"D1","level":"warning","message":{"text":"FooterConfigDialog.FooterConfigDialog (cyclomatic 30): FooterConfigDialog.FooterConfigDialog has cyclomatic complexity 30 (threshold 15). Most of this is not in the body itself: 5 of the 30 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 338, 185, 168, \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":"packages/cli/src/ui/components/FooterConfigDialog.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c26c493ee364d6322323bb6c3e69c57f3eba8cedd6eb7195e3585a16ba24f05"}},{"ruleId":"D1","level":"warning","message":{"text":"RewindViewer.RewindViewer (cyclomatic 30): RewindViewer.RewindViewer has cyclomatic complexity 30 (threshold 15). Most of this is not in the body itself: 5 of the 30 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 260, 100, 242, \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":"packages/cli/src/ui/components/RewindViewer.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2ed21a2b754c3f874eb90893aab1813e61dfbbaa1de9b6b63c2b345257d0a43"}},{"ruleId":"D1","level":"warning","message":{"text":"editorUtils.openFileInEditor (cyclomatic 30): editorUtils.openFileInEditor has cyclomatic complexity 30 (threshold 15). Of this number, 27 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":"packages/cli/src/ui/utils/editorUtils.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"96e49270849fa86f92851ff6ce5184cf577c1eb861d693e8e99fcd18fc2f22cd"}},{"ruleId":"D1","level":"warning","message":{"text":"sandboxUtils.isSensitiveHostPath (cyclomatic 30): sandboxUtils.isSensitiveHostPath has cyclomatic complexity 30 (threshold 15). Of this number, 27 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":"packages/cli/src/utils/sandboxUtils.ts"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"2884a70fda6e2fcfa389c2e1c3d920e8e29f003b16902c787a9235ac5866e097"}},{"ruleId":"D1","level":"warning","message":{"text":"policyHelpers.resolvePolicyChain (cyclomatic 30): policyHelpers.resolvePolicyChain 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":"packages/core/src/availability/policyHelpers.ts"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"6010838bea7f0095fb4927149ad078a6f708836e7afaf4966166f618931edba8"}},{"ruleId":"D1","level":"warning","message":{"text":"IDEServer.start (cyclomatic 30): IDEServer.start has cyclomatic complexity 30 (threshold 15). Most of this is not in the body itself: 1 of the 30 points is its own statement and the rest belongs to 11 function literals inside it that branch (lines 213, 295, 174, \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":"packages/vscode-ide-companion/src/ide-server.ts"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea7a6d8c6c7064f714764ed130b99f4e146da7f18675a85423dc2ff44aad5982"}},{"ruleId":"D1","level":"warning","message":{"text":"patch-comment.main (cyclomatic 30): patch-comment.main 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":"scripts/releasing/patch-comment.js"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5cfafa87c10c94b332c77eb52ceca66f6494c9d0416e7ad5949cc5fd07aa635"}},{"ruleId":"D1","level":"warning","message":{"text":"useSelectionList.useSelectionList (cyclomatic 29): useSelectionList.useSelectionList 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 6 function literals inside it that branch (lines 391, 352, 314, \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":"packages/cli/src/ui/hooks/useSelectionList.ts"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd496e4007713a24766df8f844b713fe5973efd4dd6f87e27e74809ed5e7848f"}},{"ruleId":"D1","level":"warning","message":{"text":"sessionCleanup.cleanupToolOutputFiles (cyclomatic 29): sessionCleanup.cleanupToolOutputFiles has cyclomatic complexity 29 (threshold 15). Of this number, 26 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":"packages/cli/src/utils/sessionCleanup.ts"},"region":{"startLine":479}}}],"partialFingerprints":{"codehealthFindingId/v1":"77149f03684a3f482adc7bd8df8d8b1174c4ead6e4330e9dd35db2cd3f82dcd4"}},{"ruleId":"D1","level":"warning","message":{"text":"sdk.initializeTelemetry (cyclomatic 29): sdk.initializeTelemetry has cyclomatic complexity 29 (threshold 15). Of this number, 28 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":"packages/core/src/telemetry/sdk.ts"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"2538e25eb72bfcaabe79198ff1899b3c6ac83ad5fef59de444a49a83e5a7d6db"}},{"ruleId":"D1","level":"warning","message":{"text":"googleErrors.parseGoogleApiError (cyclomatic 29): googleErrors.parseGoogleApiError 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":"packages/core/src/utils/googleErrors.ts"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"42dd3db68529ab35a1718304c6436463b21543bcde9aaeab1125c4e61bc7bfeb"}},{"ruleId":"D1","level":"warning","message":{"text":"Orchestrator.run (cyclomatic 29): Orchestrator.run 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":"tools/caretaker-agent/cloudrun/pr-generator/workflow/orchestrator.py"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"12044d8d4e63595490adfc432ce715934a24cfe78832e8890287da6948f01da2"}},{"ruleId":"D1","level":"warning","message":{"text":"DiffRenderer.renderDiffLines (cyclomatic 28): DiffRenderer.renderDiffLines has cyclomatic complexity 28 (threshold 15). Most of this is not in the body itself: 9 of the 28 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 292, 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":"packages/cli/src/ui/components/messages/DiffRenderer.tsx"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"70c305a255d9db79a7e87a54f0567ddccdbb3fb2b9f7666b7de815871136e2b7"}},{"ruleId":"D1","level":"warning","message":{"text":"ToolGroupDisplay.ToolDisplayMessage (cyclomatic 28): ToolGroupDisplay.ToolDisplayMessage 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":"packages/cli/src/ui/components/messages/ToolGroupDisplay.tsx"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"97eb0b73eceaa7cc4f0b18f93f56775f101552eb9e4cb921d227972d7d613fca"}},{"ruleId":"D1","level":"warning","message":{"text":"BrowserManager.connectMcp (cyclomatic 28): BrowserManager.connectMcp 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, 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":"packages/core/src/agents/browser/browserManager.ts"},"region":{"startLine":559}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6dac1dca1204a986f2d51dea54d1b0713635611f3d1ae88d966bbe27017c0bc"}},{"ruleId":"D1","level":"warning","message":{"text":"render.render (cyclomatic 28): render.render 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":"packages/core/src/context/graph/render.ts"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a514ede09d108e92ab192489a8eac2db7d09c725256c25d40c3bf830beb7b47"}},{"ruleId":"D1","level":"warning","message":{"text":"GeminiClient.sendMessageStream (cyclomatic 28): GeminiClient.sendMessageStream 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":"packages/core/src/core/client.ts"},"region":{"startLine":910}}}],"partialFingerprints":{"codehealthFindingId/v1":"172d9aa0987ad7638058540298522abd84f9b9fba37f1df6433dfe4cf655a413"}},{"ruleId":"D1","level":"warning","message":{"text":"PolicyEngine.checkShellCommand (cyclomatic 28): PolicyEngine.checkShellCommand 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":"packages/core/src/policy/policy-engine.ts"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"4332d83457a6f178e2b8963b4834adda577d294f841d6fc2f7c086c1937311a0"}},{"ruleId":"D1","level":"warning","message":{"text":"memoryImportProcessor.processImports (cyclomatic 28): memoryImportProcessor.processImports 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":"packages/core/src/utils/memoryImportProcessor.ts"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a44245bda770fe785a802518204c9193a348e038fb3a0f49886ea13c17f9a33"}},{"ruleId":"D1","level":"warning","message":{"text":"security.isFileAndDirectorySecureSync (cyclomatic 28): security.isFileAndDirectorySecureSync has cyclomatic complexity 28 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 6 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":"packages/core/src/utils/security.ts"},"region":{"startLine":591}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8eb928c8fea034d1929fa6861200a6d8c7300c7ff70221b0671dbc905ca2c2a"}},{"ruleId":"D1","level":"warning","message":{"text":"Session.runTool (cyclomatic 27): Session.runTool has cyclomatic complexity 27 (threshold 15). Of this number, 25 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":"packages/cli/src/acp/acpSession.ts"},"region":{"startLine":659}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c59b56587f0875a48c0d2b77703b7a7f245a4a6ef2df6c2ef1fdee684289ba1"}},{"ruleId":"D1","level":"warning","message":{"text":"sandboxConfig.getSandboxCommand (cyclomatic 27): sandboxConfig.getSandboxCommand 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":"packages/cli/src/config/sandboxConfig.ts"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"a83f12b041efaed0e1ddd4f5495e9b14ede4f984baf19f8960e5175f5f05145e"}},{"ruleId":"D1","level":"warning","message":{"text":"MaxSizedBox.MaxSizedBox (cyclomatic 27): MaxSizedBox.MaxSizedBox has cyclomatic complexity 27 (threshold 15). 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: 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":"packages/cli/src/ui/components/shared/MaxSizedBox.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fd2f015d72de8360fdb22a24747acb9dd848c08d9b6e6659cdb571d4c022500"}},{"ruleId":"D1","level":"warning","message":{"text":"usePhraseCycler.usePhraseCycler (cyclomatic 27): usePhraseCycler.usePhraseCycler has cyclomatic complexity 27 (threshold 15). Most of this is not in the body itself: 4 of the 27 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 52, 81, 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":"packages/cli/src/ui/hooks/usePhraseCycler.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea121125d26a51355f37697feb63344dba639a33baffb8808e8ad69a3792d364"}},{"ruleId":"D1","level":"warning","message":{"text":"useShellCompletion.getTokenAtCursor (cyclomatic 27): useShellCompletion.getTokenAtCursor 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":"packages/cli/src/ui/hooks/useShellCompletion.ts"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc048f45d0fffc5a1326e9c09d5dbcf6e6d7ecb84006cbe1dbe46b0ff75941b5"}},{"ruleId":"D1","level":"warning","message":{"text":"event-translator.translateEvent (cyclomatic 27): event-translator.translateEvent has cyclomatic complexity 27 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/agent/event-translator.ts"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"731c49729661b0a01f8927089214a363da00ab15024fe8552869522019d727a8"}},{"ruleId":"D1","level":"warning","message":{"text":"WriteFileToolInvocation.execute (cyclomatic 27): WriteFileToolInvocation.execute 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":"packages/core/src/tools/write-file.ts"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"b166c2e36eba77c489407d5fc9a46370c7499524660090845efac5a6e80d57f8"}},{"ruleId":"D1","level":"warning","message":{"text":"paths.robustRealpath (cyclomatic 27): paths.robustRealpath 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":"packages/core/src/utils/paths.ts"},"region":{"startLine":459}}}],"partialFingerprints":{"codehealthFindingId/v1":"f27fe7c598fe1c320cb4aff1e6cd41a3c58bd8436b82029cd72fcbea0e975a04"}},{"ruleId":"D1","level":"warning","message":{"text":"summary.calc_summary (cyclomatic 27): summary.calc_summary 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":"tools/caretaker-agent/evals/triage/helpers/summary.py"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"386ca3ce931990a8863532d19f1ffa2d5ad77169ca6c29fa3991a565bc57cbdb"}},{"ruleId":"D1","level":"warning","message":{"text":"ContextSummaryDisplay.ContextSummaryDisplay (cyclomatic 26): ContextSummaryDisplay.ContextSummaryDisplay has cyclomatic complexity 26 (threshold 15). Most of this is not in the body itself: 9 of the 26 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 68, 57, 48, \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":"packages/cli/src/ui/components/ContextSummaryDisplay.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"daa3e0fbcd8e1fba57b5a29c14bfeb6020732227d94e5b06afd8cffdbf94823f"}},{"ruleId":"D1","level":"warning","message":{"text":"Notifications.Notifications (cyclomatic 26): Notifications.Notifications has cyclomatic complexity 26 (threshold 15). Most of this is not in the body itself: 11 of the 26 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 71, 55, 59, \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":"packages/cli/src/ui/components/Notifications.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e293806da34945f7b8478acbc632e651e849aa04b0e53a05c7b4a68030dd88d"}},{"ruleId":"D1","level":"warning","message":{"text":"useToolScheduler.useToolScheduler (cyclomatic 26): useToolScheduler.useToolScheduler 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 256, 130, 142, \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":"packages/cli/src/ui/hooks/useToolScheduler.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"73cc97da08516138a3a704d8e8a3352d5dcae238797c4b0bf38dc3cff5fc724f"}},{"ruleId":"D1","level":"warning","message":{"text":"sandboxUtils.isCredentialOrSensitivePath (cyclomatic 26): sandboxUtils.isCredentialOrSensitivePath has cyclomatic complexity 26 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 4 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":"packages/cli/src/utils/sandboxUtils.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8dd20b3c795ea907d6c9c8e697d9c2e2790c1692326d11d46f13502878d1018"}},{"ruleId":"D1","level":"warning","message":{"text":"ide-connection-utils.getConnectionConfigFromFile (cyclomatic 26): ide-connection-utils.getConnectionConfigFromFile has cyclomatic complexity 26 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 8 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":"packages/core/src/ide/ide-connection-utils.ts"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"44d0ce24a453c8af596e5d7fb49db0dea03ffc4fa37115742bbe64ace43f0426"}},{"ruleId":"D1","level":"warning","message":{"text":"fileUtils.processSingleFileContent (cyclomatic 26): fileUtils.processSingleFileContent has cyclomatic complexity 26 (threshold 15). 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, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/fileUtils.ts"},"region":{"startLine":492}}}],"partialFingerprints":{"codehealthFindingId/v1":"267d428b84db90d39a41dfaf34f09a09ccc4d5e6655d29d939bc8b159ab4f8db"}},{"ruleId":"D1","level":"warning","message":{"text":"generateContentResponseUtilities.convertToFunctionResponse (cyclomatic 26): generateContentResponseUtilities.convertToFunctionResponse 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":"packages/core/src/utils/generateContentResponseUtilities.ts"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d7f2c8a3d848b39bf94a4d631b835a793ae66def2c3d909ab04bb0965fefa7f"}},{"ruleId":"D1","level":"warning","message":{"text":"googleErrors.fromCauseError (cyclomatic 26): googleErrors.fromCauseError has cyclomatic complexity 26 (threshold 15). Of this number, 22 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":"packages/core/src/utils/googleErrors.ts"},"region":{"startLine":389}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ff1df6014d4293e761e52c9989940fead85069b304f4d5cb99e149ec938382f"}},{"ruleId":"D1","level":"warning","message":{"text":"process-utils.killProcessGroup (cyclomatic 26): process-utils.killProcessGroup has cyclomatic complexity 26 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/process-utils.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"3938d276f1b4b4c693570e56b06bfcdfa54840c285afff7b9c0a9e327c5e4745"}},{"ruleId":"D1","level":"warning","message":{"text":"sessionUtils.convertSessionToClientHistory (cyclomatic 26): sessionUtils.convertSessionToClientHistory 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":"packages/core/src/utils/sessionUtils.ts"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f7bc16c38958c39a7a6c82118269570589e64ef93599d8e0f634b189fa48a7f"}},{"ruleId":"D1","level":"warning","message":{"text":"untrustedContextTracker.extractUntrustedContext (cyclomatic 26): untrustedContextTracker.extractUntrustedContext 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":"packages/core/src/utils/untrustedContextTracker.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"da90ecc3344174ef3a4ee1e520512f1521edd6459776a683b2b854eaeba35bb8"}},{"ruleId":"D1","level":"warning","message":{"text":"eval-validate.validateInventory (cyclomatic 26): eval-validate.validateInventory has cyclomatic complexity 26 (threshold 15). Of this number, 23 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":"scripts/utils/eval-validate.ts"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3860c0aa15bc53aa719e1e7d7e0d121c6c0da19a35b7b4b92ec36b00d93a7b2"}},{"ruleId":"D1","level":"warning","message":{"text":"Task.acceptAgentMessage (cyclomatic 25): Task.acceptAgentMessage has cyclomatic complexity 25 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/a2a-server/src/agent/task.ts"},"region":{"startLine":821}}}],"partialFingerprints":{"codehealthFindingId/v1":"f820474f093cc668633fd8ce56ed8902920e869b92d617183cb2df31ebdd1744"}},{"ruleId":"D1","level":"warning","message":{"text":"Task._handleToolConfirmationPart (cyclomatic 25): Task._handleToolConfirmationPart 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":"packages/a2a-server/src/agent/task.ts"},"region":{"startLine":943}}}],"partialFingerprints":{"codehealthFindingId/v1":"24215aa5264a54e50657c1fe8303057d1725a49eff26db5c9399fc4b9b03eb33"}},{"ruleId":"D1","level":"warning","message":{"text":"gemini.setupUnhandledRejectionHandler (cyclomatic 25): gemini.setupUnhandledRejectionHandler 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 3 function literals inside it that branch (lines 225, 185, 300). 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":"packages/cli/src/gemini.tsx"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcd1cd4a351f6204313064a4566cd4db9124315159473fbfa7aaca3bb29c6847"}},{"ruleId":"D1","level":"warning","message":{"text":"AuthDialog.AuthDialog (cyclomatic 25): AuthDialog.AuthDialog has cyclomatic complexity 25 (threshold 15). 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 117, 97, 171, \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":"packages/cli/src/ui/auth/AuthDialog.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"afccfb051936cf8a6a3be59992870b62d2413b68572b1c73025d183c48e18632"}},{"ruleId":"D1","level":"warning","message":{"text":"useShellCompletion.resolvePathCompletions (cyclomatic 25): useShellCompletion.resolvePathCompletions has cyclomatic complexity 25 (threshold 15). Of this number, 23 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":"packages/cli/src/ui/hooks/useShellCompletion.ts"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"21a08d7d9431f0c512c0bf7262319f532c718430558651dbe6f6a1279476a24b"}},{"ruleId":"D1","level":"warning","message":{"text":"MockAgentProtocol.send (cyclomatic 25): MockAgentProtocol.send has cyclomatic complexity 25 (threshold 15). Of this number, 24 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":"packages/core/src/agent/mock.ts"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"72244ceeee5f6cfd4268388f20f9f489c5f4d6eeedb1a8bafeac4fc4ec6ff7ac"}},{"ruleId":"D1","level":"warning","message":{"text":"HookRunner.executeCommandHook (cyclomatic 25): HookRunner.executeCommandHook 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 434, 315, 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":"packages/core/src/hooks/hookRunner.ts"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"981a813b1f0bfb1420d4a178714826543a30bcde448b70670c056c93ac8416db"}},{"ruleId":"D1","level":"warning","message":{"text":"ToolRegistry.discoverAndRegisterToolsFromCommand (cyclomatic 25): ToolRegistry.discoverAndRegisterToolsFromCommand has cyclomatic complexity 25 (threshold 15). Of this number, 19 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":"packages/core/src/tools/tool-registry.ts"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"67674ed8e55c468c5596c14ea3998717314824c25d43353ff3394192393e5b2f"}},{"ruleId":"D1","level":"warning","message":{"text":"oauth-flow.parseTokenEndpointResponse (cyclomatic 25): oauth-flow.parseTokenEndpointResponse 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":"packages/core/src/utils/oauth-flow.ts"},"region":{"startLine":485}}}],"partialFingerprints":{"codehealthFindingId/v1":"83a09b91aeb54a70ef7a0aab68a4023a1914cbd97138e8a68d8d7e41e261be1d"}},{"ruleId":"D1","level":"warning","message":{"text":"github.isGitHubWebhookPayload (cyclomatic 25): github.isGitHubWebhookPayload 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":"tools/caretaker-agent/cloudrun/ingestion-service/auth/github.ts"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e3c06e5e05aeba7971330f283b6319a8e7d4402dff5251eac85007861729e6a"}},{"ruleId":"D1","level":"warning","message":{"text":"github.checkForExtensionUpdate (cyclomatic 24): github.checkForExtensionUpdate 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":"packages/cli/src/config/extensions/github.ts"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"611727bfc0bb695fea1f039e559adafddeae6256309c3936216f1f7c1648e54c"}},{"ruleId":"D1","level":"warning","message":{"text":"AgentConfigDialog.AgentConfigDialog (cyclomatic 24): AgentConfigDialog.AgentConfigDialog has cyclomatic complexity 24 (threshold 15). Most of this is not in the body itself: 2 of the 24 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 258, 335, 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":"packages/cli/src/ui/components/AgentConfigDialog.tsx"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a256b317b302b5b1833619405bbfee17e41e5673ec980a8b8ca4a76c9eb15d4"}},{"ruleId":"D1","level":"warning","message":{"text":"shellReducer.shellReducer (cyclomatic 24): shellReducer.shellReducer 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":"packages/cli/src/ui/hooks/shellReducer.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d5bcb902ef7d0b9bce78a66b34e6f2e9f6608a0ec39c022d17e5dab2d6b4eaf"}},{"ruleId":"D1","level":"warning","message":{"text":"CodeColorizer.colorizeCode (cyclomatic 24): CodeColorizer.colorizeCode has cyclomatic complexity 24 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 7 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":"packages/cli/src/ui/utils/CodeColorizer.tsx"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3150a63bb5a70e695ee3a9515ee9bf47eef30254dc1c667ae8b9624cc21a841"}},{"ruleId":"D1","level":"warning","message":{"text":"AgentRegistry.registerRemoteAgent (cyclomatic 24): AgentRegistry.registerRemoteAgent has cyclomatic complexity 24 (threshold 15). 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: 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":"packages/core/src/agents/registry.ts"},"region":{"startLine":453}}}],"partialFingerprints":{"codehealthFindingId/v1":"5248b6ea9c04032cb8499f41607ae7d612ab5d7ce8fccd397e8ff213de847ad8"}},{"ruleId":"D1","level":"warning","message":{"text":"ToolOutputMaskingService.mask (cyclomatic 24): ToolOutputMaskingService.mask 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":"packages/core/src/context/toolOutputMaskingService.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"a57ab5ee93518491412aa48ffe4f16a791658e9349617c8c9ed7ed8f913fe45d"}},{"ruleId":"D1","level":"warning","message":{"text":"mcp-client.createTransport (cyclomatic 24): mcp-client.createTransport 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":"packages/core/src/tools/mcp-client.ts"},"region":{"startLine":2265}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec770430d413ed9d117a127f9c3280df642ef4d091df2cef0592ce8d0b24b6c9"}},{"ruleId":"D1","level":"warning","message":{"text":"GrepToolInvocation.performRipgrepSearch (cyclomatic 24): GrepToolInvocation.performRipgrepSearch 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":"packages/core/src/tools/ripGrep.ts"},"region":{"startLine":409}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fdab4101c09147f6d34a3ce655cda465146491f297879360ada0b2d95e2e4d5"}},{"ruleId":"D1","level":"warning","message":{"text":"eval-report.summarizeReports (cyclomatic 24): eval-report.summarizeReports has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/utils/eval-report.ts"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"9328dce7beb0aa3569961cd1941b6af099d5024eca6f42e85d0981cd1a559bdd"}},{"ruleId":"D1","level":"warning","message":{"text":"config.setTargetDir (cyclomatic 23): config.setTargetDir 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":"packages/a2a-server/src/config/config.ts"},"region":{"startLine":469}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b71d4f6995cd319101352cd576607cbc2e0357f93d6fe7602681c77b990ae98"}},{"ruleId":"D1","level":"warning","message":{"text":"HooksDialog.HooksDialog (cyclomatic 23): HooksDialog.HooksDialog has cyclomatic complexity 23 (threshold 15). Most of this is not in the body itself: 7 of the 23 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 176, 93, 66). 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":"packages/cli/src/ui/components/HooksDialog.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"599077e40ca96bd4edae36472e5e09baa3864c228615d924d308ae4a734dc4d3"}},{"ruleId":"D1","level":"warning","message":{"text":"TopicMessage.TopicMessage (cyclomatic 23): TopicMessage.TopicMessage has cyclomatic complexity 23 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 7 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":"packages/cli/src/ui/components/messages/TopicMessage.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d3d8dbcf7311b8bb289459d26a850d33c8d8e2ca221111b0dbbbae1a113871f"}},{"ruleId":"D1","level":"warning","message":{"text":"sessionUtils.getAllSessionFiles (cyclomatic 23): sessionUtils.getAllSessionFiles has cyclomatic complexity 23 (threshold 15). Most of this is not in the body itself: 5 of the 23 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 253, 246, 310). 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":"packages/cli/src/utils/sessionUtils.ts"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f808b862382e75d000e0d807278d52b76cc5deac0caff85a977b8d6c503537a"}},{"ruleId":"D1","level":"warning","message":{"text":"sessionUtils.convertSessionToHistoryFormats (cyclomatic 23): sessionUtils.convertSessionToHistoryFormats has cyclomatic complexity 23 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/utils/sessionUtils.ts"},"region":{"startLine":574}}}],"partialFingerprints":{"codehealthFindingId/v1":"54bf66f8a4329b1dd832157690ffd5afdbca4813ef6741e5562c149dab21fafc"}},{"ruleId":"D1","level":"warning","message":{"text":"LocalAgentExecutor.create (cyclomatic 23): LocalAgentExecutor.create 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 2 function literals inside it that branch (lines 208, 192). 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":"packages/core/src/agents/local-executor.ts"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"27ed9448467abd871cadf2b4862f703f8377a21c904e258e3e0c18cf27658ba2"}},{"ruleId":"D1","level":"warning","message":{"text":"LocalAgentExecutor.processFunctionCalls (cyclomatic 23): LocalAgentExecutor.processFunctionCalls 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":"packages/core/src/agents/local-executor.ts"},"region":{"startLine":1105}}}],"partialFingerprints":{"codehealthFindingId/v1":"18fb34e420f52222322e70b76068cc046245db6f8898bbd95d81058f54b39ad5"}},{"ruleId":"D1","level":"warning","message":{"text":"memory.applyInboxPatch (cyclomatic 23): memory.applyInboxPatch has cyclomatic complexity 23 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/commands/memory.ts"},"region":{"startLine":1189}}}],"partialFingerprints":{"codehealthFindingId/v1":"dde5a4ecaf9fa2a02d0e7b78964468521ff8b59b8f304eceede5bd0ff58e98ba"}},{"ruleId":"D1","level":"warning","message":{"text":"ContextManager.renderHistory (cyclomatic 23): ContextManager.renderHistory has cyclomatic complexity 23 (threshold 15). Of this number, 20 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":"packages/core/src/context/contextManager.ts"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"084e3e074d39e9f1aacb73565a77ead98f53d2de6007a6df48c2ad4afbf53d3a"}},{"ruleId":"D1","level":"warning","message":{"text":"coreToolHookTriggers.executeToolWithHooks (cyclomatic 23): coreToolHookTriggers.executeToolWithHooks 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":"packages/core/src/core/coreToolHookTriggers.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bf4d545e795a5da0c5aaeb5b1a847d430423c86b2655ecf20946902b722f3f0"}},{"ruleId":"D1","level":"warning","message":{"text":"Scheduler._processNextItem (cyclomatic 23): Scheduler._processNextItem has cyclomatic complexity 23 (threshold 15). Of this number, 21 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":"packages/core/src/scheduler/scheduler.ts"},"region":{"startLine":440}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba96bd00e5fb2ca54e11e83fbf5d1f4653a6838a8eef5087be4918f3876d81e8"}},{"ruleId":"D1","level":"warning","message":{"text":"trace.runInDevTraceSpan (cyclomatic 23): trace.runInDevTraceSpan 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 152, 141, 224). 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":"packages/core/src/telemetry/trace.ts"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"22cd5cc3d723fe94b594323d4b969b3a783fd80a24e2e7ae671510a75908ba02"}},{"ruleId":"D1","level":"warning","message":{"text":"EditToolInvocation.execute (cyclomatic 23): EditToolInvocation.execute 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":"packages/core/src/tools/edit.ts"},"region":{"startLine":904}}}],"partialFingerprints":{"codehealthFindingId/v1":"44994fa140aa99bb1cf8a165f1961bb1c1c2cdb4f41ab60975b98ba9c8be664f"}},{"ruleId":"D1","level":"warning","message":{"text":"Task.scheduleToolCalls (cyclomatic 22): Task.scheduleToolCalls has cyclomatic complexity 22 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 10 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":"packages/a2a-server/src/agent/task.ts"},"region":{"startLine":711}}}],"partialFingerprints":{"codehealthFindingId/v1":"46b25dfb1b38bdf73373deb644e613ab5627aea3e073e131731e5a4fd9836300"}},{"ruleId":"D1","level":"warning","message":{"text":"gemini.resolveSessionId (cyclomatic 22): gemini.resolveSessionId 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":"packages/cli/src/gemini.tsx"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"09e9dfb456d1989f643f046fbb4e30b3302562c0af64f7b37e00efb2c1f8ff96"}},{"ruleId":"D1","level":"warning","message":{"text":"text-buffer.calculateLayout (cyclomatic 22): text-buffer.calculateLayout has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 6 of the 22 points are its own statements and the rest belongs to one function literal inside it that branches (line 1299). 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":"packages/cli/src/ui/components/shared/text-buffer.ts"},"region":{"startLine":1288}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d778ad26243d8fd34e14b2955bbbb056888f0f518cd77fb1b56e31f46291a1a"}},{"ruleId":"D1","level":"warning","message":{"text":"MouseContext.MouseProvider (cyclomatic 22): MouseContext.MouseProvider 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 3 function literals inside it that branch (lines 102, 148, 95). 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":"packages/cli/src/ui/contexts/MouseContext.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"b97355f19038d5e91f6c748161be93469e557180be4d30de54892761d40cd88f"}},{"ruleId":"D1","level":"warning","message":{"text":"SessionContext.areMetricsEqual (cyclomatic 22): SessionContext.areMetricsEqual 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":"packages/cli/src/ui/contexts/SessionContext.tsx"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"b355d4afeb89fdd535a316371c3f5dee954d87a5f5506b029b0a6e11aea34309"}},{"ruleId":"D1","level":"warning","message":{"text":"browserAgentFactory.createBrowserAgentDefinition (cyclomatic 22): browserAgentFactory.createBrowserAgentDefinition 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":"packages/core/src/agents/browser/browserAgentFactory.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"d34c85a9092bce0f999bc6ca5562fa7388eda3c325376bd0b6d3b616d0b282f3"}},{"ruleId":"D1","level":"warning","message":{"text":"loggingContentGenerator.estimateContextBreakdown (cyclomatic 22): loggingContentGenerator.estimateContextBreakdown 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":"packages/core/src/core/loggingContentGenerator.ts"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ffbd8a8f83a5d802d66d2b6ce5c6bc1937188b6d609dc68116d610dd1aab236"}},{"ruleId":"D1","level":"warning","message":{"text":"HookAggregator.mergeWithOrDecision (cyclomatic 22): HookAggregator.mergeWithOrDecision 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":"packages/core/src/hooks/hookAggregator.ts"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"c55d918453cee68a5825e5bdc26a1e0a4788b3c6012ffc9c80e3fb010a52e71c"}},{"ruleId":"D1","level":"warning","message":{"text":"oauth-utils.validateOAuthEndpointUrl (cyclomatic 22): oauth-utils.validateOAuthEndpointUrl 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":"packages/core/src/mcp/oauth-utils.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e2a405a06fb2ea2d79b3601ef2b824a725cd2ba85306a4e8c03ab200879c9dd"}},{"ruleId":"D1","level":"warning","message":{"text":"PromptProvider.getCoreSystemPrompt (cyclomatic 22): PromptProvider.getCoreSystemPrompt has cyclomatic complexity 22 (threshold 15). Of this number, 19 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":"packages/core/src/prompts/promptProvider.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"181fdf99db43d97aaee754ad4f86e67c6842580da03aa819e3dd3469fd1802de"}},{"ruleId":"D1","level":"warning","message":{"text":"ChatRecordingService.updateMessagesFromHistory (cyclomatic 22): ChatRecordingService.updateMessagesFromHistory has cyclomatic complexity 22 (threshold 15). Of this number, 16 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":"packages/core/src/services/chatRecordingService.ts"},"region":{"startLine":953}}}],"partialFingerprints":{"codehealthFindingId/v1":"462b4c765e2a6dac2806ef15fb845a67142b0981bd8e0361ccf21aafc3656adf"}},{"ruleId":"D1","level":"warning","message":{"text":"sessionSummaryUtils.getPreviousSession (cyclomatic 22): sessionSummaryUtils.getPreviousSession 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":"packages/core/src/services/sessionSummaryUtils.ts"},"region":{"startLine":460}}}],"partialFingerprints":{"codehealthFindingId/v1":"03d2cd517e28bb0e95235e95748bc109c2a03324b8946d892e2a97cb2985e318"}},{"ruleId":"D1","level":"warning","message":{"text":"GrepToolInvocation.execute (cyclomatic 22): GrepToolInvocation.execute 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":"packages/core/src/tools/grep.ts"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"76960734a64113c3c3cdfd3348c0d8925324b880395ec04197fe01e9d6147ccd"}},{"ruleId":"D1","level":"warning","message":{"text":"fileUtils.detectBOM (cyclomatic 22): fileUtils.detectBOM 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":"packages/core/src/utils/fileUtils.ts"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"84e1b0d1ac1940b7c671d55398b209ca11f5d8cbed4cec5621cf61af98f623e0"}},{"ruleId":"D1","level":"warning","message":{"text":"getFolderStructure.readFullStructure (cyclomatic 22): getFolderStructure.readFullStructure 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":"packages/core/src/utils/getFolderStructure.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"c54567091bea69e171de37b0d0baf1ead08728541b5de44da6baadca21ddf824"}},{"ruleId":"D1","level":"warning","message":{"text":"DevTools.start (cyclomatic 22): DevTools.start 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 4 function literals inside it that branch (lines 167, 259, 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":"packages/devtools/src/index.ts"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1110050d5519f117e556aa9bf33f9df08422c6410bff51692fd1d736ff94ba4"}},{"ruleId":"D1","level":"warning","message":{"text":"local_telemetry.main (cyclomatic 22): local_telemetry.main has cyclomatic complexity 22 (threshold 15). 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, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/local_telemetry.js"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"b48b6a6c5c52c760b0c2b9bedb64144e0a6b98d9dfb2a6ceead93be40d5ba241"}},{"ruleId":"D1","level":"warning","message":{"text":"create-patch-pr.main (cyclomatic 22): create-patch-pr.main has cyclomatic complexity 22 (threshold 15). 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: 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/releasing/create-patch-pr.js"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"56b5db91b61d811be8aeb774651d347a5f0737b5b749c6cbbc36aa1fceaf2411"}},{"ruleId":"D1","level":"warning","message":{"text":"sync_project_dry_run.run (cyclomatic 22): sync_project_dry_run.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":"scripts/sync_project_dry_run.js"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bc70c5ef3ebac640974cdabb0b25da9e19f4ec8bdcd5523320a8a909b64f4b2"}},{"ruleId":"D1","level":"warning","message":{"text":"summary._write_markdown (cyclomatic 22): summary._write_markdown 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":"tools/caretaker-agent/evals/triage/helpers/summary.py"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c0e0fd20f68d9c6d70d9281dd3b9cfda8e597d41c36bb31b1d1c0ad8d6a9e47"}},{"ruleId":"D1","level":"warning","message":{"text":"config.loadConfig (cyclomatic 21): config.loadConfig 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":"packages/a2a-server/src/config/config.ts"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f6260c477fd64b94481533caeff33fbf6c83b20fcede04ed263c9d436e73007"}},{"ruleId":"D1","level":"warning","message":{"text":"AppHeader.AppHeader (cyclomatic 21): AppHeader.AppHeader has cyclomatic complexity 21 (threshold 15). Of this number, 16 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":"packages/cli/src/ui/components/AppHeader.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"5dc58e18ec56dfb3353617032015f72c8de648fa2a236ebb4bb0f563d74d03e2"}},{"ruleId":"D1","level":"warning","message":{"text":"ToolGroupDisplay.ToolGroupDisplay (cyclomatic 21): ToolGroupDisplay.ToolGroupDisplay has cyclomatic complexity 21 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 7 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":"packages/cli/src/ui/components/messages/ToolGroupDisplay.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"09aaec84be59e0fd99225ad94b859036dc3feba4243a3b2ee51ce04be271e68c"}},{"ruleId":"D1","level":"warning","message":{"text":"Scrollable.Scrollable (cyclomatic 21): Scrollable.Scrollable 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 189, 145, 76, \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":"packages/cli/src/ui/components/shared/Scrollable.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"d683619fef4995b445bad83cb1af0fc198509aaa9ba8ac3a4b2a498325cdb29d"}},{"ruleId":"D1","level":"warning","message":{"text":"useRunEventNotifications.useRunEventNotifications (cyclomatic 21): useRunEventNotifications.useRunEventNotifications 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 2 function literals inside it that branch (lines 81, 140). 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":"packages/cli/src/ui/hooks/useRunEventNotifications.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"bea35d5af8d4fcdf60fd06ef78a2659a04ac75384db2171e8553b8e6e133d9d1"}},{"ruleId":"D1","level":"warning","message":{"text":"highlight.parseInputForHighlighting (cyclomatic 21): highlight.parseInputForHighlighting has cyclomatic complexity 21 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 8 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":"packages/cli/src/ui/utils/highlight.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"aea7ce76388f96fc80c215fe7762ae0dad5e6ba8a1752f0d69e6fb9a7c23cf72"}},{"ruleId":"D1","level":"warning","message":{"text":"memory.applyMemoryPatchFile (cyclomatic 21): memory.applyMemoryPatchFile has cyclomatic complexity 21 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/commands/memory.ts"},"region":{"startLine":782}}}],"partialFingerprints":{"codehealthFindingId/v1":"19a3bf41f41b3bee39e7a41296080693903d21fc1363df9e27f701c6c71202dd"}},{"ruleId":"D1","level":"warning","message":{"text":"ContextCompressionService.applyCompressionDecision (cyclomatic 21): ContextCompressionService.applyCompressionDecision 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":"packages/core/src/context/contextCompressionService.ts"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfedd997667828f370104e91788d70fe1dfa8f1d8caf9ba1cf96605ac738fd67"}},{"ruleId":"D1","level":"warning","message":{"text":"contentGenerator.createContentGeneratorConfig (cyclomatic 21): contentGenerator.createContentGeneratorConfig has cyclomatic complexity 21 (threshold 15). Of this number, 19 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":"packages/core/src/core/contentGenerator.ts"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ab818083ab5a644dd175d38f07de52d1b9b74c9df00bf628e9c321cb6159c9b"}},{"ruleId":"D1","level":"warning","message":{"text":"ToolExecutor.execute (cyclomatic 21): ToolExecutor.execute has cyclomatic complexity 21 (threshold 15). 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 96, 102). 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":"packages/core/src/scheduler/tool-executor.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"cec46fec7724db9322dbf8b67c224cc61ef0e68f7b5ae7e9ae90862fc8dd298b"}},{"ruleId":"D1","level":"warning","message":{"text":"LSToolInvocation.execute (cyclomatic 21): LSToolInvocation.execute has cyclomatic complexity 21 (threshold 15). Of this number, 15 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":"packages/core/src/tools/ls.ts"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dba9ae515236a7c6ebc13378ed663959a23b63ea3c12cb9449043039d198ae9"}},{"ruleId":"D1","level":"warning","message":{"text":"tools.hasCycleInSchema (cyclomatic 21): tools.hasCycleInSchema 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":"packages/core/src/tools/tools.ts"},"region":{"startLine":798}}}],"partialFingerprints":{"codehealthFindingId/v1":"12af32fd9d1e1d9a22dbc5db44a8917d04aea83bd120bc2bd04da1e01605498c"}},{"ruleId":"D1","level":"warning","message":{"text":"RecursiveFileSearch.search (cyclomatic 21): RecursiveFileSearch.search has cyclomatic complexity 21 (threshold 15). Of this number, 19 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":"packages/core/src/utils/filesearch/fileSearch.ts"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fb701a59317168a6c4485909e391f40b52bbcba60c17c9076f8151316a60cb2"}},{"ruleId":"D1","level":"warning","message":{"text":"app.createApp (cyclomatic 20): app.createApp 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 5 function literals inside it that branch (lines 356, 284, 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":"packages/a2a-server/src/http/app.ts"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"f35d0636c331aca0cfbf37c3d421e3995538edec6cfffe3853305925b62d120b"}},{"ruleId":"D1","level":"warning","message":{"text":"install.handleInstall (cyclomatic 20): install.handleInstall 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":"packages/cli/src/commands/extensions/install.ts"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e5f2c1b26e40038df48eff52eedf81c56cccd180de0431d8a62e14db3ba6788"}},{"ruleId":"D1","level":"warning","message":{"text":"github.downloadFromGitHubRelease (cyclomatic 20): github.downloadFromGitHubRelease 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":"packages/cli/src/config/extensions/github.ts"},"region":{"startLine":320}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f0016cb6d928bc64d4caeb9f32983246e284f13af17dbdc5d1e8f6dc868abc4"}},{"ruleId":"D1","level":"warning","message":{"text":"ShellProcessor.processString (cyclomatic 20): ShellProcessor.processString 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":"packages/cli/src/services/prompt-processors/shellProcessor.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"70a5a390525f9780752b0fe7ba599b2a1efd3645e4dc60f90f47729ff0b1c870"}},{"ruleId":"D1","level":"warning","message":{"text":"SuggestionsDisplay.SuggestionsDisplay (cyclomatic 20): SuggestionsDisplay.SuggestionsDisplay 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 86, 73). 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":"packages/cli/src/ui/components/SuggestionsDisplay.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"004ee13bba39fe034c7e2b9a9d0a40cfbd2c3dd86ff96ee84858b7a3f8e52bec"}},{"ruleId":"D1","level":"warning","message":{"text":"SubagentProgressDisplay.formatToolArgs (cyclomatic 20): SubagentProgressDisplay.formatToolArgs 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":"packages/cli/src/ui/components/messages/SubagentProgressDisplay.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8e5d146047ada56e2e30b827b293158c5db307572d5c0daa1cae3d1dceaa20e"}},{"ruleId":"D1","level":"warning","message":{"text":"ExpandableText._ExpandableText (cyclomatic 20): ExpandableText._ExpandableText 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":"packages/cli/src/ui/components/shared/ExpandableText.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3e1b5b96cb03e6192667cca7e9cdccbbe9521ffe91fafd3d3c2c14588dc9ecc"}},{"ruleId":"D1","level":"warning","message":{"text":"ScrollableList.ScrollableList (cyclomatic 20): ScrollableList.ScrollableList 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 4 function literals inside it that branch (lines 200, 113, 165, \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":"packages/cli/src/ui/components/shared/ScrollableList.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8d2feb5e5917cb8bbd15e26d06baf29fbd0e6efeb1772f7033df4930fb0c7b8"}},{"ruleId":"D1","level":"warning","message":{"text":"SearchableList.SearchableList (cyclomatic 20): SearchableList.SearchableList has cyclomatic complexity 20 (threshold 15). Of this number, 12 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":"packages/cli/src/ui/components/shared/SearchableList.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"15085f2f2a120123e41d2f32bf0e2748cadc90c9ae10ba4b2eb0bf5372870525"}},{"ruleId":"D1","level":"warning","message":{"text":"useAnimatedScrollbar.useAnimatedScrollbar (cyclomatic 20): useAnimatedScrollbar.useAnimatedScrollbar 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 5 function literals inside it that branch (lines 39, 110, 24, \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":"packages/cli/src/ui/hooks/useAnimatedScrollbar.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5712db78960a5ea42823c6937c64416f41c25269936030eb53ff9d49c3f1231"}},{"ruleId":"D1","level":"warning","message":{"text":"useComposerStatus.useComposerStatus (cyclomatic 20): useComposerStatus.useComposerStatus has cyclomatic complexity 20 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 7 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":"packages/cli/src/ui/hooks/useComposerStatus.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"e951eb00e28261dde18542b24454314db50ec280a9b771edce087064baca7c3d"}},{"ruleId":"D1","level":"warning","message":{"text":"TerminalCapabilityManager.detectCapabilities (cyclomatic 20): TerminalCapabilityManager.detectCapabilities 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 3 function literals inside it that branch (lines 151, 120, 135). 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":"packages/cli/src/ui/utils/terminalCapabilityManager.ts"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"801f3ccc27cc03313d1c6c9778c2fd215d7b61f5150df5a2b7e7858573c82174"}},{"ruleId":"D1","level":"warning","message":{"text":"deepMerge.mergeRecursively (cyclomatic 20): deepMerge.mergeRecursively 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":"packages/cli/src/utils/deepMerge.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"83173e0e4627b401923e3638a8ba6350d25053711fb7135e81b5180a329d4aa9"}},{"ruleId":"D1","level":"warning","message":{"text":"A2AResultReassembler.update (cyclomatic 20): A2AResultReassembler.update 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":"packages/core/src/agents/a2aUtils.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"76dad8c9883097b0c993cbe7f9c0c868daae8a880443d4ac9400086711e2577a"}},{"ruleId":"D1","level":"warning","message":{"text":"AgentRegistry.loadAgents (cyclomatic 20): AgentRegistry.loadAgents has cyclomatic complexity 20 (threshold 15). Of this number, 14 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":"packages/core/src/agents/registry.ts"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"48864ce2aeb311f116d8f3a6bd35b92fb225cd439564ef54e14d61ccf7cc3fee"}},{"ruleId":"D1","level":"warning","message":{"text":"Config.constructor (cyclomatic 20): Config.constructor 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":"packages/core/src/config/config.ts"},"region":{"startLine":993}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fb9ef8f6ca20d4af978cec617ad49b0861d6736738711a9ddb168d1f38acddc"}},{"ruleId":"D1","level":"warning","message":{"text":"geminiChat.stripToolCallIdPrefixes (cyclomatic 20): geminiChat.stripToolCallIdPrefixes 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 5 function literals inside it that branch (lines 1759, 1795, 1787, \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":"packages/core/src/core/geminiChat.ts"},"region":{"startLine":1756}}}],"partialFingerprints":{"codehealthFindingId/v1":"52a5caf33902486d4674e49b69dd430ecfa6b58e895353ab46b612ef50f55238"}},{"ruleId":"D1","level":"warning","message":{"text":"sessionSummaryUtils.generateAndSaveSummary (cyclomatic 20): sessionSummaryUtils.generateAndSaveSummary 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":"packages/core/src/services/sessionSummaryUtils.ts"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"d585265408ec945a9ebac86c1f5c048c55e4986d214c28cece79bf0bf45c11df"}},{"ruleId":"D1","level":"warning","message":{"text":"terminalSerializer.serializeTerminalToObject (cyclomatic 20): terminalSerializer.serializeTerminalToObject 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":"packages/core/src/utils/terminalSerializer.ts"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff223bd46c26a22ad153a74486064ff47a13cbbca0d2f4a77360d30f3e81bee9"}},{"ruleId":"D1","level":"warning","message":{"text":"changed_prompt.main (cyclomatic 20): changed_prompt.main has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/changed_prompt.js"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e65c110c061905fe5854f1f30cdf5dc7b78246fccb9aa24a9354af2e7ca63f5"}},{"ruleId":"D1","level":"warning","message":{"text":"cleanup-branches.main (cyclomatic 20): cleanup-branches.main has cyclomatic complexity 20 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 5 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":"scripts/cleanup-branches.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"94ef3e7bb5d7e7055974698c107c9f98cabbf773899cb8ede43b04cd3c8b7326"}},{"ruleId":"D1","level":"warning","message":{"text":"eval-inventory.formatInventoryReport (cyclomatic 20): eval-inventory.formatInventoryReport has cyclomatic complexity 20 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 3 belong to one function literal 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":"scripts/utils/eval-inventory.ts"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"60f9111aacd2bd91353263ca2b46549492e137832cb7b04a34c1ce2bee5a31e2"}},{"ruleId":"D1","level":"warning","message":{"text":"acpUtils.toPermissionOptions (cyclomatic 19): acpUtils.toPermissionOptions 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":"packages/cli/src/acp/acpUtils.ts"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc7eba99e9f55802a4d41433276371d1b2f7d4b32afa6de981d1ffdc4c3b81a2"}},{"ruleId":"D1","level":"warning","message":{"text":"mcpCommand.listAction (cyclomatic 19): mcpCommand.listAction has cyclomatic complexity 19 (threshold 15). 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, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/commands/mcpCommand.ts"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"cede772d87e887dc7c8b46c35e27bc8c4ac5876ef0d8d5ed1015c6c3794fdada"}},{"ruleId":"D1","level":"warning","message":{"text":"FolderTrustDialog.FolderTrustDialog (cyclomatic 19): FolderTrustDialog.FolderTrustDialog 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, 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":"packages/cli/src/ui/components/FolderTrustDialog.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"8aedd9f497c9863bd153ad7c8d7890ef3c0d7780251ce2bd5a7864e342cf1567"}},{"ruleId":"D1","level":"warning","message":{"text":"SubagentProgressDisplay.SubagentProgressDisplay (cyclomatic 19): SubagentProgressDisplay.SubagentProgressDisplay has cyclomatic complexity 19 (threshold 15). Most of this is not in the body itself: 8 of the 19 points are its own statements and the rest belongs to one function literal inside it that branches (line 91). 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":"packages/cli/src/ui/components/messages/SubagentProgressDisplay.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"688d23c174eaaa39dd96c28b843a89b6b4c7f96771103585c583073519267475"}},{"ruleId":"D1","level":"warning","message":{"text":"useExtensionUpdates.useExtensionUpdates (cyclomatic 19): useExtensionUpdates.useExtensionUpdates has cyclomatic complexity 19 (threshold 15). Most of this is not in the body itself: 1 of the 19 points is its own statement and the rest belongs to 6 function literals inside it that branch (lines 118, 95, 94, \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":"packages/cli/src/ui/hooks/useExtensionUpdates.ts"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"e41f8462ffb3f80db0d5f28e20d1abf5ebe342f4a4d1ba4ac957136a660eb9ad"}},{"ruleId":"D1","level":"warning","message":{"text":"CodeAssistServer.generateContentStream (cyclomatic 19): CodeAssistServer.generateContentStream has cyclomatic complexity 19 (threshold 15). 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 134, 172). 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":"packages/core/src/code_assist/server.ts"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"4629e14c31c5e6260b3c6bad943709fa605fc405dbdad7f47fca046833fcfaba"}},{"ruleId":"D1","level":"warning","message":{"text":"setup._doSetupUser (cyclomatic 19): setup._doSetupUser 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":"packages/core/src/code_assist/setup.ts"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d8a16d08338321d22a3f19bfa78b901083accb756b03e798481683a6180b72d"}},{"ruleId":"D1","level":"warning","message":{"text":"ContextManager.evaluateTriggers (cyclomatic 19): ContextManager.evaluateTriggers 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":"packages/core/src/context/contextManager.ts"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"00f08e90fb5a01c076807d862671532633ffd42184f3c417dffd4608bb076076"}},{"ruleId":"D1","level":"warning","message":{"text":"ContextWorkingBufferImpl.applyProcessorResult (cyclomatic 19): ContextWorkingBufferImpl.applyProcessorResult 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":"packages/core/src/context/pipeline/contextWorkingBuffer.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"93c2a975d76f256323039c8c68b63b59d772dac86f5c02ed51a5354edd267433"}},{"ruleId":"D1","level":"warning","message":{"text":"stateSnapshotProcessor.createStateSnapshotProcessor (cyclomatic 19): stateSnapshotProcessor.createStateSnapshotProcessor has cyclomatic complexity 19 (threshold 15). Most of this is not in the body itself: 1 of the 19 points is its own statement and the rest belongs to one function literal inside it that branches (line 56). 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":"packages/core/src/context/processors/stateSnapshotProcessor.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb203db30cc3bd00a522643dc3421c325fbc1b52bcb08c183cb5509c1b695bb6"}},{"ruleId":"D1","level":"warning","message":{"text":"HookTranslatorGenAIv1.fromHookLLMRequest (cyclomatic 19): HookTranslatorGenAIv1.fromHookLLMRequest has cyclomatic complexity 19 (threshold 15). Of this number, 15 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":"packages/core/src/hooks/hookTranslator.ts"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"c021baeae6350a302dc61034bf7fe39b94d07a774eed8c65de131cd5b95b942a"}},{"ruleId":"D1","level":"warning","message":{"text":"stable-stringify.stableStringify (cyclomatic 19): stable-stringify.stableStringify has cyclomatic complexity 19 (threshold 15). Most of this is not in the body itself: 1 of the 19 points is its own statement and the rest belongs to 2 function literals inside it that branch (lines 60, 106). 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":"packages/core/src/policy/stable-stringify.ts"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"9557a2afbc915ba5de119d149efeef74dcd75835f414a7d3e5682ea7d18bd89c"}},{"ruleId":"D1","level":"warning","message":{"text":"memoryService.buildExistingSkillsSummary (cyclomatic 19): memoryService.buildExistingSkillsSummary 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":"packages/core/src/services/memoryService.ts"},"region":{"startLine":729}}}],"partialFingerprints":{"codehealthFindingId/v1":"51de16c79ea36e54d944701705458f46310d11925f4821ab19f8964ea9ecd286"}},{"ruleId":"D1","level":"warning","message":{"text":"ShellExecutionService.closeOrphanSlaveFd (cyclomatic 19): ShellExecutionService.closeOrphanSlaveFd 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":"packages/core/src/services/shellExecutionService.ts"},"region":{"startLine":1009}}}],"partialFingerprints":{"codehealthFindingId/v1":"26ce444c61f0e91e19a2bda3e32b902677af7a2d2f1cb6712341dab198534aab"}},{"ruleId":"D1","level":"warning","message":{"text":"mcp-client.discoverTools (cyclomatic 19): mcp-client.discoverTools 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":"packages/core/src/tools/mcp-client.ts"},"region":{"startLine":1295}}}],"partialFingerprints":{"codehealthFindingId/v1":"955b5e286133067e0cd8b60651b31891e6dd987ad91bf33769695d7b7d51da74"}},{"ruleId":"D1","level":"warning","message":{"text":"WebFetchToolInvocation.executeExperimental (cyclomatic 19): WebFetchToolInvocation.executeExperimental 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":"packages/core/src/tools/web-fetch.ts"},"region":{"startLine":595}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5b2959716c427c36915d7049cea1bfb1e5768a7c6610cebf6723eae90dd75eb"}},{"ruleId":"D1","level":"warning","message":{"text":"shell-utils.extractNameFromNode (cyclomatic 19): shell-utils.extractNameFromNode 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":"packages/core/src/utils/shell-utils.ts"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"85241df06884be99ab1f80490133e50fd8dd937b67fffae233cd4ac228ec9e28"}},{"ruleId":"D1","level":"warning","message":{"text":"eval-coverage.computeCoverage (cyclomatic 19): eval-coverage.computeCoverage has cyclomatic complexity 19 (threshold 15). Of this number, 15 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":"scripts/utils/eval-coverage.ts"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"f06faa05303602c1ea9b2a0715ff8f59780f0a40e26e23509701799771a17e45"}},{"ruleId":"D1","level":"warning","message":{"text":"list.listMcpServers (cyclomatic 18): list.listMcpServers 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":"packages/cli/src/commands/mcp/list.ts"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf07abc47f02ffa66b11c02c7b3333fda5e8cecb9f7698c3904bfc876065f9ca"}},{"ruleId":"D1","level":"warning","message":{"text":"settings.migrateExperimentalSettings (cyclomatic 18): settings.migrateExperimentalSettings has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 5 of the 18 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 1308, 1368, 1294, \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":"packages/cli/src/config/settings.ts"},"region":{"startLine":1273}}}],"partialFingerprints":{"codehealthFindingId/v1":"3858cb4bab740a58bdf680513a2e8884b11edf58b79d35bca7b5e1a4e2dd09e7"}},{"ruleId":"D1","level":"warning","message":{"text":"interactiveCli.startInteractiveUI (cyclomatic 18): interactiveCli.startInteractiveUI has cyclomatic complexity 18 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 3 belong to 3 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":"packages/cli/src/interactiveCli.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8350898dbde987c172e180bdb36ece7857267d1911f60e794277d01802f5f88"}},{"ruleId":"D1","level":"warning","message":{"text":"StatsDisplay.StatsDisplay (cyclomatic 18): StatsDisplay.StatsDisplay has cyclomatic complexity 18 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 2 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":"packages/cli/src/ui/components/StatsDisplay.tsx"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"a848357a5f36ba0b5095dda3fd691e62378c6a384a97faa1233e11ba405909c5"}},{"ruleId":"D1","level":"warning","message":{"text":"useApprovalModeIndicator.useApprovalModeIndicator (cyclomatic 18): useApprovalModeIndicator.useApprovalModeIndicator 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 one function literal inside it that branches (line 42). 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":"packages/cli/src/ui/hooks/useApprovalModeIndicator.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4e76c916ad1651491c7920df4fddcdf6dc52d3802fbcc028604548e3e85ccbf"}},{"ruleId":"D1","level":"warning","message":{"text":"useSnowfall.useSnowfall (cyclomatic 18): useSnowfall.useSnowfall has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 8 of the 18 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 151, 113, 69, \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":"packages/cli/src/ui/hooks/useSnowfall.ts"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed21af000552f3d24d13b638ab4716df832e2054dc13ad6da13815ed1146b949"}},{"ruleId":"D1","level":"warning","message":{"text":"useTabbedNavigation.tabbedNavigationReducer (cyclomatic 18): useTabbedNavigation.tabbedNavigationReducer 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":"packages/cli/src/ui/hooks/useTabbedNavigation.ts"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"417b1b39a0ad230128c731997bbd360f93482dc75ce1d8270ab6494a268c8e40"}},{"ruleId":"D1","level":"warning","message":{"text":"TableRenderer.TableRenderer (cyclomatic 18): TableRenderer.TableRenderer 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 10 function literals inside it that branch (lines 95, 183, 289, \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":"packages/cli/src/ui/utils/TableRenderer.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdbc3ac2053eaadba996331e1e40babdb0a1448be4e777e1162eebaeddcafbe0"}},{"ruleId":"D1","level":"warning","message":{"text":"formatters.formatResetTime (cyclomatic 18): formatters.formatResetTime 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":"packages/cli/src/ui/utils/formatters.ts"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c07da57ecb70bca27e0ff1013255c4f2856d9474048f036a2f8e87b4a702bc5"}},{"ruleId":"D1","level":"warning","message":{"text":"activityLogger.callHttpRequest (cyclomatic 18): activityLogger.callHttpRequest 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: ActivityLogger.patchGlobalFetch (cyclomatic 23) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/utils/activityLogger.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"d107b58fe8e3d5087e0e61a8392fc1019332d6840f975a26ab7276a6b55343b3"}},{"ruleId":"D1","level":"warning","message":{"text":"AnalyzeScreenshotInvocation.execute (cyclomatic 18): AnalyzeScreenshotInvocation.execute has cyclomatic complexity 18 (threshold 15). 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, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/agents/browser/analyzeScreenshot.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"323aab2ff4e93fac530ace5ffc99b7054ce33e80b58f1666a75f745487a735cf"}},{"ruleId":"D1","level":"warning","message":{"text":"RemoteSessionInvocation.execute (cyclomatic 18): RemoteSessionInvocation.execute has cyclomatic complexity 18 (threshold 15). Of this number, 15 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":"packages/core/src/agents/remote-session-invocation.ts"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"467467d2f2d63a1c5c9a682e8bfb04a7d7a2d2350c12e40e9d7c3c34d6b296f9"}},{"ruleId":"D1","level":"warning","message":{"text":"ChatCompressionService.compress (cyclomatic 18): ChatCompressionService.compress has cyclomatic complexity 18 (threshold 15). Of this number, 14 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":"packages/core/src/context/chatCompressionService.ts"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"c641dc2e845861a07728f5074973ddc8c9ed453060659487e728e35aa817d731"}},{"ruleId":"D1","level":"warning","message":{"text":"ContextGraphBuilder.processHistory (cyclomatic 18): ContextGraphBuilder.processHistory 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, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/context/graph/toGraph.ts"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc9dba78ff75b9e8bf0c097ea6d3e1f877521719338c04932bf74807eea67deb"}},{"ruleId":"D1","level":"warning","message":{"text":"rollingSummaryProcessor.createRollingSummaryProcessor (cyclomatic 18): rollingSummaryProcessor.createRollingSummaryProcessor has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 1 of the 18 points is its own statement and the rest belongs to 2 function literals inside it that branch (lines 74, 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":"packages/core/src/context/processors/rollingSummaryProcessor.ts"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"2858b318dbaabb33dff9163e85aacffa889695353d1a9ae0f94f39b0eb29ff2e"}},{"ruleId":"D1","level":"warning","message":{"text":"ide-installer.findCommand (cyclomatic 18): ide-installer.findCommand 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":"packages/core/src/ide/ide-installer.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"f20d3538740fe75928d54e40140d7c31f4788263a6b4d5f16a4bef59273eccc7"}},{"ruleId":"D1","level":"warning","message":{"text":"PolicyEngine.applyShellHeuristics (cyclomatic 18): PolicyEngine.applyShellHeuristics 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":"packages/core/src/policy/policy-engine.ts"},"region":{"startLine":359}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac02c75aae29b7e90219d8b8c9ffbe3a6604b2a76cd869a3750cd30aa4fe6381"}},{"ruleId":"D1","level":"warning","message":{"text":"Scheduler._execute (cyclomatic 18): Scheduler._execute has cyclomatic complexity 18 (threshold 15). 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: 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":"packages/core/src/scheduler/scheduler.ts"},"region":{"startLine":730}}}],"partialFingerprints":{"codehealthFindingId/v1":"42128d053e5845cf93e637d64d3bceaad6e0e8d24d0cb1b4b9bce03b75a06bd6"}},{"ruleId":"D1","level":"warning","message":{"text":"GrepToolInvocation.execute (cyclomatic 18): GrepToolInvocation.execute 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":"packages/core/src/tools/ripGrep.ts"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"19a4551184e49112a321f27b83b248c8ff986299e1a5a066bce907278c5a838d"}},{"ruleId":"D1","level":"warning","message":{"text":"RipGrepTool.validateToolParamValues (cyclomatic 18): RipGrepTool.validateToolParamValues 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":"packages/core/src/tools/ripGrep.ts"},"region":{"startLine":659}}}],"partialFingerprints":{"codehealthFindingId/v1":"e29b1af8fdb4cef1d78b898f23e43ec8ba8cb36a95216c0ec82464f67aac42c2"}},{"ruleId":"D1","level":"warning","message":{"text":"ShellToolInvocation.getConfirmationDetails (cyclomatic 18): ShellToolInvocation.getConfirmationDetails has cyclomatic complexity 18 (threshold 15). 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, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/shell.ts"},"region":{"startLine":435}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8ce5a6178d0fce4b66ba66b0811a5a0bcf16a1638a0dc0b785ae1aae0499ecc"}},{"ruleId":"D1","level":"warning","message":{"text":"atCommandUtils.resolveAtCommandPath (cyclomatic 18): atCommandUtils.resolveAtCommandPath 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":"packages/core/src/utils/atCommandUtils.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd7fb0cd8ff5c6003668eeaf8a450ee98a8f21da171906c5fc82467630610ee4"}},{"ruleId":"D1","level":"warning","message":{"text":"RecursiveFileSearch.handleFileWatcherEvent (cyclomatic 18): RecursiveFileSearch.handleFileWatcherEvent 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":"packages/core/src/utils/filesearch/fileSearch.ts"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"edef3c04d335461331f25502b50a39696df7a17d3dc3f912166a5f8236e76378"}},{"ruleId":"D1","level":"warning","message":{"text":"memoryDiscovery.loadJitSubdirectoryMemory (cyclomatic 18): memoryDiscovery.loadJitSubdirectoryMemory 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, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/memoryDiscovery.ts"},"region":{"startLine":512}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfdcff5a0ab2408c21268a8217b0bcfb0a3dea593b9a657c3d05b75395720040"}},{"ruleId":"D1","level":"warning","message":{"text":"oauth-flow.startCallbackServer (cyclomatic 18): oauth-flow.startCallbackServer has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 1 of the 18 points is its own statement and the rest belongs to 2 function literals inside it that branch (lines 214, 210). 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":"packages/core/src/utils/oauth-flow.ts"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b5ea7a73b12ea8763e51248faaae6e20e2fa071772fddea30e587aa3c7d13b4"}},{"ruleId":"D1","level":"warning","message":{"text":"sessionUtils.ensureStableToolIds (cyclomatic 18): sessionUtils.ensureStableToolIds has cyclomatic complexity 18 (threshold 15). Of this number, 14 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":"packages/core/src/utils/sessionUtils.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ec5c24513a941c6013a7bc0c2e2e4a897a1946bf44385062860fce04dfee743"}},{"ruleId":"D1","level":"warning","message":{"text":"shell-utils.execStreaming (cyclomatic 18): shell-utils.execStreaming has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 8 of the 18 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 1035, 989, 1001). 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":"packages/core/src/utils/shell-utils.ts"},"region":{"startLine":953}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dee33fa1874d4731f4dacf0b51f962e3c9a1a0cdb095de7bbaed7def2158569"}},{"ruleId":"D1","level":"warning","message":{"text":"shell-utils.detectBashSubstitution (cyclomatic 18): shell-utils.detectBashSubstitution 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":"packages/core/src/utils/shell-utils.ts"},"region":{"startLine":1095}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c18ca5ed7b5f623e45e231f29831b096e25e929b0bb6a1038722e8970470143"}},{"ruleId":"D1","level":"warning","message":{"text":"shell-utils.detectPowerShellSubstitution (cyclomatic 18): shell-utils.detectPowerShellSubstitution 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":"packages/core/src/utils/shell-utils.ts"},"region":{"startLine":1148}}}],"partialFingerprints":{"codehealthFindingId/v1":"630bab226c3ea857074bd3b16cadd6ffc124c8136beaf855d75f93abb53f5c43"}},{"ruleId":"D1","level":"warning","message":{"text":"get-release-version.detectRollbackAndGetBaseline (cyclomatic 18): get-release-version.detectRollbackAndGetBaseline has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/get-release-version.js"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"51a86924d253335e6347960c1dcc6867abd6bde69c233f0e85b8bafe8d39a0e5"}},{"ruleId":"D1","level":"warning","message":{"text":"AgentRunner.run_agent (cyclomatic 18): AgentRunner.run_agent 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":"tools/caretaker-agent/cloudrun/pr-generator/workflow/agent_runner.py"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"85ddf91e06a72414a7d4c5444d172f6285a8e08c1af066af9cc62ed15532a7f8"}},{"ruleId":"D1","level":"warning","message":{"text":"index.run (cyclomatic 17): index.run has cyclomatic complexity 17 (threshold 15). Of this number, 9 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":"packages/cli/index.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd05b5482e5c32cd168589e534551848db9cf3e32b06c3849e5ef967b8b87ba3"}},{"ruleId":"D1","level":"warning","message":{"text":"extensionSettings.maybePromptForSettings (cyclomatic 17): extensionSettings.maybePromptForSettings 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":"packages/cli/src/config/extensions/extensionSettings.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e665452632beb3ab4b98d6c57796c9bb43580d9afbfaeacbcce5d02e118cde5"}},{"ruleId":"D1","level":"warning","message":{"text":"settings._doLoadSettings (cyclomatic 17): settings._doLoadSettings has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 8 of the 17 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 781, 851). 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":"packages/cli/src/config/settings.ts"},"region":{"startLine":769}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ba9a7505e6f6cf4a4a4cf25e459e50c558e1375430fd81800ce6ad5521e2263"}},{"ruleId":"D1","level":"warning","message":{"text":"BuiltinCommandLoader.loadCommands (cyclomatic 17): BuiltinCommandLoader.loadCommands has cyclomatic complexity 17 (threshold 15). Of this number, 13 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":"packages/cli/src/services/BuiltinCommandLoader.ts"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e4d47b0dc2e39539e33520dddca75eb3544688690804799cd7411abbd8a7b05"}},{"ruleId":"D1","level":"warning","message":{"text":"FileCommandLoader.parseAndAdaptFile (cyclomatic 17): FileCommandLoader.parseAndAdaptFile has cyclomatic complexity 17 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 5 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":"packages/cli/src/services/FileCommandLoader.ts"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bf6f4a9413c22a0e9a644f5955a8ef0d8ecc0e964fce6ddd1c03d1322d207e3"}},{"ruleId":"D1","level":"warning","message":{"text":"mcpCommand.handleEnableDisable (cyclomatic 17): mcpCommand.handleEnableDisable 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":"packages/cli/src/ui/commands/mcpCommand.ts"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"db2ea7b0a30f5627de7d8969c8ee10dda8c92e7d855059474e216169c726db86"}},{"ruleId":"D1","level":"warning","message":{"text":"ColorsDisplay.ColorsDisplay (cyclomatic 17): ColorsDisplay.ColorsDisplay 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 2 function literals inside it that branch (lines 100, 193). 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":"packages/cli/src/ui/components/ColorsDisplay.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"b33ff6c1be21f2bd30c0dae5bea555bee2f7d18b8379c1fa44df9d0ef44873cc"}},{"ruleId":"D1","level":"warning","message":{"text":"EditorSettingsDialog.EditorSettingsDialog (cyclomatic 17): EditorSettingsDialog.EditorSettingsDialog 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":"packages/cli/src/ui/components/EditorSettingsDialog.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a2c27a23ec962fb384aa6a9877d795885fc3798dfefb7b6c165ef78e9d05e58"}},{"ruleId":"D1","level":"warning","message":{"text":"ToolConfirmationQueue.ToolConfirmationQueue (cyclomatic 17): ToolConfirmationQueue.ToolConfirmationQueue 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":"packages/cli/src/ui/components/ToolConfirmationQueue.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3951d1d037cd4c25cb64ead5e9be05296538e68bb2e1c7147eb4b29c238d1e1"}},{"ruleId":"D1","level":"warning","message":{"text":"ValidationDialog.ValidationDialog (cyclomatic 17): ValidationDialog.ValidationDialog has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 7 of the 17 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 81, 55, 70). 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":"packages/cli/src/ui/components/ValidationDialog.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"61ef4e34e3c82b6a369a397548f8e860ab10abe2e140190bf733d6b32434dc8f"}},{"ruleId":"D1","level":"warning","message":{"text":"EnumSelector.EnumSelector (cyclomatic 17): EnumSelector.EnumSelector has cyclomatic complexity 17 (threshold 15). Of this number, 11 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":"packages/cli/src/ui/components/shared/EnumSelector.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"504768ba482a7c4152f0e29ae0783b6ed718b865575869d133c95060dcb9fd78"}},{"ruleId":"D1","level":"warning","message":{"text":"rewindFileOps.revertFileChanges (cyclomatic 17): rewindFileOps.revertFileChanges 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":"packages/cli/src/ui/utils/rewindFileOps.ts"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"23475627d687de61e86e00a2c767e4f7e73bea4eb54d10908341ecbc942f4876"}},{"ruleId":"D1","level":"warning","message":{"text":"commentJson.preserveCommentsOnPropertyDeletion (cyclomatic 17): commentJson.preserveCommentsOnPropertyDeletion 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":"packages/cli/src/utils/commentJson.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"2585cc13112c837ebdfb9b381be21295d4bf13a9023f6da486003dc565608059"}},{"ruleId":"D1","level":"warning","message":{"text":"agentLoader.markdownToAgentDefinition (cyclomatic 17): agentLoader.markdownToAgentDefinition 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":"packages/core/src/agents/agentLoader.ts"},"region":{"startLine":497}}}],"partialFingerprints":{"codehealthFindingId/v1":"9815de6baf13ab9fa10dde771f57cf6549af36d0776f9b003a213468d691ec1e"}},{"ruleId":"D1","level":"warning","message":{"text":"handler.handleFallback (cyclomatic 17): handler.handleFallback 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, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/fallback/handler.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"166e9dec1396ea54ca0b0d196a2910cb7debd752eb0dc1d887013bb25165213c"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelConfigService.getAvailableModelOptions (cyclomatic 17): ModelConfigService.getAvailableModelOptions 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 4 function literals inside it that branch (lines 193, 166, 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":"packages/core/src/services/modelConfigService.ts"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0ff3a8ee7442e5a7e092b5bdb1f11549ea97a4c9775fc6d868a5e44682a786a"}},{"ruleId":"D1","level":"warning","message":{"text":"ShellToolInvocation.simplifyPaths (cyclomatic 17): ShellToolInvocation.simplifyPaths 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":"packages/core/src/tools/shell.ts"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"b60a7e85bf5ad17faf983a4ce6ffececd8611e52dcac1881ef8993b5cd8fd088"}},{"ruleId":"D1","level":"warning","message":{"text":"WebFetchToolInvocation.execute (cyclomatic 17): WebFetchToolInvocation.execute has cyclomatic complexity 17 (threshold 15). Of this number, 13 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":"packages/core/src/tools/web-fetch.ts"},"region":{"startLine":771}}}],"partialFingerprints":{"codehealthFindingId/v1":"88f5764db1e2568d2f248da97e817783169d84eceed04c17b3363355d4d54e12"}},{"ruleId":"D1","level":"warning","message":{"text":"getFolderStructure.formatStructure (cyclomatic 17): getFolderStructure.formatStructure 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":"packages/core/src/utils/getFolderStructure.ts"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"f703e255dbc5e6e2e0f39b81a6868d020a5bb67e07d226bc997845df1fbc2bef"}},{"ruleId":"D1","level":"warning","message":{"text":"memoryDiscovery.findProjectRoot (cyclomatic 17): memoryDiscovery.findProjectRoot 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":"packages/core/src/utils/memoryDiscovery.ts"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"06a7b1a7dbc1a0882e9d7101ec80f4f4d832a591847bceeda547c61c0a17e130"}},{"ruleId":"D1","level":"warning","message":{"text":"extension.activate (cyclomatic 17): extension.activate has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 8 of the 17 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 195, 140, 126, \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":"packages/vscode-ide-companion/src/extension.ts"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2778f48059e84d176c49b5b3ae70738fcd270ea68017a6c9377cf43dcccc62d"}},{"ruleId":"D1","level":"warning","message":{"text":"telemetry_utils.manageTelemetrySettings (cyclomatic 17): telemetry_utils.manageTelemetrySettings has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/telemetry_utils.js"},"region":{"startLine":315}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbee62b75f82cff68ce3859d143133465a8738772a337e1c3a4435a20dc283e3"}},{"ruleId":"D1","level":"warning","message":{"text":"eval-coverage.formatCoverageReport (cyclomatic 17): eval-coverage.formatCoverageReport has cyclomatic complexity 17 (threshold 15). 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, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/utils/eval-coverage.ts"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d031972280299c0096d07cd83d2f13224ba2818207454b714b4a585c6219e1a"}},{"ruleId":"D1","level":"warning","message":{"text":"main.main (cyclomatic 17): main.main 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":"tools/caretaker-agent/cloudrun/triage-worker/main.py"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c7c9a858edff9c0267aa040a4ed6496a7a3c505e68973b641a1d52d0fc5dbde"}},{"ruleId":"D1","level":"warning","message":{"text":"GeminiSandbox.ApplyBulkAcls (cyclomatic 16): GeminiSandbox.ApplyBulkAcls 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":"packages/core/src/sandbox/windows/GeminiSandbox.cs"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"35bf34d3d9cf7fa8b7d09921cc266eec8c49eed26cebaf2e4fd2d1d5fbce4c51"}},{"ruleId":"D1","level":"warning","message":{"text":"Session.streamHistory (cyclomatic 16): Session.streamHistory 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":"packages/cli/src/acp/acpSession.ts"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa8547f7918a19b5135e0ffc00f62afc0ecf715cb49bf96cc4957896ad77b66e"}},{"ruleId":"D1","level":"warning","message":{"text":"logs.readLastLines (cyclomatic 16): logs.readLastLines 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":"packages/cli/src/commands/gemma/logs.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"47c9b61570f9c04121d39d2d48e2399ceff610bc576ddd8512cafdf38d6b2686"}},{"ruleId":"D1","level":"warning","message":{"text":"settings-validation.buildZodSchemaFromJsonSchema (cyclomatic 16): settings-validation.buildZodSchemaFromJsonSchema 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":"packages/cli/src/config/settings-validation.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"bba1a3d7ae5179b34d92b3a1360cfb1cb81f42df8c264ec2dad108128a3898e3"}},{"ruleId":"D1","level":"warning","message":{"text":"settings.loadEnvironment (cyclomatic 16): settings.loadEnvironment 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":"packages/cli/src/config/settings.ts"},"region":{"startLine":655}}}],"partialFingerprints":{"codehealthFindingId/v1":"3daa3a4d48f554d99f335cd5fab4f41068eac67bc468ba06c5354e3fd3ceef11"}},{"ruleId":"D1","level":"warning","message":{"text":"useAuth.useAuthCommand (cyclomatic 16): useAuth.useAuthCommand 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 4 function literals inside it that branch (lines 89, 59, 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":"packages/cli/src/ui/auth/useAuth.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"a45bc4401c362253db83cbacf476f8ad14176683a3947f7876b7944fd13f058f"}},{"ruleId":"D1","level":"warning","message":{"text":"extensionsCommand.restartAction (cyclomatic 16): extensionsCommand.restartAction has cyclomatic complexity 16 (threshold 15). 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: 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":"packages/cli/src/ui/commands/extensionsCommand.ts"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"858211a29ed7b79c78303b1b5b5e1a7e26025760fa68232625d10660cfb79daf"}},{"ruleId":"D1","level":"warning","message":{"text":"SessionBrowser.SessionItem (cyclomatic 16): SessionBrowser.SessionItem has cyclomatic complexity 16 (threshold 15). Of this number, 14 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":"packages/cli/src/ui/components/SessionBrowser.tsx"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dcb0754d91250829cd7f8ef22b987b7115ed085bd68703924218da455d4a0fa"}},{"ruleId":"D1","level":"warning","message":{"text":"VoiceModelDialog.VoiceModelDialog (cyclomatic 16): VoiceModelDialog.VoiceModelDialog has cyclomatic complexity 16 (threshold 15). Of this number, 8 points are the body\u0027s own statements and 8 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":"packages/cli/src/ui/components/VoiceModelDialog.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"236742e01dbabe55383eb6e4105177dc5f614dde49dae28693d8713c29d44375"}},{"ruleId":"D1","level":"warning","message":{"text":"ShellToolMessage.ShellToolMessage (cyclomatic 16): ShellToolMessage.ShellToolMessage 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 3 function literals inside it that branch (lines 100, 129, 146). 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":"packages/cli/src/ui/components/messages/ShellToolMessage.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"482583fca8dbcc3bde38003ac372d644a851fd8131d82b5db4c2bf49442a0da1"}},{"ruleId":"D1","level":"warning","message":{"text":"SlicingMaxSizedBox.SlicingMaxSizedBox (cyclomatic 16): SlicingMaxSizedBox.SlicingMaxSizedBox 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 34). 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":"packages/cli/src/ui/components/shared/SlicingMaxSizedBox.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"447adc18795c106f9fb5a5c9eb1288cac0f7d266068ebbb5862e4c7251b4181c"}},{"ruleId":"D1","level":"warning","message":{"text":"ExtensionRegistryView.ExtensionRegistryView (cyclomatic 16): ExtensionRegistryView.ExtensionRegistryView 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 3 function literals inside it that branch (lines 139, 72, 205). 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":"packages/cli/src/ui/components/views/ExtensionRegistryView.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"6875fbcee44db01c5a907a874bf2196ea051ab310a8fb97ac2d49839c51ffa36"}},{"ruleId":"D1","level":"warning","message":{"text":"KeypressContext.KeypressProvider (cyclomatic 16): KeypressContext.KeypressProvider 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 834, 790, 855, \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":"packages/cli/src/ui/contexts/KeypressContext.tsx"},"region":{"startLine":769}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd9e0664ab5871300e8c9d3a0bdaca3d29b796544961b98b800f0aeaa62f5c83"}},{"ruleId":"D1","level":"warning","message":{"text":"SessionContext.areModelMetricsEqual (cyclomatic 16): SessionContext.areModelMetricsEqual 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":"packages/cli/src/ui/contexts/SessionContext.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a31eaeae269bbacb0d4f3c56e4c5e5dcd5ff4a4ced927cbfe4fca0f2fb28151"}},{"ruleId":"D1","level":"warning","message":{"text":"useHistoryManager.useHistory (cyclomatic 16): useHistoryManager.useHistory 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 3 function literals inside it that branch (lines 65, 74, 144). 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":"packages/cli/src/ui/hooks/useHistoryManager.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"90c3f6fcadfffd3d526cc7dafa803b7049fa915bee174cd1d7c6e9c7552c2ff0"}},{"ruleId":"D1","level":"warning","message":{"text":"useIncludeDirsTrust.useIncludeDirsTrust (cyclomatic 16): useIncludeDirsTrust.useIncludeDirsTrust 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 62). 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":"packages/cli/src/ui/hooks/useIncludeDirsTrust.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8a5c77b598b08431cd0acf080ed8de23ef996f8c901b63b88ff7f9a7f72ddfe"}},{"ruleId":"D1","level":"warning","message":{"text":"useInlineEditBuffer.editBufferReducer (cyclomatic 16): useInlineEditBuffer.editBufferReducer 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":"packages/cli/src/ui/hooks/useInlineEditBuffer.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"bee2544bff8c01d145ff57e9f47c8efc310250d827883901635d62c98a9068c2"}},{"ruleId":"D1","level":"warning","message":{"text":"useShellCompletion.scanPathExecutables (cyclomatic 16): useShellCompletion.scanPathExecutables 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 262, 254). 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":"packages/cli/src/ui/hooks/useShellCompletion.ts"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"a40bfd9d44f3b814a5798e9c120f482120f1beb94d76c38e550b5bebdae33b8d"}},{"ruleId":"D1","level":"warning","message":{"text":"useTabbedNavigation.useTabbedNavigation (cyclomatic 16): useTabbedNavigation.useTabbedNavigation 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 6 function literals inside it that branch (lines 205, 163, 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":"packages/cli/src/ui/hooks/useTabbedNavigation.ts"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"435235139459d99a282e8a378d689b4479506a1831fccf0cfde29c918b1f6fd8"}},{"ruleId":"D1","level":"warning","message":{"text":"clipboardUtils.saveClipboardImage (cyclomatic 16): clipboardUtils.saveClipboardImage 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":"packages/cli/src/ui/utils/clipboardUtils.ts"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccd7c56ccb51a4eaf95156715f2fc858c2f800719bc982e07c4ad252b8ea01e3"}},{"ruleId":"D1","level":"warning","message":{"text":"sandboxUtils.entrypoint (cyclomatic 16): sandboxUtils.entrypoint 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":"packages/cli/src/utils/sandboxUtils.ts"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"38acfc5877faffd3eec276763bcb89af476e0e0dddb9aa93f0d4d22cd8cb7bd1"}},{"ruleId":"D1","level":"warning","message":{"text":"skillUtils.installSkill (cyclomatic 16): skillUtils.installSkill 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":"packages/cli/src/utils/skillUtils.ts"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c06442c8e7957b9f2478d0ead876caefd66e2a02e80e0cc2ceec1705db2f878"}},{"ruleId":"D1","level":"warning","message":{"text":"agentLoader.guessIntendedKind (cyclomatic 16): agentLoader.guessIntendedKind 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":"packages/core/src/agents/agentLoader.ts"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d087e0c186e4d4468aecc90c475da67615b54c18aadb68d569686b87584680b"}},{"ruleId":"D1","level":"warning","message":{"text":"McpToolInvocation.execute (cyclomatic 16): McpToolInvocation.execute has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/agents/browser/mcpToolWrapper.ts"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"22a93b6d3bea98caaa94cebf20c0ca337802f9f3dd3235091dab73c5062d3fc8"}},{"ruleId":"D1","level":"warning","message":{"text":"admin_controls.sanitizeAdminSettings (cyclomatic 16): admin_controls.sanitizeAdminSettings 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":"packages/core/src/code_assist/admin/admin_controls.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d0d975aa7a8223c15e60d24732fa4b60e4111e5a3f2c93f0b16bba454c8bf1c"}},{"ruleId":"D1","level":"warning","message":{"text":"Config.refreshUserQuota (cyclomatic 16): Config.refreshUserQuota 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":"packages/core/src/config/config.ts"},"region":{"startLine":2305}}}],"partialFingerprints":{"codehealthFindingId/v1":"04dd4efab91bb6201b73e907410641d2d7089502b33474ea7b8336cf811cd237"}},{"ruleId":"D1","level":"warning","message":{"text":"toGraph.getStableId (cyclomatic 16): toGraph.getStableId 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":"packages/core/src/context/graph/toGraph.ts"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"a96d69c9b8f1fcd1bda2bfd86364409fc66420bf50da4ab5aae25d9402f32168"}},{"ruleId":"D1","level":"warning","message":{"text":"nodeDistillationProcessor.createNodeDistillationProcessor (cyclomatic 16): nodeDistillationProcessor.createNodeDistillationProcessor 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 2 function literals inside it that branch (lines 75, 37). 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":"packages/core/src/context/processors/nodeDistillationProcessor.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"a26ddc5381c1ed1eebf7a59fef4a5d4e72349b1848dfd28b9b1e4634e4c35e2b"}},{"ruleId":"D1","level":"warning","message":{"text":"ToolOutputMaskingService.formatShellPreview (cyclomatic 16): ToolOutputMaskingService.formatShellPreview 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":"packages/core/src/context/toolOutputMaskingService.ts"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"1106f61f4f1f78ea5d6ca39da67838ef53ab71b7074ccd65450c214c9d00c665"}},{"ruleId":"D1","level":"warning","message":{"text":"PolicyEngine.constructor (cyclomatic 16): PolicyEngine.constructor 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":"packages/core/src/policy/policy-engine.ts"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a984e3df6388f446ccc44c89ac6764d395630c665f36ef22b2e944d60ffa68d"}},{"ruleId":"D1","level":"warning","message":{"text":"CheckerRunner.executeCheckerProcess (cyclomatic 16): CheckerRunner.executeCheckerProcess 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 4 function literals inside it that branch (lines 168, 213, 255, \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":"packages/core/src/safety/checker-runner.ts"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"acd67bd859a481cc5fcc8f078a7b575391284ac53c863b623db4b6ee019da174"}},{"ruleId":"D1","level":"warning","message":{"text":"ChatRecordingService.recordToolCalls (cyclomatic 16): ChatRecordingService.recordToolCalls has cyclomatic complexity 16 (threshold 15). Of this number, 12 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":"packages/core/src/services/chatRecordingService.ts"},"region":{"startLine":775}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb44c0747bcea445d464a8b70a2c90615d882200af9fba826550b8290d026ea3"}},{"ruleId":"D1","level":"warning","message":{"text":"chatRecordingService.parseLegacyRecordFallback (cyclomatic 16): chatRecordingService.parseLegacyRecordFallback has cyclomatic complexity 16 (threshold 15). Of this number, 12 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":"packages/core/src/services/chatRecordingService.ts"},"region":{"startLine":1041}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1b572b6f8334b27bcba21bbcf24a17d4df417e2fd2a848d53ecff01bb47c8be"}},{"ruleId":"D1","level":"warning","message":{"text":"sessionScratchpadUtils.tokenizeShellCommand (cyclomatic 16): sessionScratchpadUtils.tokenizeShellCommand 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":"packages/core/src/services/sessionScratchpadUtils.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"f48c5e318d75bb0282462a6377a9cca581daef39b7ef9e540f475c8eae6bf69d"}},{"ruleId":"D1","level":"warning","message":{"text":"ShellExecutionService.resizePty (cyclomatic 16): ShellExecutionService.resizePty 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":"packages/core/src/services/shellExecutionService.ts"},"region":{"startLine":1875}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6af5d1ce913b608c45937071f446b128c6c58cfbb6ad5db4958956c2689b767"}},{"ruleId":"D1","level":"warning","message":{"text":"validate_skill.validateSkill (cyclomatic 16): validate_skill.validateSkill 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":"packages/core/src/skills/builtin/skill-creator/scripts/validate_skill.cjs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbc31b54aa06a06cda586fad9505e4492debd2b89a2b54fe06fb053fb2121c52"}},{"ruleId":"D1","level":"warning","message":{"text":"package_skill.main (cyclomatic 16): package_skill.main 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":"packages/core/src/skills/builtin/skill-creator/scripts/package_skill.cjs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5826e64524b31400e8515a0ba978161dc5f7a9c897546225ca031f9ed0af710"}},{"ruleId":"D1","level":"warning","message":{"text":"EditTool.validateToolParamValues (cyclomatic 16): EditTool.validateToolParamValues 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":"packages/core/src/tools/edit.ts"},"region":{"startLine":1138}}}],"partialFingerprints":{"codehealthFindingId/v1":"570836e32d64f99424adc2941f65597f83ae5925f50f8194fc984117ca48a839"}},{"ruleId":"D1","level":"warning","message":{"text":"EditTool.getModifyContext (cyclomatic 16): EditTool.getModifyContext 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 3 function literals inside it that branch (lines 1221, 1286, 1275). 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":"packages/core/src/tools/edit.ts"},"region":{"startLine":1220}}}],"partialFingerprints":{"codehealthFindingId/v1":"1da9a74e08e60c5bfa3496ffe73f82caf2eea459e380ff7334eb4ac2fe2d0b06"}},{"ruleId":"D1","level":"warning","message":{"text":"edit.calculateFuzzyReplacement (cyclomatic 16): edit.calculateFuzzyReplacement has cyclomatic complexity 16 (threshold 15). 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, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/edit.ts"},"region":{"startLine":1366}}}],"partialFingerprints":{"codehealthFindingId/v1":"82d3ab368f219140e6e7d8c816ba09c9864919867cc5d53e5c066831b6222269"}},{"ruleId":"D1","level":"warning","message":{"text":"GlobToolInvocation.execute (cyclomatic 16): GlobToolInvocation.execute has cyclomatic complexity 16 (threshold 15). 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, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/glob.ts"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5b72da0daba561d1dabcbf227491d78f189b00bbb4ecbbb67008cf982a1ddf1"}},{"ruleId":"D1","level":"warning","message":{"text":"grep-utils.enrichWithAutoContext (cyclomatic 16): grep-utils.enrichWithAutoContext 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":"packages/core/src/tools/grep-utils.ts"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"c743f68c7b48ca50a5b7fc6cf544968552183f6ef3892758a68364b8c896b837"}},{"ruleId":"D1","level":"warning","message":{"text":"GrepTool.validateToolParamValues (cyclomatic 16): GrepTool.validateToolParamValues 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":"packages/core/src/tools/grep.ts"},"region":{"startLine":711}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1779aa197672c725f0f8e5a7c84fe225c632c4f48191a692ce256073c1e0594"}},{"ruleId":"D1","level":"warning","message":{"text":"McpClient.refreshTools (cyclomatic 16): McpClient.refreshTools 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":"packages/core/src/tools/mcp-client.ts"},"region":{"startLine":696}}}],"partialFingerprints":{"codehealthFindingId/v1":"a34c731ecd28768e650e20a41ee4a9e3f18dc7ae3d1ef0139731b59667504381"}},{"ruleId":"D1","level":"warning","message":{"text":"ReadMcpResourceToolInvocation.execute (cyclomatic 16): ReadMcpResourceToolInvocation.execute has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/read-mcp-resource.ts"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b68aacde8e48f1cdbef12ae5fdc578f53a111cc6624063bb97b5e27a3d8ba11"}},{"ruleId":"D1","level":"warning","message":{"text":"WebSearchToolInvocation.execute (cyclomatic 16): WebSearchToolInvocation.execute 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, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/web-search.ts"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"3efa50289d5bc47f82e785bc3d9af6bb9e16d20c8196d48bc9e26a0f84f01719"}},{"ruleId":"D1","level":"warning","message":{"text":"fetch.safeLookup (cyclomatic 16): fetch.safeLookup has cyclomatic complexity 16 (threshold 15). Of this number, 8 points are the body\u0027s own statements and 8 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":"packages/core/src/utils/fetch.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b9ac1ff981a96b8e4d314a475a1eb2553c490d653664461177e9e12e262c612"}},{"ruleId":"D1","level":"warning","message":{"text":"markdownUtils.jsonToMarkdown (cyclomatic 16): markdownUtils.jsonToMarkdown has cyclomatic complexity 16 (threshold 15). Of this number, 9 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":"packages/core/src/utils/markdownUtils.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"023743b049c6127d0478c0c0c4086714c90102d605988aefaa52e56440485a69"}},{"ruleId":"D1","level":"warning","message":{"text":"partUtils.partToString (cyclomatic 16): partUtils.partToString 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":"packages/core/src/utils/partUtils.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"69660770e5bc0791d3ee3fa962c18693917dccba009ebcbc9e0732e1efbb1295"}},{"ruleId":"D1","level":"warning","message":{"text":"retry.isRetryableError (cyclomatic 16): retry.isRetryableError 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":"packages/core/src/utils/retry.ts"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"3999653479295ccba60f50b07980aecbbfebf199a2c7c8aa04c5163ce4b999e5"}},{"ruleId":"D1","level":"warning","message":{"text":"security.parseWindowsBatchSecurityOutput (cyclomatic 16): security.parseWindowsBatchSecurityOutput has cyclomatic complexity 16 (threshold 15). 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, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/security.ts"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cb07367892f2d7936d7479631c38b852d296dd3acdce3c22d48270da8da8861"}},{"ruleId":"D1","level":"warning","message":{"text":"sessionOperations.deleteSessionFileAndArtifacts (cyclomatic 16): sessionOperations.deleteSessionFileAndArtifacts 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":"packages/core/src/utils/sessionOperations.ts"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"55f052a1ea211b914db9f8a172be5075fd80f25354230ed19e9f9d8d9e8b13d6"}},{"ruleId":"D1","level":"warning","message":{"text":"App.CodeView (cyclomatic 16): App.CodeView 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 3 function literals inside it that branch (lines 1846, 1919, 1835). 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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":1829}}}],"partialFingerprints":{"codehealthFindingId/v1":"2324d4c810b68b7ee80590adc2e9d94af8abf1c0aa011997beddbf08d9b3e97b"}},{"ruleId":"D1","level":"warning","message":{"text":"github.handleEgressEvent (cyclomatic 16): github.handleEgressEvent 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":"tools/caretaker-agent/cloudrun/egress-service/src/actions/github.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbec4c4b3f45148913cd2dc9ef18c471718ff8c61b40b6b9f9934e338521b00b"}},{"ruleId":"D2","level":"warning","message":{"text":"InputPrompt.InputPrompt (cognitive 530): InputPrompt.InputPrompt has cognitive complexity 530 (threshold 15). Drivers by points: if/else 171 (330 pts), boolean chains 104, ternaries 37 (77 pts), loops 5 (18 pts), error handling 1 (nesting depth added 212). Of this number, 47 points are the body\u0027s own statements and 483 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":"packages/cli/src/ui/components/InputPrompt.tsx"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"40b5b359ff01fab37641150dff7df4a2aafb0d41fe3f60bd4eeed8e7429d5f49"}},{"ruleId":"D2","level":"warning","message":{"text":"vim-buffer-actions.handleVimAction (cognitive 394): vim-buffer-actions.handleVimAction has cognitive complexity 394 (threshold 15). Drivers by points: if/else 116 (272 pts), loops 24 (50 pts), boolean chains 49, ternaries 10 (20 pts), match/switch 2 (3 pts) (nesting depth added 193). 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":"packages/cli/src/ui/components/shared/vim-buffer-actions.ts"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"a30a4a00e920125591d387fe18481720d627d07dd4eb5f0dabee8f295a6225cc"}},{"ruleId":"D2","level":"warning","message":{"text":"useGeminiStream.useGeminiStream (cognitive 355): useGeminiStream.useGeminiStream has cognitive complexity 355 (threshold 15). Drivers by points: if/else 148 (236 pts), boolean chains 62, loops 10 (20 pts), ternaries 7 (18 pts), error handling 5 (13 pts), match/switch 2 (6 pts) (nesting depth added 121). Most of this is not in the body itself: 1 of the 355 points is its own statement and the rest belongs to 45 function literals inside it that branch (lines 452, 1973, 961, \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":"packages/cli/src/ui/hooks/useGeminiStream.ts"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"c17001654e444821cc6b06ff87a2566e14bf20bdfc7a58f8a47166ef6c7fa418"}},{"ruleId":"D2","level":"warning","message":{"text":"vim.useVim (cognitive 307): vim.useVim has cognitive complexity 307 (threshold 15). Drivers by points: if/else 94 (249 pts), boolean chains 28, ternaries 5 (23 pts), loops 1 (3 pts), match/switch 2 (3 pts), error handling 1 (nesting depth added 176). Most of this is not in the body itself: 0 of the 307 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 660, 473, 230, \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":"packages/cli/src/ui/hooks/vim.ts"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfc6bbf840c9dde32920fcd5ebc265723cfb807fa574d0a24c68a0e764f4295e"}},{"ruleId":"D2","level":"warning","message":{"text":"AppContainer.AppContainer (cognitive 269): AppContainer.AppContainer has cognitive complexity 269 (threshold 15). Drivers by points: if/else 121 (171 pts), boolean chains 65, ternaries 15 (24 pts), error handling 5 (8 pts), match/switch 1 (nesting depth added 62). Of this number, 27 points are the body\u0027s own statements and 242 belong to 53 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":"packages/cli/src/ui/AppContainer.tsx"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9cdb156d09e33a051a3256a12d6af81366cd645d9331266f47eb701a9294c7d"}},{"ruleId":"D2","level":"warning","message":{"text":"ShellToolInvocation.execute (cognitive 246): ShellToolInvocation.execute has cognitive complexity 246 (threshold 15). Drivers by points: if/else 72 (155 pts), boolean chains 35, loops 5 (24 pts), error handling 5 (18 pts), ternaries 8 (13 pts), match/switch 1 (nesting depth added 120). Of this number, 217 points are the body\u0027s own statements and 29 belong to 8 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":"packages/core/src/tools/shell.ts"},"region":{"startLine":523}}}],"partialFingerprints":{"codehealthFindingId/v1":"b52e2db74a739547633f69d9a1528123be91e1add7922f05e47c125d06a6ea68"}},{"ruleId":"D2","level":"warning","message":{"text":"sandbox.start_sandbox (cognitive 242): sandbox.start_sandbox has cognitive complexity 242 (threshold 15). Drivers by points: if/else 88 (166 pts), error handling 9 (23 pts), boolean chains 20, ternaries 11 (18 pts), loops 7 (15 pts) (nesting depth added 107). Of this number, 222 points are the body\u0027s own statements and 20 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":"packages/cli/src/utils/sandbox.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"22cb22f9a5b2a86ea0bf5d8ffdc342d064d5321e21ce570478949843f2bf514d"}},{"ruleId":"D2","level":"warning","message":{"text":"text-buffer.textBufferReducerLogic (cognitive 200): text-buffer.textBufferReducerLogic has cognitive complexity 200 (threshold 15). Drivers by points: if/else 66 (152 pts), boolean chains 20, ternaries 6 (14 pts), loops 2 (8 pts), match/switch 3 (6 pts) (nesting depth added 103). Of this number, 192 points are the body\u0027s own statements and 8 belong to 2 function literals inside it that branch. 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":"packages/cli/src/ui/components/shared/text-buffer.ts"},"region":{"startLine":1787}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5acee9724ebb6b263c7fa313d9990ce6cc72f2e13f83a6823df2a864e68af26"}},{"ruleId":"D2","level":"warning","message":{"text":"Session.#resolvePrompt (cognitive 197): Session.#resolvePrompt has cognitive complexity 197 (threshold 15). Drivers by points: if/else 59 (138 pts), boolean chains 17, error handling 5 (16 pts), ternaries 5 (16 pts), loops 5 (9 pts), match/switch 1 (nesting depth added 105). Of this number, 192 points are the body\u0027s own statements and 5 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":"packages/cli/src/acp/acpSession.ts"},"region":{"startLine":969}}}],"partialFingerprints":{"codehealthFindingId/v1":"1420ee5b509b460f15259ae804c5fb6f4132d46defc930577957ab28d4a7f75b"}},{"ruleId":"D2","level":"warning","message":{"text":"nonInteractiveCliAgentSession.runNonInteractive (cognitive 197): nonInteractiveCliAgentSession.runNonInteractive has cognitive complexity 197 (threshold 15). Drivers by points: if/else 62 (132 pts), ternaries 14 (41 pts), boolean chains 15, loops 2 (5 pts), match/switch 2 (3 pts), error handling 1 (nesting depth added 101). Most of this is not in the body itself: 0 of the 197 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 82, 371, 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":"packages/cli/src/nonInteractiveCliAgentSession.ts"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"0de1bef7d6c3f3512d4012cac2c3fc57832279017e5f7043d5221f6ec7699419"}},{"ruleId":"D2","level":"warning","message":{"text":"KeypressContext.emitKeys (cognitive 192): KeypressContext.emitKeys has cognitive complexity 192 (threshold 15). Drivers by points: if/else 50 (134 pts), boolean chains 28, loops 6 (25 pts), error handling 1 (5 pts) (nesting depth added 107). 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":"packages/cli/src/ui/contexts/KeypressContext.tsx"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"b749dfb7f7691f83620bfd47505af6e9b5a0448f3d709dcc4d3d1362fae84ff8"}},{"ruleId":"D2","level":"warning","message":{"text":"nonInteractiveCli.runNonInteractive (cognitive 188): nonInteractiveCli.runNonInteractive has cognitive complexity 188 (threshold 15). Drivers by points: if/else 64 (123 pts), ternaries 10 (37 pts), boolean chains 18, loops 3 (6 pts), error handling 2 (4 pts) (nesting depth added 91). Most of this is not in the body itself: 1 of the 188 points is its own statement and the rest belongs to 6 function literals inside it that branch (lines 85, 105, 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":"packages/cli/src/nonInteractiveCli.ts"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"058ff89fe46e832f52f6c64db2045fa2a5d1f6c78fd10a9866eb9d45ce91ae24"}},{"ruleId":"D2","level":"warning","message":{"text":"ToolConfirmationMessage.ToolConfirmationMessage (cognitive 181): ToolConfirmationMessage.ToolConfirmationMessage has cognitive complexity 181 (threshold 15). Drivers by points: if/else 63 (98 pts), boolean chains 52, ternaries 14 (25 pts), error handling 2 (4 pts), loops 1 (2 pts) (nesting depth added 49). Of this number, 20 points are the body\u0027s own statements and 161 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":"packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"b633d1f38c613653600c2e37cddb62bc67bb27299e8d6d9d945662a11fd80e62"}},{"ruleId":"D2","level":"warning","message":{"text":"chatRecordingService.loadConversationRecord (cognitive 177): chatRecordingService.loadConversationRecord has cognitive complexity 177 (threshold 15). Drivers by points: if/else 43 (131 pts), loops 6 (23 pts), boolean chains 15, ternaries 5, error handling 2 (3 pts) (nesting depth added 106). 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":"packages/core/src/services/chatRecordingService.ts"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebe6bd9b9df12beb6ad1694f1a52a470b22bd0ee6c1ae472df68a3e17d53b27b"}},{"ruleId":"D2","level":"warning","message":{"text":"GeminiChat.processStreamResponse (cognitive 162): GeminiChat.processStreamResponse has cognitive complexity 162 (threshold 15). Drivers by points: if/else 47 (126 pts), loops 8 (18 pts), boolean chains 13, ternaries 2 (5 pts) (nesting depth added 92). Of this number, 154 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":"packages/core/src/core/geminiChat.ts"},"region":{"startLine":1354}}}],"partialFingerprints":{"codehealthFindingId/v1":"660fd540c7dd1be07a6268ee4ceff077a7f6b29a60ac0b91d5da452f25c27a9f"}},{"ruleId":"D2","level":"warning","message":{"text":"TriageDuplicates.TriageDuplicates (cognitive 159): TriageDuplicates.TriageDuplicates has cognitive complexity 159 (threshold 15). Drivers by points: if/else 56 (77 pts), boolean chains 38, ternaries 20 (38 pts), error handling 4, loops 2 (nesting depth added 39). Of this number, 29 points are the body\u0027s own statements and 130 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":"packages/cli/src/ui/components/triage/TriageDuplicates.tsx"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"53c0b6dc240b5d90b2e95e3fbbdb853369d612a70f02e69d335d6520f805d8b4"}},{"ruleId":"D2","level":"warning","message":{"text":"retry.retryWithBackoff (cognitive 159): retry.retryWithBackoff has cognitive complexity 159 (threshold 15). Drivers by points: if/else 31 (106 pts), ternaries 5 (21 pts), error handling 4 (19 pts), boolean chains 12, loops 1 (nesting depth added 106). Of this number, 158 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":"packages/core/src/utils/retry.ts"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"c60d8d29ae1814aab78a0fa44e11ed624956db784c7f4ccd415886736a2b0cdf"}},{"ruleId":"D2","level":"warning","message":{"text":"ContextCompressionService.compressHistory (cognitive 131): ContextCompressionService.compressHistory has cognitive complexity 131 (threshold 15). Drivers by points: if/else 29 (96 pts), loops 10 (20 pts), boolean chains 15 (nesting depth added 77). Of this number, 130 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":"packages/core/src/context/contextCompressionService.ts"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a3dfde3462b44326312afc97101f9a36cbbdabbe850cd3dd32c0124e9128847"}},{"ruleId":"D2","level":"warning","message":{"text":"VirtualizedList.VirtualizedList (cognitive 129): VirtualizedList.VirtualizedList has cognitive complexity 129 (threshold 15). Drivers by points: if/else 42 (65 pts), boolean chains 34, ternaries 18 (25 pts), loops 5 (nesting depth added 30). Of this number, 22 points are the body\u0027s own statements and 107 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":"packages/cli/src/ui/components/shared/VirtualizedList.tsx"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"6017bbc7568ed5a9b72f802dbc70d2ad9005298503d502cf2cc18d34512ac2b5"}},{"ruleId":"D2","level":"warning","message":{"text":"CoderAgentExecutor.execute (cognitive 117): CoderAgentExecutor.execute has cognitive complexity 117 (threshold 15). Drivers by points: if/else 45 (79 pts), error handling 10 (20 pts), ternaries 3 (7 pts), boolean chains 6, loops 3 (5 pts) (nesting depth added 50). Most of this is not in the body itself: 10 of the 117 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 490, 565, 524, \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":"packages/a2a-server/src/agent/executor.ts"},"region":{"startLine":439}}}],"partialFingerprints":{"codehealthFindingId/v1":"c479ea4b6508f3809f405bad203a11dc213c16e4118e0c31ec0574643c99fbb3"}},{"ruleId":"D2","level":"warning","message":{"text":"toml-loader.loadPoliciesFromToml (cognitive 115): toml-loader.loadPoliciesFromToml has cognitive complexity 115 (threshold 15). Drivers by points: if/else 16 (55 pts), ternaries 6 (22 pts), loops 7 (20 pts), error handling 5 (16 pts), boolean chains 2 (nesting depth added 79). Of this number, 78 points are the body\u0027s own statements and 37 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":"packages/core/src/policy/toml-loader.ts"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"1226901e881e0b7443dcefb4b2781a97596cbb128b1dd7494104f378f72ed696"}},{"ruleId":"D2","level":"warning","message":{"text":"InboxDialog.InboxDialog (cognitive 114): InboxDialog.InboxDialog has cognitive complexity 114 (threshold 15). Drivers by points: if/else 38 (47 pts), ternaries 16 (26 pts), boolean chains 25, error handling 9 (11 pts), loops 3 (5 pts) (nesting depth added 23). Of this number, 24 points are the body\u0027s own statements and 90 belong to 24 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":"packages/cli/src/ui/components/InboxDialog.tsx"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c34769c772b04b6508d2e2a0f782751efad4588086cdbe4bb45c41c87e3c98a"}},{"ruleId":"D2","level":"warning","message":{"text":"slashCommandProcessor.useSlashCommandProcessor (cognitive 113): slashCommandProcessor.useSlashCommandProcessor has cognitive complexity 113 (threshold 15). Drivers by points: if/else 36 (75 pts), ternaries 4 (13 pts), boolean chains 9, match/switch 2 (9 pts), error handling 2 (7 pts) (nesting depth added 60). Most of this is not in the body itself: 0 of the 113 points are its own statements and the rest belongs to 13 function literals inside it that branch (lines 355, 159, 474, \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":"packages/cli/src/ui/hooks/slashCommandProcessor.ts"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac7e9f3575eb615d743e2596e62b27de6d17840c7bee9d9914d06ea8d24b95b8"}},{"ruleId":"D2","level":"warning","message":{"text":"config.loadCliConfig (cognitive 110): config.loadCliConfig has cognitive complexity 110 (threshold 15). Drivers by points: if/else 35 (49 pts), boolean chains 38, ternaries 14 (18 pts), error handling 2 (3 pts), match/switch 1 (2 pts) (nesting depth added 20). Of this number, 105 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":"packages/cli/src/config/config.ts"},"region":{"startLine":583}}}],"partialFingerprints":{"codehealthFindingId/v1":"939a00ca2b89993d97eef520c7a7216e93068a2f132c9515eaeafee0327021c2"}},{"ruleId":"D2","level":"warning","message":{"text":"consent.extensionConsentString (cognitive 105): consent.extensionConsentString has cognitive complexity 105 (threshold 15). Drivers by points: if/else 26 (57 pts), ternaries 5 (23 pts), loops 4 (14 pts), boolean chains 11 (nesting depth added 59). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/config/extensions/consent.ts"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"27b044772886a6adb330f11cebb1a874f5e95dfad834ae8f13cbbd9ab49c4a3a"}},{"ruleId":"D2","level":"warning","message":{"text":"sessionCleanup.cleanupExpiredSessions (cognitive 105): sessionCleanup.cleanupExpiredSessions has cognitive complexity 105 (threshold 15). Drivers by points: if/else 21 (58 pts), ternaries 5 (21 pts), error handling 5 (16 pts), boolean chains 6, loops 2 (4 pts) (nesting depth added 66). Of this number, 103 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":"packages/cli/src/utils/sessionCleanup.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cb0f5d9c5388bdabb87b2e4de69ef4dcc3d8e0939e19ea69f77f421253770bb"}},{"ruleId":"D2","level":"warning","message":{"text":"PolicyEngine.check (cognitive 105): PolicyEngine.check has cognitive complexity 105 (threshold 15). Drivers by points: if/else 31 (65 pts), boolean chains 17, loops 5 (12 pts), ternaries 3 (7 pts), error handling 1 (4 pts) (nesting depth added 48). Of this number, 102 points are the body\u0027s own statements and 3 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":"packages/core/src/policy/policy-engine.ts"},"region":{"startLine":600}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4202852b6a9587f8489aab903fd049db7aec992710970431743c4524c226b80"}},{"ruleId":"D2","level":"warning","message":{"text":"useVoiceMode.useVoiceMode (cognitive 104): useVoiceMode.useVoiceMode has cognitive complexity 104 (threshold 15). Drivers by points: if/else 50 (87 pts), boolean chains 10, ternaries 3 (6 pts), error handling 1 (nesting depth added 40). Most of this is not in the body itself: 0 of the 104 points are its own statements and the rest belongs to 12 function literals inside it that branch (lines 319, 131, 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":"packages/cli/src/ui/hooks/useVoiceMode.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd6222e91962b0cfeb288aad9827bfa311ca91d1802ed9f94de8805abd70c4f8"}},{"ruleId":"D2","level":"warning","message":{"text":"gemini.main (cognitive 101): gemini.main has cognitive complexity 101 (threshold 15). Drivers by points: if/else 43 (70 pts), boolean chains 17, error handling 2 (5 pts), ternaries 4 (5 pts), loops 2 (4 pts) (nesting depth added 33). Of this number, 90 points are the body\u0027s own statements and 11 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":"packages/cli/src/gemini.tsx"},"region":{"startLine":466}}}],"partialFingerprints":{"codehealthFindingId/v1":"1baa886605a7604953201e35b2acd10f500a40638f60a8ff21822685a8df4313"}},{"ruleId":"D2","level":"warning","message":{"text":"useExecutionLifecycle.useExecutionLifecycle (cognitive 101): useExecutionLifecycle.useExecutionLifecycle has cognitive complexity 101 (threshold 15). Drivers by points: if/else 54 (72 pts), boolean chains 13, ternaries 5 (11 pts), error handling 2 (3 pts), loops 1, match/switch 1 (nesting depth added 25). Most of this is not in the body itself: 1 of the 101 points is its own statement and the rest belongs to 16 function literals inside it that branch (lines 365, 425, 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":"packages/cli/src/ui/hooks/useExecutionLifecycle.ts"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ac9bd69dac353cf032eb5355d498b461352b64984a9b890c1a4b1d527630f30"}},{"ruleId":"D2","level":"warning","message":{"text":"GeminiChat.sendMessageStream (cognitive 101): GeminiChat.sendMessageStream has cognitive complexity 101 (threshold 15). Drivers by points: if/else 30 (67 pts), boolean chains 15, ternaries 4 (13 pts), error handling 2 (3 pts), loops 2 (3 pts) (nesting depth added 48). Of this number, 37 points are the body\u0027s own statements and 64 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":"packages/core/src/core/geminiChat.ts"},"region":{"startLine":480}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ae565ce0fc91d514c11f0adddfdcf73ed1597760723c6aea84c68cd08038e45"}},{"ruleId":"D2","level":"warning","message":{"text":"ExtensionManager._buildExtension (cognitive 100): ExtensionManager._buildExtension has cognitive complexity 100 (threshold 15). Drivers by points: if/else 31 (64 pts), loops 7 (22 pts), boolean chains 6, error handling 3 (4 pts), ternaries 1 (4 pts) (nesting depth added 52). Of this number, 98 points are the body\u0027s own statements and 2 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":"packages/cli/src/config/extension-manager.ts"},"region":{"startLine":708}}}],"partialFingerprints":{"codehealthFindingId/v1":"043179a7bc440640275107bfcb07db29b78f946c594aa5de16298167f356ce7a"}},{"ruleId":"D2","level":"warning","message":{"text":"useSlashCompletion.useCommandSuggestions (cognitive 98): useSlashCompletion.useCommandSuggestions has cognitive complexity 98 (threshold 15). Drivers by points: if/else 28 (70 pts), boolean chains 22, error handling 2 (6 pts) (nesting depth added 46). Most of this is not in the body itself: 0 of the 98 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 229, 278, 173, \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":"packages/cli/src/ui/hooks/useSlashCompletion.ts"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"62dd0ce3b22daa876f9f6fc47397320ac4cc8242d540b1a496d6a16e6f8fe72c"}},{"ruleId":"D2","level":"warning","message":{"text":"BaseSettingsDialog.BaseSettingsDialog (cognitive 97): BaseSettingsDialog.BaseSettingsDialog has cognitive complexity 97 (threshold 15). Drivers by points: if/else 32 (54 pts), boolean chains 22, ternaries 13 (21 pts) (nesting depth added 30). Most of this is not in the body itself: 13 of the 97 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 290, 489, 163, \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":"packages/cli/src/ui/components/shared/BaseSettingsDialog.tsx"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"28a026407c3256982eca0a79a2bc911105f106b9b1ff0be129fa3a11809b1ecd"}},{"ruleId":"D2","level":"warning","message":{"text":"mcp-client.connectToMcpServer (cognitive 97): mcp-client.connectToMcpServer has cognitive complexity 97 (threshold 15). Drivers by points: if/else 27 (75 pts), error handling 5 (10 pts), boolean chains 8, ternaries 1 (3 pts), loops 1 (nesting depth added 55). Of this number, 95 points are the body\u0027s own statements and 2 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":"packages/core/src/tools/mcp-client.ts"},"region":{"startLine":1839}}}],"partialFingerprints":{"codehealthFindingId/v1":"241ac763d0a4a2ba2eee68739099d760d84009fd0916fa5535136e0156afd9fb"}},{"ruleId":"D2","level":"warning","message":{"text":"LocalSessionInvocation.execute (cognitive 94): LocalSessionInvocation.execute has cognitive complexity 94 (threshold 15). Drivers by points: if/else 23 (46 pts), ternaries 13 (27 pts), boolean chains 11, loops 3 (8 pts), error handling 1, match/switch 1 (nesting depth added 42). Of this number, 33 points are the body\u0027s own statements and 61 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":"packages/core/src/agents/local-session-invocation.ts"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"4386f064c8b68336018f0f3e7b886e20d5633ab956498c52ab9383691147e194"}},{"ruleId":"D2","level":"warning","message":{"text":"text-buffer.useTextBuffer (cognitive 91): text-buffer.useTextBuffer has cognitive complexity 91 (threshold 15). Drivers by points: if/else 48 (71 pts), boolean chains 8, loops 4 (5 pts), ternaries 4, error handling 3 (nesting depth added 24). Most of this is not in the body itself: 3 of the 91 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 3372, 2948, 3552, \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":"packages/cli/src/ui/components/shared/text-buffer.ts"},"region":{"startLine":2832}}}],"partialFingerprints":{"codehealthFindingId/v1":"41f768ebd3acd74a119526b64491fe3afefd008a19f85b95a5aacf1bb9cfc977"}},{"ruleId":"D2","level":"warning","message":{"text":"untrustedContextTracker.extractUntrustedContext (cognitive 91): untrustedContextTracker.extractUntrustedContext has cognitive complexity 91 (threshold 15). Drivers by points: if/else 16 (64 pts), loops 6 (25 pts), boolean chains 2 (nesting depth added 67). 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":"packages/core/src/utils/untrustedContextTracker.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"d40145078191a73c0e15f9460624f4c3654aa43ece19b896ede4044ba29e796a"}},{"ruleId":"D2","level":"warning","message":{"text":"GrepToolInvocation.performGrepSearch (cognitive 90): GrepToolInvocation.performGrepSearch has cognitive complexity 90 (threshold 15). Drivers by points: if/else 25 (65 pts), boolean chains 10, error handling 4 (7 pts), loops 4 (7 pts), ternaries 1 (nesting depth added 46). Of this number, 82 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":"packages/core/src/tools/grep.ts"},"region":{"startLine":413}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc649c6320e95b013d4c758171663b37ec21680f9dcfc73347bb61e666c55907"}},{"ruleId":"D2","level":"warning","message":{"text":"historyHardening.pairToolsAndEnforceSignatures (cognitive 89): historyHardening.pairToolsAndEnforceSignatures has cognitive complexity 89 (threshold 15). Drivers by points: if/else 18 (56 pts), loops 6 (20 pts), boolean chains 13 (nesting depth added 52). 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":"packages/core/src/utils/historyHardening.ts"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"a620b243dd64e02d3b5c2fc01aadf8caceb79f4040838e20e9338b8a5c5e0872"}},{"ruleId":"D2","level":"warning","message":{"text":"ToolGroupMessage.ToolGroupMessage (cognitive 88): ToolGroupMessage.ToolGroupMessage has cognitive complexity 88 (threshold 15). Drivers by points: if/else 18 (34 pts), boolean chains 28, ternaries 12 (18 pts), loops 5 (8 pts) (nesting depth added 25). Of this number, 18 points are the body\u0027s own statements and 70 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":"packages/cli/src/ui/components/messages/ToolGroupMessage.tsx"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"23f17568e48a1934b66ed6759fceb4be28ec727f7cf82c0d5e8a4e3aae77569b"}},{"ruleId":"D2","level":"warning","message":{"text":"atCommandProcessor.resolveFilePaths (cognitive 87): atCommandProcessor.resolveFilePaths has cognitive complexity 87 (threshold 15). Drivers by points: if/else 13 (32 pts), ternaries 7 (29 pts), error handling 2 (12 pts), boolean chains 9, loops 2 (5 pts) (nesting depth added 54). 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":"packages/cli/src/ui/hooks/atCommandProcessor.ts"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"afd164ca959bc3c857e80e472d9a557976b4ffe74b03d183a7e4f56c28726841"}},{"ruleId":"D2","level":"warning","message":{"text":"AskUserDialog.ChoiceQuestionView (cognitive 86): AskUserDialog.ChoiceQuestionView has cognitive complexity 86 (threshold 15). Drivers by points: if/else 34 (44 pts), boolean chains 28, ternaries 11 (14 pts) (nesting depth added 13). Most of this is not in the body itself: 14 of the 86 points are its own statements and the rest belongs to 14 function literals inside it that branch (lines 921, 796, 673, \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":"packages/cli/src/ui/components/AskUserDialog.tsx"},"region":{"startLine":520}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fc5518aa603c56c84a50788a01c75cd3af25f2784b94275a039bb7aa3af8e12"}},{"ruleId":"D2","level":"warning","message":{"text":"BrowserAgentInvocation.execute (cognitive 86): BrowserAgentInvocation.execute has cognitive complexity 86 (threshold 15). Drivers by points: if/else 20 (36 pts), ternaries 11 (21 pts), loops 5 (13 pts), error handling 4 (8 pts), boolean chains 7, match/switch 1 (nesting depth added 38). Of this number, 36 points are the body\u0027s own statements and 50 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":"packages/core/src/agents/browser/browserAgentInvocation.ts"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa4cd634d39d2bd9e0c7c7d7568aab8e59db1a9e8d300d090c91e5362df4465b"}},{"ruleId":"D2","level":"warning","message":{"text":"settings.migrateDeprecatedSettings (cognitive 85): settings.migrateDeprecatedSettings has cognitive complexity 85 (threshold 15). Drivers by points: if/else 30 (72 pts), ternaries 2 (6 pts), boolean chains 5, loops 1 (2 pts) (nesting depth added 47). Most of this is not in the body itself: 6 of the 85 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 1044, 1011). 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":"packages/cli/src/config/settings.ts"},"region":{"startLine":1001}}}],"partialFingerprints":{"codehealthFindingId/v1":"08f59c15dd32f42a7c14d86267da75c5792f996b29cca283bc427723388f2469"}},{"ruleId":"D2","level":"warning","message":{"text":"useCommandCompletion.useCommandCompletion (cognitive 85): useCommandCompletion.useCommandCompletion has cognitive complexity 85 (threshold 15). Drivers by points: if/else 27 (43 pts), boolean chains 26, loops 4 (12 pts), ternaries 3 (4 pts) (nesting depth added 25). Most of this is not in the body itself: 9 of the 85 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 121, 405, 253, \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":"packages/cli/src/ui/hooks/useCommandCompletion.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"86202a0f886ba03fb768c98587ec02c35bfb82a7121f11aed46b628abf5f08ce"}},{"ruleId":"D2","level":"warning","message":{"text":"googleQuotaErrors.classifyGoogleError (cognitive 84): googleQuotaErrors.classifyGoogleError has cognitive complexity 84 (threshold 15). Drivers by points: if/else 31 (66 pts), boolean chains 14, loops 2 (4 pts) (nesting depth added 37). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/googleQuotaErrors.ts"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e2bf4f293d08118849acf32be00649c8906a3dce2fb5057da5e76c356b86085"}},{"ruleId":"D2","level":"warning","message":{"text":"config.createPolicyEngineConfig (cognitive 83): config.createPolicyEngineConfig has cognitive complexity 83 (threshold 15). Drivers by points: if/else 21 (35 pts), loops 10 (21 pts), ternaries 9 (21 pts), boolean chains 4, error handling 1 (2 pts) (nesting depth added 38). Of this number, 55 points are the body\u0027s own statements and 28 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":"packages/core/src/policy/config.ts"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"351e3ef03f61e48966e408b562f4de59625fd6705d44500d83f546533855f8f8"}},{"ruleId":"D2","level":"warning","message":{"text":"LocalSubagentInvocation.execute (cognitive 82): LocalSubagentInvocation.execute has cognitive complexity 82 (threshold 15). Drivers by points: if/else 19 (38 pts), ternaries 11 (23 pts), boolean chains 11, loops 3 (8 pts), error handling 1, match/switch 1 (nesting depth added 36). Of this number, 29 points are the body\u0027s own statements and 53 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":"packages/core/src/agents/local-invocation.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ca715a05bfd2a55fe8832251adf97c63f40f681f970659e901e7e6d58ea1728"}},{"ruleId":"D2","level":"warning","message":{"text":"ExtensionManager.installOrUpdateExtension (cognitive 80): ExtensionManager.installOrUpdateExtension has cognitive complexity 80 (threshold 15). Drivers by points: if/else 36 (50 pts), boolean chains 19, error handling 3 (6 pts), ternaries 3 (5 pts) (nesting depth added 19). Of this number, 77 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":"packages/cli/src/config/extension-manager.ts"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcafc1cc7b497caa3c63d87c8688773b3b1207eaec1af404094c9fdf2e4fc3c8"}},{"ruleId":"D2","level":"warning","message":{"text":"ShellExecutionService.executeWithPty (cognitive 79): ShellExecutionService.executeWithPty has cognitive complexity 79 (threshold 15). Drivers by points: if/else 33 (44 pts), error handling 10 (16 pts), boolean chains 12, ternaries 6, loops 1 (nesting depth added 17). Of this number, 30 points are the body\u0027s own statements and 49 belong to 20 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":"packages/core/src/services/shellExecutionService.ts"},"region":{"startLine":1103}}}],"partialFingerprints":{"codehealthFindingId/v1":"a52a85995594074ef106dd7166552db333830851ca56ef0329d6bba5721decee"}},{"ruleId":"D2","level":"warning","message":{"text":"sessionUtils.convertSessionToClientHistory (cognitive 77): sessionUtils.convertSessionToClientHistory has cognitive complexity 77 (threshold 15). Drivers by points: if/else 15 (47 pts), loops 4 (16 pts), ternaries 2 (9 pts), boolean chains 5 (nesting depth added 51). 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":"packages/core/src/utils/sessionUtils.ts"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f4ed6bddc00f2d8b74bb29b97bc931736987db78999049c2cb7cdf639076362"}},{"ruleId":"D2","level":"warning","message":{"text":"ScrollProvider.ScrollProvider (cognitive 76): ScrollProvider.ScrollProvider has cognitive complexity 76 (threshold 15). Drivers by points: if/else 32 (55 pts), boolean chains 11, ternaries 2 (6 pts), loops 3 (4 pts) (nesting depth added 28). Most of this is not in the body itself: 0 of the 76 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 258, 190, 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":"packages/cli/src/ui/contexts/ScrollProvider.tsx"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc7d2333f974cfec2fef4a74abf38ac46493a1d6faaa05b2f8c4934c14fdae57"}},{"ruleId":"D2","level":"warning","message":{"text":"policy-engine.ruleMatches (cognitive 76): policy-engine.ruleMatches has cognitive complexity 76 (threshold 15). Drivers by points: if/else 29 (64 pts), boolean chains 10, loops 1 (2 pts) (nesting depth added 36). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/policy/policy-engine.ts"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa866364c84305c6c32dbfa90b825dbbe77e580fe1b70517057006a3c9f52899"}},{"ruleId":"D2","level":"warning","message":{"text":"ShellExecutionService.childProcessFallback (cognitive 74): ShellExecutionService.childProcessFallback has cognitive complexity 74 (threshold 15). Drivers by points: if/else 30 (57 pts), boolean chains 9, ternaries 4 (5 pts), error handling 2 (3 pts) (nesting depth added 29). Of this number, 26 points are the body\u0027s own statements and 48 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":"packages/core/src/services/shellExecutionService.ts"},"region":{"startLine":652}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbcbec0e402aaace33a11b17bce826745c7ded376fb6cb3c61a405c806d0f812"}},{"ruleId":"D2","level":"warning","message":{"text":"setup.handleSetup (cognitive 72): setup.handleSetup has cognitive complexity 72 (threshold 15). Drivers by points: if/else 23 (33 pts), error handling 8 (20 pts), ternaries 6 (14 pts), boolean chains 5 (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":"packages/cli/src/commands/gemma/setup.ts"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"fce5a0221e3633e823a86f43744bfcc40ea544a7e8296af027d19b561b5a5e52"}},{"ruleId":"D2","level":"warning","message":{"text":"Footer.Footer (cognitive 71): Footer.Footer has cognitive complexity 71 (threshold 15). Drivers by points: if/else 19 (35 pts), ternaries 14 (22 pts), boolean chains 7, loops 3 (5 pts), match/switch 1 (2 pts) (nesting depth added 27). Of this number, 61 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":"packages/cli/src/ui/components/Footer.tsx"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad5d2c114f5e732dad861a520369b063cc725b45c7e2dcca04c7f49879a71a4f"}},{"ruleId":"D2","level":"warning","message":{"text":"useAgentStream.useAgentStream (cognitive 70): useAgentStream.useAgentStream has cognitive complexity 70 (threshold 15). Drivers by points: if/else 24 (38 pts), boolean chains 16, ternaries 5 (9 pts), loops 2 (5 pts), error handling 1, match/switch 1 (nesting depth added 21). Most of this is not in the body itself: 1 of the 70 points is its own statement and the rest belongs to 14 function literals inside it that branch (lines 149, 485, 412, \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":"packages/cli/src/ui/hooks/useAgentStream.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"c54d0d494e756a29053b14fe34d8364b279b1d41804288170f59fca59e413314"}},{"ruleId":"D2","level":"warning","message":{"text":"GeminiClient.processTurn (cognitive 69): GeminiClient.processTurn has cognitive complexity 69 (threshold 15). Drivers by points: if/else 31 (48 pts), boolean chains 16, ternaries 2 (4 pts), loops 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":"packages/core/src/core/client.ts"},"region":{"startLine":614}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf22f6f23c8902517fdbba566e78eb66a9b691c88daf68c992a912e1a9fb12dd"}},{"ruleId":"D2","level":"warning","message":{"text":"memoryService.startMemoryService (cognitive 69): memoryService.startMemoryService has cognitive complexity 69 (threshold 15). Drivers by points: if/else 27 (40 pts), ternaries 5 (13 pts), error handling 5 (8 pts), boolean chains 5, loops 3 (nesting depth added 24). Of this number, 59 points are the body\u0027s own statements and 10 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":"packages/core/src/services/memoryService.ts"},"region":{"startLine":1133}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6bb6db6a49fc9ee2ad3047a0c3df31c6086d4412d03a927b78b32c418d070e1"}},{"ruleId":"D2","level":"warning","message":{"text":"ReadManyFilesToolInvocation.execute (cognitive 69): ReadManyFilesToolInvocation.execute has cognitive complexity 69 (threshold 15). Drivers by points: if/else 27 (46 pts), loops 6 (8 pts), ternaries 3 (7 pts), error handling 3 (5 pts), boolean chains 3 (nesting depth added 27). Of this number, 60 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":"packages/core/src/tools/read-many-files.ts"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9b03354084e5a818e933d11d39d28ad032dc5186c870d21aaf00bb58777b5d9"}},{"ruleId":"D2","level":"warning","message":{"text":"toolMaskingProcessor.createToolMaskingProcessor (cognitive 67): toolMaskingProcessor.createToolMaskingProcessor has cognitive complexity 67 (threshold 15). Drivers by points: if/else 22 (54 pts), loops 3 (7 pts), boolean chains 6 (nesting depth added 36). Most of this is not in the body itself: 0 of the 67 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 92, 160, 112). 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":"packages/core/src/context/processors/toolMaskingProcessor.ts"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"694e31a0243c4f2ee68458f6e072211096ab85bb4fe24b538f0ad11d60662334"}},{"ruleId":"D2","level":"warning","message":{"text":"patch-create-comment.main (cognitive 67): patch-create-comment.main has cognitive complexity 67 (threshold 15). Drivers by points: if/else 28 (46 pts), boolean chains 13, error handling 2 (6 pts), ternaries 2 (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":"scripts/releasing/patch-create-comment.js"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a297172c7ae424558f78c829977c1f9b35cbad5a13f60c3abe2bb5379363003"}},{"ruleId":"D2","level":"warning","message":{"text":"BackgroundTaskDisplay.BackgroundTaskDisplay (cognitive 66): BackgroundTaskDisplay.BackgroundTaskDisplay has cognitive complexity 66 (threshold 15). Drivers by points: if/else 29 (41 pts), ternaries 14 (19 pts), boolean chains 5, loops 1 (nesting depth added 17). Most of this is not in the body itself: 6 of the 66 points are its own statements and the rest belongs to 14 function literals inside it that branch (lines 146, 228, 111, \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":"packages/cli/src/ui/components/BackgroundTaskDisplay.tsx"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"f17ade5d48caf8126debd42d06e4adb4b9bc6ac761ab1b91ffb802e04f2734bc"}},{"ruleId":"D2","level":"warning","message":{"text":"contentGenerator.createContentGenerator (cognitive 66): contentGenerator.createContentGenerator has cognitive complexity 66 (threshold 15). Drivers by points: if/else 20 (32 pts), boolean chains 19, ternaries 6 (15 pts) (nesting depth added 21). Most of this is not in the body itself: 1 of the 66 points is its own statement 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":"packages/core/src/core/contentGenerator.ts"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d70d6246f7c15cbeecd91a626a6d76e066ebe74d83df377ce006c70413094c0"}},{"ruleId":"D2","level":"warning","message":{"text":"TriageIssues.TriageIssues (cognitive 65): TriageIssues.TriageIssues has cognitive complexity 65 (threshold 15). Drivers by points: if/else 30 (34 pts), ternaries 11 (18 pts), boolean chains 10, error handling 3 (nesting depth added 11). Of this number, 20 points are the body\u0027s own statements and 45 belong to 13 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":"packages/cli/src/ui/components/triage/TriageIssues.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e2a3fe752d2c6f0cd9c8f097b27d93e3f300fa16a5dcfb9715358f5b5207d64"}},{"ruleId":"D2","level":"warning","message":{"text":"Session.prompt (cognitive 64): Session.prompt has cognitive complexity 64 (threshold 15). Drivers by points: if/else 16 (38 pts), boolean chains 11, loops 4 (6 pts), ternaries 1 (4 pts), match/switch 1 (3 pts), error handling 1 (2 pts) (nesting depth added 30). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/acp/acpSession.ts"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebc1d5492fe5642ad29a98f7c741df679d542354577263af56d1ddf84c49dfdb"}},{"ruleId":"D2","level":"warning","message":{"text":"McpPromptLoader.loadCommands (cognitive 64): McpPromptLoader.loadCommands has cognitive complexity 64 (threshold 15). Drivers by points: if/else 13 (40 pts), boolean chains 9, loops 3 (6 pts), ternaries 2 (6 pts), error handling 1 (3 pts) (nesting depth added 36). Most of this is not in the body itself: 8 of the 64 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 152, 57, 88, \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":"packages/cli/src/services/McpPromptLoader.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"88dfa5703b9db2efc7dfc019e146c3714d9e2608849cac59310e4acf26eb123e"}},{"ruleId":"D2","level":"warning","message":{"text":"LegacyAgentProtocol._runLoop (cognitive 64): LegacyAgentProtocol._runLoop has cognitive complexity 64 (threshold 15). Drivers by points: if/else 14 (35 pts), ternaries 5 (15 pts), loops 3 (5 pts), boolean chains 4, match/switch 1 (3 pts), error handling 1 (2 pts) (nesting depth added 36). 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, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/agent/legacy-agent-session.ts"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"90066921425c8d6fae9e45f64c139b28bff7a4b68ee9ee7145b0e5fa4b28ca2d"}},{"ruleId":"D2","level":"warning","message":{"text":"prepareRuntime (cognitive 64): prepareRuntime has cognitive complexity 64 (threshold 15). Drivers by points: if/else 16 (25 pts), error handling 8 (21 pts), boolean chains 14, loops 1 (3 pts), ternaries 1 (nesting depth added 24). Of this number, 54 points are the body\u0027s own statements and 10 belong to 2 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sea/sea-launch.cjs"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"0adae89717b2b365f0521e3d199eda0c51af71c11504bde2fa0bf07489726944"}},{"ruleId":"D2","level":"warning","message":{"text":"LocalAgentExecutor.runInternal (cognitive 63): LocalAgentExecutor.runInternal has cognitive complexity 63 (threshold 15). Drivers by points: if/else 25 (44 pts), error handling 3 (9 pts), boolean chains 7, ternaries 2, loops 1 (nesting depth added 25). Of this number, 59 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":"packages/core/src/agents/local-executor.ts"},"region":{"startLine":571}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddbe66a6932811a07699ee1785a0fd30722f2670b7bd2c7f21304e42bc438c51"}},{"ruleId":"D2","level":"warning","message":{"text":"eval-report.summarizeReports (cognitive 63): eval-report.summarizeReports has cognitive complexity 63 (threshold 15). Drivers by points: if/else 9 (35 pts), loops 6 (14 pts), ternaries 3 (8 pts), boolean chains 4, error handling 1 (2 pts) (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":"scripts/utils/eval-report.ts"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"b361d184bd51edd1d21ad1e5bedf98ab5c40a17209e0a7fbab2fb84240c46c2a"}},{"ruleId":"D2","level":"warning","message":{"text":"ShellToolInvocation.shouldConfirmExecute (cognitive 62): ShellToolInvocation.shouldConfirmExecute has cognitive complexity 62 (threshold 15). Drivers by points: if/else 14 (48 pts), boolean chains 14 (nesting depth added 34). Of this number, 55 points are the body\u0027s own statements and 7 belong to 3 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":"packages/core/src/tools/shell.ts"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"eef4cd8c158377fa1892b03a85887969be9de8d47b321a088f6a15c79448cdc3"}},{"ruleId":"D2","level":"warning","message":{"text":"oauth2.initOauthClient (cognitive 61): oauth2.initOauthClient has cognitive complexity 61 (threshold 15). Drivers by points: if/else 19 (37 pts), error handling 6 (17 pts), boolean chains 4, loops 2 (3 pts) (nesting depth added 30). Of this number, 58 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":"packages/core/src/code_assist/oauth2.ts"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b66deaf0ceef48535b44ada79a42b57b5ba34b00c4e7e77b0e512ab46452347"}},{"ruleId":"D2","level":"warning","message":{"text":"ContextWorkingBufferImpl.syncPristineHistory (cognitive 61): ContextWorkingBufferImpl.syncPristineHistory has cognitive complexity 61 (threshold 15). Drivers by points: if/else 17 (34 pts), loops 11 (18 pts), boolean chains 6, ternaries 1 (3 pts) (nesting depth added 26). Of this number, 39 points are the body\u0027s own statements and 22 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":"packages/core/src/context/pipeline/contextWorkingBuffer.ts"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"42d5a4ab829b743b6d7b2a77f39cf049f05e463fde289fd4e3ae789175077901"}},{"ruleId":"D2","level":"warning","message":{"text":"rewindFileOps.revertFileChanges (cognitive 60): rewindFileOps.revertFileChanges has cognitive complexity 60 (threshold 15). Drivers by points: if/else 14 (43 pts), error handling 2 (10 pts), loops 2 (4 pts), boolean chains 3 (nesting depth added 39). 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":"packages/cli/src/ui/utils/rewindFileOps.ts"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb1aa2a722ec3f6ae65ab3a9a3eeac093c666cc5f3df6f1d507b64f11466c5a1"}},{"ruleId":"D2","level":"warning","message":{"text":"untrustedContextTracker.findUntrustedFlags (cognitive 59): untrustedContextTracker.findUntrustedFlags has cognitive complexity 59 (threshold 15). Drivers by points: if/else 16 (42 pts), boolean chains 9, loops 2 (6 pts), error handling 1, ternaries 1 (nesting depth added 30). Of this number, 50 points are the body\u0027s own statements and 9 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":"packages/core/src/utils/untrustedContextTracker.ts"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"07fbe69fae108206d34a0b4d7ed0e870eefbd2bbd878c8c9177262805f0c843a"}},{"ruleId":"D2","level":"warning","message":{"text":"eval-validate.validateInventory (cognitive 58): eval-validate.validateInventory has cognitive complexity 58 (threshold 15). Drivers by points: if/else 18 (47 pts), loops 4 (6 pts), ternaries 2 (3 pts), boolean chains 2 (nesting depth added 32). Of this number, 52 points are the body\u0027s own statements and 6 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/utils/eval-validate.ts"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"d51219fc7c139b65e0c0c16ae863472d8cf7e9789e7781b6613b3cbbbf6787cc"}},{"ruleId":"D2","level":"warning","message":{"text":"SubagentGroupDisplay.SubagentGroupDisplay (cognitive 57): SubagentGroupDisplay.SubagentGroupDisplay has cognitive complexity 57 (threshold 15). Drivers by points: if/else 24 (37 pts), boolean chains 7, ternaries 4 (6 pts), match/switch 2 (5 pts), loops 1 (2 pts) (nesting depth added 19). Of this number, 27 points are the body\u0027s own statements and 30 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":"packages/cli/src/ui/components/messages/SubagentGroupDisplay.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"d41684a5d749df4e56163b6a3c796d61b5e88c0eb111f75f356f96b0c5f58a51"}},{"ruleId":"D2","level":"warning","message":{"text":"MarkdownDisplay.MarkdownDisplayInternal (cognitive 57): MarkdownDisplay.MarkdownDisplayInternal has cognitive complexity 57 (threshold 15). Drivers by points: if/else 27 (36 pts), boolean chains 10, ternaries 3 (7 pts), loops 1 (2 pts), match/switch 1 (2 pts) (nesting depth added 15). Most of this is not in the body itself: 10 of the 57 points are its own statements and the rest belongs to one function literal inside it that branches (line 88). 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":"packages/cli/src/ui/utils/MarkdownDisplay.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ca09c02ce2830ac202b8c7a5b81cc73a7e6d881b98717e5536f883519cba554"}},{"ruleId":"D2","level":"warning","message":{"text":"GeminiClient.getIdeContextParts (cognitive 57): GeminiClient.getIdeContextParts has cognitive complexity 57 (threshold 15). Drivers by points: if/else 19 (40 pts), boolean chains 13, loops 2 (4 pts) (nesting depth added 23). 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":"packages/core/src/core/client.ts"},"region":{"startLine":429}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f4f2727a5a27016e597e899049529f185b9ba6f4a526fc4604bbbc2bfc5bf7a"}},{"ruleId":"D2","level":"warning","message":{"text":"useQuotaAndFallback.useQuotaAndFallback (cognitive 56): useQuotaAndFallback.useQuotaAndFallback has cognitive complexity 56 (threshold 15). Drivers by points: if/else 20 (26 pts), ternaries 9 (19 pts), boolean chains 11 (nesting depth added 16). Most of this is not in the body itself: 0 of the 56 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 75, 293, 321, \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":"packages/cli/src/ui/hooks/useQuotaAndFallback.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"62b55166230514ebaa5b2c926c4b4ba433d056b2a49ee59e422c37f622971ad0"}},{"ruleId":"D2","level":"warning","message":{"text":"PolicyEngine.checkShellCommand (cognitive 56): PolicyEngine.checkShellCommand has cognitive complexity 56 (threshold 15). Drivers by points: if/else 21 (48 pts), boolean chains 5, ternaries 2, loops 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":"packages/core/src/policy/policy-engine.ts"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"16a1fd713482e89811be058e7739d7ca5d2d150f59759f3a2b4d6cc9a6c93d33"}},{"ruleId":"D2","level":"warning","message":{"text":"patch-trigger.main (cognitive 56): patch-trigger.main has cognitive complexity 56 (threshold 15). Drivers by points: if/else 13 (17 pts), boolean chains 15, ternaries 7 (13 pts), error handling 4 (11 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":"scripts/releasing/patch-trigger.js"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecbca8b9ef07b71767b7401ee27460ca183d1483323bea8b37b3926015982d37"}},{"ruleId":"D2","level":"warning","message":{"text":"useShellCompletion.getTokenAtCursor (cognitive 55): useShellCompletion.getTokenAtCursor has cognitive complexity 55 (threshold 15). Drivers by points: if/else 12 (33 pts), loops 6 (13 pts), boolean chains 7, ternaries 2 (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":"packages/cli/src/ui/hooks/useShellCompletion.ts"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"df43fe865c502d9030649891348815cc0f5ff0dde8dc43543e61898b73eb814c"}},{"ruleId":"D2","level":"warning","message":{"text":"MCPOAuthProvider.authenticate (cognitive 54): MCPOAuthProvider.authenticate has cognitive complexity 54 (threshold 15). Drivers by points: if/else 20 (37 pts), boolean chains 10, error handling 3 (4 pts), ternaries 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":"packages/core/src/mcp/oauth-provider.ts"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5347a5be0ebe8ee51d1290b9e895e5f1853112d28fb7a7bd0dc3015325c4b33"}},{"ruleId":"D2","level":"warning","message":{"text":"Orchestrator.run (cognitive 54): Orchestrator.run has cognitive complexity 54 (threshold 15). Drivers by points: if/else 13 (25 pts), error handling 10 (19 pts), ternaries 2 (5 pts), boolean chains 4, loops 1 (nesting depth added 24). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tools/caretaker-agent/cloudrun/pr-generator/workflow/orchestrator.py"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"51e27e1ccfc9f281227f80458e23cde9bebd7fb5b429be11d9f318f9983ed722"}},{"ruleId":"D2","level":"warning","message":{"text":"sandbox.start_lxc_sandbox (cognitive 53): sandbox.start_lxc_sandbox has cognitive complexity 53 (threshold 15). Drivers by points: if/else 14 (25 pts), error handling 5 (9 pts), ternaries 3 (8 pts), loops 4 (6 pts), boolean chains 5 (nesting depth added 22). Of this number, 48 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":"packages/cli/src/utils/sandbox.ts"},"region":{"startLine":1039}}}],"partialFingerprints":{"codehealthFindingId/v1":"c26a4bfa87e2fbaf4941828ee2183e161c6b09fe8597fdcbca569300c32c2291"}},{"ruleId":"D2","level":"warning","message":{"text":"GeminiClient.sendMessageStream (cognitive 52): GeminiClient.sendMessageStream has cognitive complexity 52 (threshold 15). Drivers by points: if/else 18 (39 pts), boolean chains 7, ternaries 1 (5 pts), error handling 1 (nesting depth added 25). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/core/client.ts"},"region":{"startLine":910}}}],"partialFingerprints":{"codehealthFindingId/v1":"67ab4788356f252ca86ec3fe6de5cd548ea550ee40a8280797fd059db4c2ce4b"}},{"ruleId":"D2","level":"warning","message":{"text":"RewindViewer.RewindViewer (cognitive 51): RewindViewer.RewindViewer has cognitive complexity 51 (threshold 15). Drivers by points: if/else 20 (34 pts), ternaries 6 (11 pts), boolean chains 6 (nesting depth added 19). Most of this is not in the body itself: 6 of the 51 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 260, 100, 242, \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":"packages/cli/src/ui/components/RewindViewer.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"fda4390d619e24e291ce54e46246998ccab8925b58f972a9e2015ce37612ddf0"}},{"ruleId":"D2","level":"warning","message":{"text":"SettingsDialog.SettingsDialog (cognitive 51): SettingsDialog.SettingsDialog has cognitive complexity 51 (threshold 15). Drivers by points: if/else 21 (28 pts), boolean chains 11, ternaries 5 (8 pts), loops 3 (4 pts) (nesting depth added 11). Most of this is not in the body itself: 5 of the 51 points are its own statements and the rest belongs to 14 function literals inside it that branch (lines 300, 195, 222, \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":"packages/cli/src/ui/components/SettingsDialog.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"7056d7bf08310b0038b49b6a2d5098e5c3b04f48cf6b5aac3e4f3eff24b2813a"}},{"ruleId":"D2","level":"warning","message":{"text":"Turn.run (cognitive 51): Turn.run has cognitive complexity 51 (threshold 15). Drivers by points: if/else 16 (37 pts), loops 4 (7 pts), boolean chains 4, ternaries 1 (2 pts), error handling 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":"packages/core/src/core/turn.ts"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb2e4b42eb2154a3b543385917764e2fd4233aa82f2a8b52bafff9dfe50651ec"}},{"ruleId":"D2","level":"warning","message":{"text":"memoryImportProcessor.processImports (cognitive 51): memoryImportProcessor.processImports has cognitive complexity 51 (threshold 15). Drivers by points: if/else 14 (30 pts), boolean chains 7, ternaries 2 (6 pts), error handling 2 (5 pts), loops 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":"packages/core/src/utils/memoryImportProcessor.ts"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fa20e4a1dd2ab4d83e3d7808a22d3f81e40a71fe66af6598aa71bf082a161a3"}},{"ruleId":"D2","level":"warning","message":{"text":"config.parseArguments (cognitive 49): config.parseArguments has cognitive complexity 49 (threshold 15). Drivers by points: if/else 26 (29 pts), boolean chains 10, loops 2 (6 pts), ternaries 3, error handling 1 (nesting depth added 7). Most of this is not in the body itself: 13 of the 49 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 192, 230, 183, \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":"packages/cli/src/config/config.ts"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0d8fa1a3f19e9e5be2782b740b633f3a71d4fc30c7eb95a4144262c2a43a6d4"}},{"ruleId":"D2","level":"warning","message":{"text":"getFolderStructure.readFullStructure (cognitive 49): getFolderStructure.readFullStructure has cognitive complexity 49 (threshold 15). Drivers by points: if/else 11 (37 pts), boolean chains 5, loops 3 (5 pts), error handling 1 (2 pts) (nesting depth added 29). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/getFolderStructure.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"9602d5e4c569cf02298e79ad3b3cbcb708538a2212a591632610d0df30b482bd"}},{"ruleId":"D2","level":"warning","message":{"text":"editorUtils.openFileInEditor (cognitive 48): editorUtils.openFileInEditor has cognitive complexity 48 (threshold 15). Drivers by points: if/else 17 (31 pts), ternaries 4 (11 pts), boolean chains 6 (nesting depth added 21). Of this number, 43 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":"packages/cli/src/ui/utils/editorUtils.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e375a0a7958ec7c9bcabd86065168dd6f2b90f43e4416748610d0636ba0afe7"}},{"ruleId":"D2","level":"warning","message":{"text":"sessionCleanup.cleanupToolOutputFiles (cognitive 48): sessionCleanup.cleanupToolOutputFiles has cognitive complexity 48 (threshold 15). Drivers by points: if/else 12 (20 pts), ternaries 4 (10 pts), error handling 6 (9 pts), loops 4 (7 pts), boolean chains 2 (nesting depth added 20). 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":"packages/cli/src/utils/sessionCleanup.ts"},"region":{"startLine":479}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7c0fb1462c35e25454b86597e28f6409f37839dfecc6d2233c52982bdb6aee7"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentSession.stream (cognitive 48): AgentSession.stream has cognitive complexity 48 (threshold 15). Drivers by points: if/else 22 (33 pts), loops 5 (9 pts), boolean chains 6 (nesting depth added 15). Of this number, 36 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":"packages/core/src/agent/agent-session.ts"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"10a252e7b1a88ed4a4a0f67f702e18276c33865155831c6d72d6be4c6e92bdab"}},{"ruleId":"D2","level":"warning","message":{"text":"GeminiChat.makeApiCallAndProcessStream (cognitive 48): GeminiChat.makeApiCallAndProcessStream has cognitive complexity 48 (threshold 15). Drivers by points: if/else 19 (34 pts), boolean chains 7, ternaries 4, loops 1 (3 pts) (nesting depth added 17). Most of this is not in the body itself: 2 of the 48 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 917, 1098, 1122). 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":"packages/core/src/core/geminiChat.ts"},"region":{"startLine":870}}}],"partialFingerprints":{"codehealthFindingId/v1":"e801c1918608a28f62efbc5c68f10ddc6c7d8acaf8ef1c5534b4abae1df1dce4"}},{"ruleId":"D2","level":"warning","message":{"text":"mcp-client.createTransport (cognitive 48): mcp-client.createTransport has cognitive complexity 48 (threshold 15). Drivers by points: if/else 15 (35 pts), boolean chains 5, loops 2 (5 pts), ternaries 1 (3 pts) (nesting depth added 25). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/mcp-client.ts"},"region":{"startLine":2265}}}],"partialFingerprints":{"codehealthFindingId/v1":"393877ec394147e2444182652d60f8dcd2a1b1f3006a00c849bce778298f720f"}},{"ruleId":"D2","level":"warning","message":{"text":"googleErrors.parseGoogleApiError (cognitive 48): googleErrors.parseGoogleApiError has cognitive complexity 48 (threshold 15). Drivers by points: if/else 14 (33 pts), boolean chains 7, error handling 2 (4 pts), loops 2 (4 pts) (nesting depth added 23). 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":"packages/core/src/utils/googleErrors.ts"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"96411c403e8461de5b7df3f1c3c119db9db92d805f708d76066365ee9b5a4310"}},{"ruleId":"D2","level":"warning","message":{"text":"App.App (cognitive 48): App.App has cognitive complexity 48 (threshold 15). Drivers by points: ternaries 22 (25 pts), if/else 12, boolean chains 11 (nesting depth added 3). Most of this is not in the body itself: 13 of the 48 points are its own statements and the rest belongs to 15 function literals inside it that branch (lines 78, 103, 223, \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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0f1bc06b2b5c5152386ae2fd48618ea116191ae961da0032bc46204ab21d470"}},{"ruleId":"D2","level":"warning","message":{"text":"GeminiSandbox.Main (cognitive 47): GeminiSandbox.Main has cognitive complexity 47 (threshold 15). Of this number, 45 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, 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":"packages/core/src/sandbox/windows/GeminiSandbox.cs"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c4471e33c0653f5bf887509b22abd0a4ec42a28fc3eec9fd9ee2e7aad456c4e"}},{"ruleId":"D2","level":"warning","message":{"text":"Session.streamHistory (cognitive 47): Session.streamHistory has cognitive complexity 47 (threshold 15). Drivers by points: if/else 9 (27 pts), ternaries 2 (10 pts), loops 3 (9 pts), boolean chains 1 (nesting depth added 32). 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":"packages/cli/src/acp/acpSession.ts"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8999657bd38fca1c28c064ee8725e6b10a5376463836cc6c820dc3e9f57de98"}},{"ruleId":"D2","level":"warning","message":{"text":"process-utils.killProcessGroup (cognitive 47): process-utils.killProcessGroup has cognitive complexity 47 (threshold 15). Drivers by points: error handling 11 (26 pts), if/else 7 (12 pts), loops 3 (5 pts), boolean chains 2, ternaries 1 (2 pts) (nesting depth added 23). Of this number, 45 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":"packages/core/src/utils/process-utils.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"c20e4c3d9a4eed4b31136b10c21430d3406a7a5d46ffcd600b891b74355ca7a4"}},{"ruleId":"D2","level":"warning","message":{"text":"ToolResultDisplay.ToolResultDisplay (cognitive 46): ToolResultDisplay.ToolResultDisplay has cognitive complexity 46 (threshold 15). Drivers by points: if/else 21 (28 pts), ternaries 5 (10 pts), boolean chains 8 (nesting depth added 12). Of this number, 25 points are the body\u0027s own statements and 21 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":"packages/cli/src/ui/components/messages/ToolResultDisplay.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"00c1b2e5e8c8e1c6b0601b8cdcf6cca70e373f41edae9634f290e48bf27b37c0"}},{"ruleId":"D2","level":"warning","message":{"text":"text-buffer.calculateLayout (cognitive 46): text-buffer.calculateLayout has cognitive complexity 46 (threshold 15). Drivers by points: if/else 13 (35 pts), boolean chains 6, loops 2 (5 pts) (nesting depth added 25). Most of this is not in the body itself: 8 of the 46 points are its own statements and the rest belongs to one function literal inside it that branches (line 1299). 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":"packages/cli/src/ui/components/shared/text-buffer.ts"},"region":{"startLine":1288}}}],"partialFingerprints":{"codehealthFindingId/v1":"fef862ee54baf219f0408eb812b653b95abf1d5acb4617c1638b27157788bc1d"}},{"ruleId":"D2","level":"warning","message":{"text":"ContextManager.evaluateTriggers (cognitive 45): ContextManager.evaluateTriggers has cognitive complexity 45 (threshold 15). Drivers by points: if/else 14 (37 pts), boolean chains 4, loops 2 (4 pts) (nesting depth added 25). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/context/contextManager.ts"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c6f8c98bfba782379629f545a94b9fbfbdcbc50d37448037947b69e8231db83"}},{"ruleId":"D2","level":"warning","message":{"text":"telemetry_utils.ensureBinary (cognitive 45): telemetry_utils.ensureBinary has cognitive complexity 45 (threshold 15). Drivers by points: if/else 16 (24 pts), ternaries 6 (9 pts), boolean chains 8, loops 2 (4 pts) (nesting depth added 13). Of this number, 30 points are the body\u0027s own statements and 15 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":"scripts/telemetry_utils.js"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea3cc9ea8e23e44f411463863a1e3bd24901da885d0178bed3dae0c0681bccbd"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelDialog.ModelDialog (cognitive 44): ModelDialog.ModelDialog has cognitive complexity 44 (threshold 15). Drivers by points: if/else 19 (21 pts), ternaries 10 (16 pts), boolean chains 7 (nesting depth added 8). Most of this is not in the body itself: 3 of the 44 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 192, 75, 106, \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":"packages/cli/src/ui/components/ModelDialog.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b4b4d8d026d3d457542017b404629ba33b993ab11e878acb011e072ab2fb040"}},{"ruleId":"D2","level":"warning","message":{"text":"SessionBrowser.useSessionBrowserInput (cognitive 44): SessionBrowser.useSessionBrowserInput has cognitive complexity 44 (threshold 15). Drivers by points: if/else 24 (34 pts), boolean chains 6, ternaries 1 (4 pts) (nesting depth added 13). Most of this is not in the body itself: 0 of the 44 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 551, 624, 640). 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":"packages/cli/src/ui/components/SessionBrowser.tsx"},"region":{"startLine":542}}}],"partialFingerprints":{"codehealthFindingId/v1":"af92bd1e24ad140c8f409fe95f79ec8f9645cce7b637f483614f4ce7f01e4133"}},{"ruleId":"D2","level":"warning","message":{"text":"StatusRow.StatusRow (cognitive 44): StatusRow.StatusRow has cognitive complexity 44 (threshold 15). Drivers by points: boolean chains 28, if/else 9 (12 pts), ternaries 3 (4 pts) (nesting depth added 4). Of this number, 23 points are the body\u0027s own statements and 21 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":"packages/cli/src/ui/components/StatusRow.tsx"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"7094ca5702cfe61fc6a36998030a79065ed8248cc1da0af888bf8b9d6bcbf52c"}},{"ruleId":"D2","level":"warning","message":{"text":"render.render (cognitive 44): render.render has cognitive complexity 44 (threshold 15). Drivers by points: if/else 11 (20 pts), ternaries 6 (10 pts), boolean chains 7, loops 4 (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":"packages/core/src/context/graph/render.ts"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc211276591b217e433323b8dcb5c134110aee2b5f426e5229233d80e68a5c4e"}},{"ruleId":"D2","level":"warning","message":{"text":"trace.runInDevTraceSpan (cognitive 44): trace.runInDevTraceSpan has cognitive complexity 44 (threshold 15). Drivers by points: if/else 16 (35 pts), error handling 3 (4 pts), loops 2 (4 pts), boolean chains 1 (nesting depth added 22). Most of this is not in the body itself: 0 of the 44 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 152, 141, 224). 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":"packages/core/src/telemetry/trace.ts"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9805e3d4291c5e36ec0537b2716ffdcde115afdf192a465f45885a524289935"}},{"ruleId":"D2","level":"warning","message":{"text":"text-buffer.findWordEndInLine (cognitive 43): text-buffer.findWordEndInLine has cognitive complexity 43 (threshold 15). Drivers by points: boolean chains 17, if/else 8 (15 pts), loops 6 (11 pts) (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/shared/text-buffer.ts"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"e102c8dcdfea3aad59d63561e75a88f4622bd7b89786c6f24c281b3a6f8b9ce8"}},{"ruleId":"D2","level":"warning","message":{"text":"admin_controls.sanitizeAdminSettings (cognitive 43): admin_controls.sanitizeAdminSettings has cognitive complexity 43 (threshold 15). Drivers by points: if/else 11 (32 pts), loops 2 (8 pts), error handling 1 (2 pts), boolean chains 1 (nesting depth added 28). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/code_assist/admin/admin_controls.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c4f11696dc7dadd43632a77e66211f98c1f176ab6630c06dff7b28e7e5d2795"}},{"ruleId":"D2","level":"warning","message":{"text":"ContextWorkingBufferImpl.applyProcessorResult (cognitive 43): ContextWorkingBufferImpl.applyProcessorResult has cognitive complexity 43 (threshold 15). Drivers by points: if/else 11 (24 pts), loops 8 (19 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":"packages/core/src/context/pipeline/contextWorkingBuffer.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"e96925fb0887c828e4b84ebece0cfe8039c87127aed829fc624a0f84004e760f"}},{"ruleId":"D2","level":"warning","message":{"text":"ToolOutputMaskingService.mask (cognitive 43): ToolOutputMaskingService.mask has cognitive complexity 43 (threshold 15). Drivers by points: if/else 16 (32 pts), boolean chains 6, loops 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":"packages/core/src/context/toolOutputMaskingService.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec76390362841f2767aedfab8fb072ba03a10d9a6dd724b6ec544b4d9741808f"}},{"ruleId":"D2","level":"warning","message":{"text":"coreToolHookTriggers.executeToolWithHooks (cognitive 42): coreToolHookTriggers.executeToolWithHooks has cognitive complexity 42 (threshold 15). Drivers by points: if/else 18 (30 pts), ternaries 2 (6 pts), error handling 1 (4 pts), boolean chains 2 (nesting depth added 19). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/core/coreToolHookTriggers.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"732c4722ba45a388adc395ee3b0bb4017d7afbe34c90010c93d75b0092fca9fd"}},{"ruleId":"D2","level":"warning","message":{"text":"loggingContentGenerator.estimateContextBreakdown (cognitive 42): loggingContentGenerator.estimateContextBreakdown has cognitive complexity 42 (threshold 15). Drivers by points: if/else 12 (26 pts), loops 4 (9 pts), boolean chains 7 (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":"packages/core/src/core/loggingContentGenerator.ts"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"31ab01709e82af1505b5a4beb4360797d1e5909ffdcf29e7a872d687750f8170"}},{"ruleId":"D2","level":"warning","message":{"text":"HookTranslatorGenAIv1.fromHookLLMRequest (cognitive 42): HookTranslatorGenAIv1.fromHookLLMRequest has cognitive complexity 42 (threshold 15). Drivers by points: if/else 11 (22 pts), ternaries 6 (16 pts), loops 2 (4 pts) (nesting depth added 23). Of this number, 38 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":"packages/core/src/hooks/hookTranslator.ts"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"c403aa4b3abedea1e3e59bb70b33faf032f3a8bde0814d7e664abe2ae9eb41d6"}},{"ruleId":"D2","level":"warning","message":{"text":"summary._write_markdown (cognitive 42): summary._write_markdown has cognitive complexity 42 (threshold 15). Drivers by points: if/else 12 (18 pts), ternaries 5 (15 pts), loops 2 (6 pts), boolean chains 3 (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":"tools/caretaker-agent/evals/triage/helpers/summary.py"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b755db595502af0bf3e7f2369b4caa7faf9033bf074df5e7f74de6f98dc11a1"}},{"ruleId":"D2","level":"warning","message":{"text":"McpStatus.McpStatus (cognitive 41): McpStatus.McpStatus has cognitive complexity 41 (threshold 15). Drivers by points: boolean chains 21, if/else 10, ternaries 5 (8 pts), match/switch 1 (2 pts) (nesting depth added 4). Most of this is not in the body itself: 3 of the 41 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 89, 322, 220, \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":"packages/cli/src/ui/components/views/McpStatus.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d0fd7969354b61d984280365e5041a01b8f1bd1092ec085800114c264e5292e"}},{"ruleId":"D2","level":"warning","message":{"text":"LocalAgentExecutor.processFunctionCalls (cognitive 41): LocalAgentExecutor.processFunctionCalls has cognitive complexity 41 (threshold 15). Drivers by points: if/else 13 (30 pts), boolean chains 5, loops 3 (4 pts), error handling 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":"packages/core/src/agents/local-executor.ts"},"region":{"startLine":1105}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c8ff050ef038dfe5bfa69003c1b2a89241783f2158c4311b9d9bb20f589368b"}},{"ruleId":"D2","level":"warning","message":{"text":"policyHelpers.resolvePolicyChain (cognitive 41): policyHelpers.resolvePolicyChain has cognitive complexity 41 (threshold 15). Drivers by points: if/else 13 (22 pts), ternaries 4 (10 pts), boolean chains 9 (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":"packages/core/src/availability/policyHelpers.ts"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b9b20b510e342b51403e5ea848a53a81706658f4552508d84fb823465135968"}},{"ruleId":"D2","level":"warning","message":{"text":"chatCompressionService.truncateHistoryToBudget (cognitive 41): chatCompressionService.truncateHistoryToBudget has cognitive complexity 41 (threshold 15). Drivers by points: if/else 11 (28 pts), error handling 1 (6 pts), loops 2 (4 pts), boolean chains 3 (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":"packages/core/src/context/chatCompressionService.ts"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"f10888ae719e984627c143d25aa891e67cb21960c9212099f7c35e9dd2f76023"}},{"ruleId":"D2","level":"warning","message":{"text":"mcp-client.discoverTools (cognitive 41): mcp-client.discoverTools has cognitive complexity 41 (threshold 15). Drivers by points: if/else 9 (24 pts), error handling 3 (6 pts), loops 2 (4 pts), ternaries 1 (4 pts), boolean chains 3 (nesting depth added 23). Of this number, 18 points are the body\u0027s own statements and 23 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":"packages/core/src/tools/mcp-client.ts"},"region":{"startLine":1295}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea6c4ba0efa2b163512576b07e1bf04e411e6d0ac8b7b62d6ca29c4b933aaca8"}},{"ruleId":"D2","level":"warning","message":{"text":"terminalSerializer.serializeTerminalToObject (cognitive 41): terminalSerializer.serializeTerminalToObject has cognitive complexity 41 (threshold 15). Drivers by points: ternaries 4 (16 pts), if/else 6 (14 pts), boolean chains 7, loops 3 (4 pts) (nesting depth added 21). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/terminalSerializer.ts"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a2cdde46c66e23569b845a9617d6a9a26134582a9f1c06546e83cdf3cd07d4e"}},{"ruleId":"D2","level":"warning","message":{"text":"ThemeDialog.ThemeDialog (cognitive 40): ThemeDialog.ThemeDialog has cognitive complexity 40 (threshold 15). Drivers by points: ternaries 14 (22 pts), if/else 8 (11 pts), boolean chains 7 (nesting depth added 11). Of this number, 20 points are the body\u0027s own statements and 20 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":"packages/cli/src/ui/components/ThemeDialog.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7c31607d9a55cd5b66994a1ed6ed632e8b45436e9174437f36be6a538e0aabc"}},{"ruleId":"D2","level":"warning","message":{"text":"DenseToolMessage.DenseToolMessage (cognitive 40): DenseToolMessage.DenseToolMessage has cognitive complexity 40 (threshold 15). Drivers by points: if/else 17 (18 pts), boolean chains 16, ternaries 4 (6 pts) (nesting depth added 3). Most of this is not in the body itself: 10 of the 40 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 324, 422, 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":"packages/cli/src/ui/components/messages/DenseToolMessage.tsx"},"region":{"startLine":261}}}],"partialFingerprints":{"codehealthFindingId/v1":"266c673819649bb45616f26d1018dcdaed771ec2dcfbecfa041b03fcb93608f2"}},{"ruleId":"D2","level":"warning","message":{"text":"useShellCompletion.useShellCompletion (cognitive 40): useShellCompletion.useShellCompletion has cognitive complexity 40 (threshold 15). Drivers by points: if/else 22 (30 pts), boolean chains 5, ternaries 2 (4 pts), error handling 1 (nesting depth added 10). Most of this is not in the body itself: 3 of the 40 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 489, 616, 458, \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":"packages/cli/src/ui/hooks/useShellCompletion.ts"},"region":{"startLine":443}}}],"partialFingerprints":{"codehealthFindingId/v1":"8acec3eddafe885720fc03e260cf8f2274a79652371f42c1ff8791e921a30f69"}},{"ruleId":"D2","level":"warning","message":{"text":"SnapshotGenerator.synthesizeSnapshot (cognitive 40): SnapshotGenerator.synthesizeSnapshot has cognitive complexity 40 (threshold 15). Drivers by points: if/else 21 (31 pts), boolean chains 3, error handling 2 (3 pts), 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":"packages/core/src/context/utils/snapshotGenerator.ts"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebbed660eae47cf4d2abb2215f2d966ea1787c4ba6e3345013c3b973b59fed7f"}},{"ruleId":"D2","level":"warning","message":{"text":"sessionUtils.ensureStableToolIds (cognitive 40): sessionUtils.ensureStableToolIds has cognitive complexity 40 (threshold 15). Drivers by points: if/else 8 (32 pts), boolean chains 5, loops 2 (3 pts) (nesting depth added 25). Of this number, 38 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":"packages/core/src/utils/sessionUtils.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"705b33ebedb89f913c023142ef54a5d6a930548d966bc21d13098fef352d155a"}},{"ruleId":"D2","level":"warning","message":{"text":"install.handleInstall (cognitive 39): install.handleInstall has cognitive complexity 39 (threshold 15). Drivers by points: if/else 8 (17 pts), loops 4 (17 pts), boolean chains 2, ternaries 2, error handling 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":"packages/cli/src/commands/extensions/install.ts"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ccb848b4b0083a8cb4f7b388d0b9b0fd9190977bfa2f13ea83d88d7bdad58ae"}},{"ruleId":"D2","level":"warning","message":{"text":"useAtCompletion.useAtCompletion (cognitive 39): useAtCompletion.useAtCompletion has cognitive complexity 39 (threshold 15). Drivers by points: if/else 23 (29 pts), boolean chains 5, error handling 3, loops 2 (nesting depth added 6). Most of this is not in the body itself: 0 of the 39 points are its own statements and the rest belongs to 11 function literals inside it that branch (lines 357, 274, 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":"packages/cli/src/ui/hooks/useAtCompletion.ts"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"35506cb90fadb82d7e6997abb63cb24b1f7b5f7040f6d84e814a3289790a8141"}},{"ruleId":"D2","level":"warning","message":{"text":"ActivityLogger.patchNodeHttp (cognitive 39): ActivityLogger.patchNodeHttp has cognitive complexity 39 (threshold 15). Drivers by points: ternaries 9 (14 pts), if/else 13, boolean chains 12 (nesting depth added 5). Most of this is not in the body itself: 0 of the 39 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 447, 586, 636, \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":"packages/cli/src/utils/activityLogger.ts"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"bee77445ac67c04933b8d30d3db458fd20b9874d72a612d8da49cee3439c3fcc"}},{"ruleId":"D2","level":"warning","message":{"text":"LocalAgentExecutor.create (cognitive 39): LocalAgentExecutor.create has cognitive complexity 39 (threshold 15). Drivers by points: if/else 14 (22 pts), loops 6 (15 pts), boolean chains 2 (nesting depth added 17). Of this number, 17 points are the body\u0027s own statements and 22 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":"packages/core/src/agents/local-executor.ts"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc6939b1dec8967010fea3161594dd7f464176207f017f39a58611e181b12769"}},{"ruleId":"D2","level":"warning","message":{"text":"security.isFileAndDirectorySecureSync (cognitive 39): security.isFileAndDirectorySecureSync has cognitive complexity 39 (threshold 15). Drivers by points: if/else 14 (25 pts), loops 4 (5 pts), error handling 3 (4 pts), boolean chains 3, ternaries 2 (nesting depth added 13). Of this number, 32 points are the body\u0027s own statements and 7 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":"packages/core/src/utils/security.ts"},"region":{"startLine":591}}}],"partialFingerprints":{"codehealthFindingId/v1":"60b93495660495eddea18bd7ac2364e99efbe569a9aa22db6f9bcd4716c82818"}},{"ruleId":"D2","level":"warning","message":{"text":"sync_project_dry_run.run (cognitive 39): sync_project_dry_run.run has cognitive complexity 39 (threshold 15). Drivers by points: if/else 10 (20 pts), loops 6 (9 pts), ternaries 2 (6 pts), boolean chains 4 (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":"scripts/sync_project_dry_run.js"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"78b4254bbdc201132e0c2c25c8cfd79afef5ef64be3859ce0bab2904b7afa67c"}},{"ruleId":"D2","level":"warning","message":{"text":"gemini.setupUnhandledRejectionHandler (cognitive 38): gemini.setupUnhandledRejectionHandler has cognitive complexity 38 (threshold 15). Drivers by points: if/else 10 (19 pts), boolean chains 10, error handling 2 (5 pts), ternaries 2 (4 pts) (nesting depth added 14). Most of this is not in the body itself: 2 of the 38 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 225, 185, 300). 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":"packages/cli/src/gemini.tsx"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba2835ba65ee1431e0c921f75fec72c9a3f84ddf95df593bd339ee4cffe4b701"}},{"ruleId":"D2","level":"warning","message":{"text":"atCommandProcessor.readLocalFiles (cognitive 38): atCommandProcessor.readLocalFiles has cognitive complexity 38 (threshold 15). Drivers by points: if/else 9 (24 pts), loops 2 (8 pts), boolean chains 3, ternaries 1 (2 pts), error handling 1 (nesting depth added 22). 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, 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":"packages/cli/src/ui/hooks/atCommandProcessor.ts"},"region":{"startLine":505}}}],"partialFingerprints":{"codehealthFindingId/v1":"8876254dbf364e6d401718eeb1d385af27bb81414226b688c6597b410a58e73b"}},{"ruleId":"D2","level":"warning","message":{"text":"shellReducer.shellReducer (cognitive 38): shellReducer.shellReducer has cognitive complexity 38 (threshold 15). Drivers by points: if/else 13 (31 pts), ternaries 2 (5 pts), boolean chains 1, match/switch 1 (nesting depth added 21). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/hooks/shellReducer.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"a15f42d3a01d6ac57bbdc269d2cc993643ccb9e915c783baa88095ede8987f48"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentRegistry.loadAgents (cognitive 38): AgentRegistry.loadAgents has cognitive complexity 38 (threshold 15). Drivers by points: if/else 9 (15 pts), ternaries 3 (9 pts), error handling 3 (6 pts), loops 4 (6 pts), boolean chains 2 (nesting depth added 17). Of this number, 23 points are the body\u0027s own statements and 15 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":"packages/core/src/agents/registry.ts"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"21af1d6044103938c43ad8a68cf70674c98d4046acb43f958162d4abcd41533a"}},{"ruleId":"D2","level":"warning","message":{"text":"ChatRecordingService.updateMessagesFromHistory (cognitive 38): ChatRecordingService.updateMessagesFromHistory has cognitive complexity 38 (threshold 15). Drivers by points: if/else 9 (25 pts), boolean chains 8, loops 2 (3 pts), error handling 1, ternaries 1 (nesting depth added 17). Of this number, 31 points are the body\u0027s own statements and 7 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":"packages/core/src/services/chatRecordingService.ts"},"region":{"startLine":953}}}],"partialFingerprints":{"codehealthFindingId/v1":"81d70f30ed835b1844ea6f9b0865ed8557f8be67b83fccf8cbe4b71cdb45d495"}},{"ruleId":"D2","level":"warning","message":{"text":"github.checkForExtensionUpdate (cognitive 37): github.checkForExtensionUpdate has cognitive complexity 37 (threshold 15). Drivers by points: if/else 17 (29 pts), boolean chains 5, error handling 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":"packages/cli/src/config/extensions/github.ts"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"27d7468586bce59b8ca4af36f8cad2be548ff214f2f51b5c507235cf044e9f29"}},{"ruleId":"D2","level":"warning","message":{"text":"usePromptCompletion.usePromptCompletion (cognitive 37): usePromptCompletion.usePromptCompletion has cognitive complexity 37 (threshold 15). Drivers by points: if/else 19 (23 pts), boolean chains 10, ternaries 1 (3 pts), error handling 1 (nesting depth added 6). Most of this is not in the body itself: 0 of the 37 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 68, 167, 204, \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":"packages/cli/src/ui/hooks/usePromptCompletion.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"e054d15b44ea536b02f9510a69fea64be9b45e43243a82a64bb1ab093f9c4b5b"}},{"ruleId":"D2","level":"warning","message":{"text":"ContextGraphBuilder.processHistory (cognitive 37): ContextGraphBuilder.processHistory has cognitive complexity 37 (threshold 15). Drivers by points: ternaries 5 (17 pts), if/else 4 (9 pts), loops 3 (7 pts), boolean chains 4 (nesting depth added 21). 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":"packages/core/src/context/graph/toGraph.ts"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf4f83ff43a887e3b4c19b22cd6d3885ccb58e970710dbecd510d6a599f0826c"}},{"ruleId":"D2","level":"warning","message":{"text":"EditTool.validateToolParamValues (cognitive 37): EditTool.validateToolParamValues has cognitive complexity 37 (threshold 15). Drivers by points: ternaries 4 (14 pts), if/else 8 (11 pts), error handling 4 (10 pts), loops 1 (2 pts) (nesting depth added 20). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/edit.ts"},"region":{"startLine":1138}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d4007cba688cd53a38c9d75ae85e8374ae5b4ee430e5fa369f825da27a8c45e"}},{"ruleId":"D2","level":"warning","message":{"text":"McpClientManager.maybeDiscoverMcpServer (cognitive 37): McpClientManager.maybeDiscoverMcpServer has cognitive complexity 37 (threshold 15). Drivers by points: if/else 21 (28 pts), boolean chains 5, error handling 2, ternaries 1 (2 pts) (nesting depth added 8). 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":"packages/core/src/tools/mcp-client-manager.ts"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0612a20dd56ec23dabe0e51a64c3c1f65d4dc98c5a39d75f57f72d652fb0167"}},{"ruleId":"D2","level":"warning","message":{"text":"index.run (cognitive 36): index.run has cognitive complexity 36 (threshold 15). Drivers by points: if/else 9 (17 pts), ternaries 2 (7 pts), error handling 2 (5 pts), loops 2 (4 pts), boolean chains 3 (nesting depth added 18). Of this number, 18 points are the body\u0027s own statements and 18 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":"packages/cli/index.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"dafefc9fc6de4d1a8e55fbd49f23c429f27f97a8601c1099d51adc7742d8a282"}},{"ruleId":"D2","level":"warning","message":{"text":"ConfigExtensionDialog.ConfigExtensionDialog (cognitive 36): ConfigExtensionDialog.ConfigExtensionDialog has cognitive complexity 36 (threshold 15). Drivers by points: if/else 18 (22 pts), boolean chains 8, ternaries 2 (5 pts), error handling 1 (nesting depth added 7). Most of this is not in the body itself: 9 of the 36 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 126, 211, 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":"packages/cli/src/ui/components/ConfigExtensionDialog.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f6d43ce0bd975ae93957883162cfe621f4b28143bd00a3b8850fad08e4f7d12"}},{"ruleId":"D2","level":"warning","message":{"text":"DialogManager.DialogManager (cognitive 36): DialogManager.DialogManager has cognitive complexity 36 (threshold 15). Drivers by points: if/else 30 (31 pts), boolean chains 3, ternaries 1 (2 pts) (nesting depth added 2). Of this number, 34 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":"packages/cli/src/ui/components/DialogManager.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c6fd0f3498219ed3dc28c0419e53398922884814a739e53e4190c8e016012bf"}},{"ruleId":"D2","level":"warning","message":{"text":"useShellCompletion.resolvePathCompletions (cognitive 36): useShellCompletion.resolvePathCompletions has cognitive complexity 36 (threshold 15). Drivers by points: if/else 14 (22 pts), ternaries 5 (8 pts), boolean chains 4, error handling 1, loops 1 (nesting depth added 11). Of this number, 33 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":"packages/cli/src/ui/hooks/useShellCompletion.ts"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ff49adc4342c6ffbd2556bbccb553f31432c468e7e5217ea3426554c6d13723"}},{"ruleId":"D2","level":"warning","message":{"text":"installationInfo.getInstallationInfo (cognitive 36): installationInfo.getInstallationInfo has cognitive complexity 36 (threshold 15). Drivers by points: if/else 16 (18 pts), ternaries 5 (9 pts), boolean chains 6, error handling 2 (3 pts) (nesting depth added 7). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/utils/installationInfo.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea3d0cc588ee8e59a1ded488a1efdb3e2759f957a07ee1064afbd8673774ff1f"}},{"ruleId":"D2","level":"warning","message":{"text":"nodeDistillationProcessor.createNodeDistillationProcessor (cognitive 36): nodeDistillationProcessor.createNodeDistillationProcessor has cognitive complexity 36 (threshold 15). Drivers by points: if/else 7 (24 pts), error handling 2 (6 pts), boolean chains 3, match/switch 1 (2 pts), loops 1 (nesting depth added 22). Most of this is not in the body itself: 0 of the 36 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 75, 37). 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":"packages/core/src/context/processors/nodeDistillationProcessor.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad429c33246d2227159fcb6be2df9734a5c2e9bb7af6a65b33beda9b4b061750"}},{"ruleId":"D2","level":"warning","message":{"text":"HookRunner.executeCommandHook (cognitive 36): HookRunner.executeCommandHook has cognitive complexity 36 (threshold 15). Drivers by points: if/else 14 (20 pts), error handling 4 (9 pts), boolean chains 7 (nesting depth added 11). Most of this is not in the body itself: 0 of the 36 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 434, 315, 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":"packages/core/src/hooks/hookRunner.ts"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6a7f6b44b945c49da9462e51ff2e693fa3037f2b5a0ee2fb6dc7883fafe8ee1"}},{"ruleId":"D2","level":"warning","message":{"text":"paths.shortenPath (cognitive 36): paths.shortenPath has cognitive complexity 36 (threshold 15). Drivers by points: if/else 26 (32 pts), loops 3, boolean chains 1 (nesting depth added 6). Most of this is not in the body itself: 12 of the 36 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 71, 162, 209, \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":"packages/core/src/utils/paths.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"67f923fc76fb852909679f2d4c2551729a21870d559ce67ddbc927f912dc5232"}},{"ruleId":"D2","level":"warning","message":{"text":"App.NetworkView (cognitive 36): App.NetworkView has cognitive complexity 36 (threshold 15). Drivers by points: ternaries 15 (18 pts), if/else 8 (9 pts), boolean chains 6, error handling 2 (3 pts) (nesting depth added 5). Most of this is not in the body itself: 6 of the 36 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 931, 889, 1081, \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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":831}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb8ccb9e0f468bba251641e951752e274e39f282c3dd239cff4140ffb906168c"}},{"ruleId":"D2","level":"warning","message":{"text":"cleanup-branches.main (cognitive 36): cleanup-branches.main has cognitive complexity 36 (threshold 15). Drivers by points: error handling 7 (14 pts), if/else 8 (13 pts), loops 2 (6 pts), boolean chains 3 (nesting depth added 16). 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":"scripts/cleanup-branches.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab3340502af9ff9d2a6b3a1aa14caaa6ab25d47c7d46a8affa72bb18912cf5be"}},{"ruleId":"D2","level":"warning","message":{"text":"summary.calc_summary (cognitive 36): summary.calc_summary has cognitive complexity 36 (threshold 15). Drivers by points: if/else 14 (22 pts), ternaries 7, boolean chains 3, error handling 1 (2 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":"tools/caretaker-agent/evals/triage/helpers/summary.py"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"db283a06117c6575c9689744a35fd500754574a4ec4987f3a12e2ae16921dd6b"}},{"ruleId":"D2","level":"warning","message":{"text":"AskUserDialog.AskUserDialog (cognitive 35): AskUserDialog.AskUserDialog has cognitive complexity 35 (threshold 15). Drivers by points: if/else 17 (18 pts), ternaries 7 (9 pts), boolean chains 8 (nesting depth added 3). Of this number, 16 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, 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":"packages/cli/src/ui/components/AskUserDialog.tsx"},"region":{"startLine":1026}}}],"partialFingerprints":{"codehealthFindingId/v1":"0367f335dd3332ea9825ab5fdf5cdbe0034e7d18377c38535ba1e2807cb2dfd2"}},{"ruleId":"D2","level":"warning","message":{"text":"useSelectionList.useSelectionList (cognitive 35): useSelectionList.useSelectionList has cognitive complexity 35 (threshold 15). Drivers by points: if/else 20 (26 pts), boolean chains 9 (nesting depth added 6). Most of this is not in the body itself: 1 of the 35 points is its own statement and the rest belongs to 6 function literals inside it that branch (lines 391, 352, 314, \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":"packages/cli/src/ui/hooks/useSelectionList.ts"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0379dc64f944f7c0a8bd76aeeb0794c135ae7778e70b76df771f4316c7b41fc"}},{"ruleId":"D2","level":"warning","message":{"text":"models.resolveModel (cognitive 35): models.resolveModel has cognitive complexity 35 (threshold 15). Drivers by points: if/else 12 (23 pts), boolean chains 6, match/switch 2 (3 pts), ternaries 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":"packages/core/src/config/models.ts"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd9bba71527ae4febbdeb71d890482949702d1d0843856a0354949e1eee81f62"}},{"ruleId":"D2","level":"warning","message":{"text":"Scheduler._processNextItem (cognitive 35): Scheduler._processNextItem has cognitive complexity 35 (threshold 15). Drivers by points: if/else 13 (22 pts), boolean chains 7, loops 3 (6 pts) (nesting depth added 12). Of this number, 33 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":"packages/core/src/scheduler/scheduler.ts"},"region":{"startLine":440}}}],"partialFingerprints":{"codehealthFindingId/v1":"336d205bc94857c8215b1bc742bd38d160582a12d6e2c5bc9c30304a449bfd24"}},{"ruleId":"D2","level":"warning","message":{"text":"sdk.initializeTelemetry (cognitive 35): sdk.initializeTelemetry has cognitive complexity 35 (threshold 15). Drivers by points: if/else 18 (24 pts), boolean chains 8, 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":"packages/core/src/telemetry/sdk.ts"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ee199d2c19946d79a3f44b25846eb4168d01052802a7c4b219aa1e4aea7f612"}},{"ruleId":"D2","level":"warning","message":{"text":"grep-utils.enrichWithAutoContext (cognitive 35): grep-utils.enrichWithAutoContext has cognitive complexity 35 (threshold 15). Drivers by points: if/else 6 (21 pts), loops 3 (11 pts), ternaries 1 (2 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":"packages/core/src/tools/grep-utils.ts"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"af69d6ab51646510d33d792901db1c4a5e58f42adc9670b2d96dc8ed2616acd3"}},{"ruleId":"D2","level":"warning","message":{"text":"generateContentResponseUtilities.convertToFunctionResponse (cognitive 35): generateContentResponseUtilities.convertToFunctionResponse has cognitive complexity 35 (threshold 15). Drivers by points: if/else 18 (25 pts), boolean chains 7, loops 2, ternaries 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":"packages/core/src/utils/generateContentResponseUtilities.ts"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfcfc0c8b87bb6215974713edc8128eaef23e4fe504af273bb5d858be032fa18"}},{"ruleId":"D2","level":"warning","message":{"text":"googleErrors.fromApiError (cognitive 35): googleErrors.fromApiError has cognitive complexity 35 (threshold 15). Drivers by points: if/else 8 (23 pts), error handling 2 (9 pts), boolean chains 3 (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":"packages/core/src/utils/googleErrors.ts"},"region":{"startLine":333}}}],"partialFingerprints":{"codehealthFindingId/v1":"f105b6aaee7cf37fdf73c6cf9f1871a123a4c1a624e9679a4c8803268aedb7ab"}},{"ruleId":"D2","level":"warning","message":{"text":"googleErrors.fromCauseError (cognitive 35): googleErrors.fromCauseError has cognitive complexity 35 (threshold 15). Drivers by points: if/else 11 (22 pts), boolean chains 7, ternaries 5 (6 pts) (nesting depth added 12). Of this number, 31 points are the body\u0027s own statements and 4 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":"packages/core/src/utils/googleErrors.ts"},"region":{"startLine":389}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab9e5dd5ff1ea40aaf27c008b74a541df911c75e7d959f1b8eece8459a6691b0"}},{"ruleId":"D2","level":"warning","message":{"text":"changed_prompt.main (cognitive 35): changed_prompt.main has cognitive complexity 35 (threshold 15). Drivers by points: if/else 9 (23 pts), boolean chains 5, loops 2 (4 pts), ternaries 2, error handling 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":"scripts/changed_prompt.js"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ffc736b879901831def68155b6ace9e698d9fcb9dd607a62494ecbf821ab096"}},{"ruleId":"D2","level":"warning","message":{"text":"eval-coverage.formatCoverageReport (cognitive 35): eval-coverage.formatCoverageReport has cognitive complexity 35 (threshold 15). Drivers by points: if/else 9 (14 pts), loops 6 (13 pts), ternaries 2 (6 pts), boolean chains 2 (nesting depth added 16). Of this number, 32 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":"scripts/utils/eval-coverage.ts"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1d39c352923323d7cf59fcdc158a8ed392483230fcbb19e004dd91ddc85b2ee"}},{"ruleId":"D2","level":"warning","message":{"text":"markdownParsingUtils.parseMarkdownToANSI (cognitive 34): markdownParsingUtils.parseMarkdownToANSI has cognitive complexity 34 (threshold 15). Drivers by points: if/else 13 (19 pts), boolean chains 12, error handling 1 (2 pts), loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/utils/markdownParsingUtils.ts"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"777a607ce2f42f584fe00a0a3703b57b163f42ede13889ee41a7a56d1bc90de9"}},{"ruleId":"D2","level":"warning","message":{"text":"setup._doSetupUser (cognitive 34): setup._doSetupUser has cognitive complexity 34 (threshold 15). Drivers by points: if/else 13 (26 pts), boolean chains 3, loops 2 (3 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":"packages/core/src/code_assist/setup.ts"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd1fdf0b3d9d888832b3c13b17e850c625527979a285d34a3d444b36a4eb4b43"}},{"ruleId":"D2","level":"warning","message":{"text":"rollingSummaryProcessor.createRollingSummaryProcessor (cognitive 34): rollingSummaryProcessor.createRollingSummaryProcessor has cognitive complexity 34 (threshold 15). Drivers by points: if/else 13 (25 pts), loops 2 (5 pts), boolean chains 3, error handling 1 (nesting depth added 15). Most of this is not in the body itself: 0 of the 34 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 74, 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":"packages/core/src/context/processors/rollingSummaryProcessor.ts"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"afacc5991eb088d87db9a427ac618faa574299c7959041b8a42d7169fe42edac"}},{"ruleId":"D2","level":"warning","message":{"text":"GrepToolInvocation.execute (cognitive 34): GrepToolInvocation.execute has cognitive complexity 34 (threshold 15). Drivers by points: if/else 13 (20 pts), error handling 4 (6 pts), ternaries 2 (4 pts), boolean chains 3, 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":"packages/core/src/tools/grep.ts"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"a38dd0c7787bb511ccc45deaa79d630d7e84c6380e2395a60b0a69868e03e296"}},{"ruleId":"D2","level":"warning","message":{"text":"create-patch-pr.main (cognitive 34): create-patch-pr.main has cognitive complexity 34 (threshold 15). Drivers by points: if/else 17 (22 pts), error handling 4 (9 pts), boolean chains 3 (nesting depth added 10). Of this number, 33 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, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/releasing/create-patch-pr.js"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"44c261d6db33cb4cdabcda4dcbf3766b1d23eed2e75c7cfec913647bf7d8cba3"}},{"ruleId":"D2","level":"warning","message":{"text":"eval-coverage.computeCoverage (cognitive 34): eval-coverage.computeCoverage has cognitive complexity 34 (threshold 15). Drivers by points: if/else 10 (21 pts), loops 7 (11 pts), boolean chains 1, ternaries 1 (nesting depth added 15). Of this number, 30 points are the body\u0027s own statements and 4 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/utils/eval-coverage.ts"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb3aab76e766474f6fd0175749aa13ed7c95cb85cc3bd64703d7d7a6f0c931d2"}},{"ruleId":"D2","level":"warning","message":{"text":"Task.scheduleToolCalls (cognitive 33): Task.scheduleToolCalls has cognitive complexity 33 (threshold 15). Drivers by points: if/else 10 (22 pts), loops 3 (8 pts), boolean chains 3 (nesting depth added 17). Of this number, 25 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":"packages/a2a-server/src/agent/task.ts"},"region":{"startLine":711}}}],"partialFingerprints":{"codehealthFindingId/v1":"55b9ee9e41e5c012db5dcf820e58f8cde12e0981d1dabd9fffddeff15e910587"}},{"ruleId":"D2","level":"warning","message":{"text":"MainContent.MainContent (cognitive 33): MainContent.MainContent has cognitive complexity 33 (threshold 15). Drivers by points: boolean chains 15, if/else 10 (11 pts), ternaries 5 (6 pts), loops 1 (nesting depth added 2). Most of this is not in the body itself: 2 of the 33 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 157, 85, 256, \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":"packages/cli/src/ui/components/MainContent.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a1007c1c31060975d88b4369b2440b3f734368c059a830b02470d8890ed0a24"}},{"ruleId":"D2","level":"warning","message":{"text":"DiffRenderer.renderDiffLines (cognitive 33): DiffRenderer.renderDiffLines has cognitive complexity 33 (threshold 15). Drivers by points: ternaries 10 (17 pts), if/else 7 (9 pts), boolean chains 5, loops 1, match/switch 1 (nesting depth added 9). Most of this is not in the body itself: 10 of the 33 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 292, 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":"packages/cli/src/ui/components/messages/DiffRenderer.tsx"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb4158130cbb852125d2a7824a9c4554f10a3585f30b7a1917d0b49f10478f44"}},{"ruleId":"D2","level":"warning","message":{"text":"useToolScheduler.useToolScheduler (cognitive 33): useToolScheduler.useToolScheduler has cognitive complexity 33 (threshold 15). Drivers by points: if/else 10 (16 pts), boolean chains 7, loops 3 (5 pts), error handling 1 (3 pts), ternaries 2 (nesting depth added 10). Most of this is not in the body itself: 0 of the 33 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 256, 290, 130, \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":"packages/cli/src/ui/hooks/useToolScheduler.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"0eac02b1d42a1414d3c76ebcf532eba72ee926021b7f6d17b94837d755a43352"}},{"ruleId":"D2","level":"warning","message":{"text":"deepMerge.mergeRecursively (cognitive 33): deepMerge.mergeRecursively has cognitive complexity 33 (threshold 15). Drivers by points: if/else 9 (18 pts), ternaries 3 (9 pts), boolean chains 5, 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":"packages/cli/src/utils/deepMerge.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"7454cdcb9182215b3155184a427ef15c5ba3e4681d465afe8142aae39231a439"}},{"ruleId":"D2","level":"warning","message":{"text":"ChatRecordingService.initialize (cognitive 33): ChatRecordingService.initialize has cognitive complexity 33 (threshold 15). Drivers by points: if/else 12 (24 pts), loops 1 (4 pts), boolean chains 2, ternaries 1 (2 pts), error handling 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":"packages/core/src/services/chatRecordingService.ts"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"01fff66f3d748543d0d258f2a66bfdc001457ad4424fa71040a56f05691b6e00"}},{"ruleId":"D2","level":"warning","message":{"text":"UiTelemetryService.hydrate (cognitive 33): UiTelemetryService.hydrate has cognitive complexity 33 (threshold 15). Drivers by points: if/else 8 (25 pts), loops 2 (5 pts), boolean chains 3 (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":"packages/core/src/telemetry/uiTelemetry.ts"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"57c8a78ecd3aefc06b4feb147b28c736a172de92ef4f58b583662f683a90f925"}},{"ruleId":"D2","level":"warning","message":{"text":"WriteFileToolInvocation.execute (cognitive 33): WriteFileToolInvocation.execute has cognitive complexity 33 (threshold 15). Drivers by points: if/else 13 (18 pts), ternaries 7 (8 pts), boolean chains 5, error handling 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":"packages/core/src/tools/write-file.ts"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1aef2406340f5e6857707313f1f396fe3bba91a1bcab8437a13b6e66831d954"}},{"ruleId":"D2","level":"warning","message":{"text":"Session.runTool (cognitive 32): Session.runTool has cognitive complexity 32 (threshold 15). Drivers by points: ternaries 9 (16 pts), if/else 7 (10 pts), boolean chains 3, match/switch 1 (2 pts), error handling 1 (nesting depth added 11). Of this number, 30 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":"packages/cli/src/acp/acpSession.ts"},"region":{"startLine":659}}}],"partialFingerprints":{"codehealthFindingId/v1":"bee6580c1df5ce47a01ddfa637abc785614f85af2f6d734e143df6392c6c08f7"}},{"ruleId":"D2","level":"warning","message":{"text":"settings.migrateExperimentalSettings (cognitive 32): settings.migrateExperimentalSettings has cognitive complexity 32 (threshold 15). Drivers by points: if/else 13 (28 pts), boolean chains 4 (nesting depth added 15). Most of this is not in the body itself: 7 of the 32 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 1308, 1368, 1294, \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":"packages/cli/src/config/settings.ts"},"region":{"startLine":1273}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec1684705f8c85377b006e9381acfce15e6c2b4715c5646a6192a90d3d498cdd"}},{"ruleId":"D2","level":"warning","message":{"text":"AuthDialog.AuthDialog (cognitive 32): AuthDialog.AuthDialog has cognitive complexity 32 (threshold 15). Drivers by points: if/else 18 (23 pts), boolean chains 5, ternaries 3 (4 pts) (nesting depth added 6). Most of this is not in the body itself: 9 of the 32 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 117, 171, 97, \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":"packages/cli/src/ui/auth/AuthDialog.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"5179e85c78f54eacbc85fe2875510c8cec5fb8b37eeebcac8122ff21f351e868"}},{"ruleId":"D2","level":"warning","message":{"text":"HistoryItemDisplay.HistoryItemDisplay (cognitive 32): HistoryItemDisplay.HistoryItemDisplay has cognitive complexity 32 (threshold 15). Drivers by points: boolean chains 31, ternaries 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":"packages/cli/src/ui/components/HistoryItemDisplay.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"9615bafe5d008cbbd8ef23cbfedc3385160d7a3eac037b941b274201235ce47a"}},{"ruleId":"D2","level":"warning","message":{"text":"ExtensionDetails.ExtensionDetails (cognitive 32): ExtensionDetails.ExtensionDetails has cognitive complexity 32 (threshold 15). Drivers by points: boolean chains 20, if/else 9 (11 pts), ternaries 1 (nesting depth added 2). Of this number, 19 points are the body\u0027s own statements and 13 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":"packages/cli/src/ui/components/views/ExtensionDetails.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7128d01aa9fda3eeb2dda9ad4fa01fff517e80cb6f5b796478f1a62bebd5ecf"}},{"ruleId":"D2","level":"warning","message":{"text":"clipboardUtils.saveClipboardImage (cognitive 32): clipboardUtils.saveClipboardImage has cognitive complexity 32 (threshold 15). Drivers by points: if/else 10 (22 pts), error handling 4 (9 pts), 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":"packages/cli/src/ui/utils/clipboardUtils.ts"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e673d7af6c2fb389112463cbd73587c75da6608bd4f8e1175f7afb3881b0ef9"}},{"ruleId":"D2","level":"warning","message":{"text":"EditToolInvocation.execute (cognitive 32): EditToolInvocation.execute has cognitive complexity 32 (threshold 15). Drivers by points: if/else 11 (13 pts), ternaries 5 (10 pts), error handling 3 (5 pts), boolean chains 4 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/edit.ts"},"region":{"startLine":904}}}],"partialFingerprints":{"codehealthFindingId/v1":"516b19945c1a5e28fcdf98d3178fb7a94c473073fd6cf60e1b5dcd509b4b091d"}},{"ruleId":"D2","level":"warning","message":{"text":"RecursiveFileSearch.search (cognitive 32): RecursiveFileSearch.search has cognitive complexity 32 (threshold 15). Drivers by points: if/else 13 (23 pts), boolean chains 5, error handling 1 (3 pts), loops 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/filesearch/fileSearch.ts"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5726c13c85b229aef9e74963d00ca6ed0b835b94f28362555aa4801f93b44b5"}},{"ruleId":"D2","level":"warning","message":{"text":"partUtils.partToString (cognitive 32): partUtils.partToString has cognitive complexity 32 (threshold 15). Drivers by points: if/else 12 (20 pts), ternaries 3 (12 pts) (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":"packages/core/src/utils/partUtils.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f9b5743e88371e72bfba5d47e7c77bbd3b43c5eb086b725efcb855709a9545a"}},{"ruleId":"D2","level":"warning","message":{"text":"IDEServer.start (cognitive 32): IDEServer.start has cognitive complexity 32 (threshold 15). Drivers by points: if/else 15 (18 pts), boolean chains 7, ternaries 2 (4 pts), error handling 2, loops 1 (nesting depth added 5). Most of this is not in the body itself: 0 of the 32 points are its own statements and the rest belongs to 11 function literals inside it that branch (lines 213, 295, 174, \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":"packages/vscode-ide-companion/src/ide-server.ts"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"d569c5315de2745809dc4b32a501f2ea753edfaea8eb629e768a8c1ff414bfb2"}},{"ruleId":"D2","level":"warning","message":{"text":"settings.loadEnvironment (cognitive 31): settings.loadEnvironment has cognitive complexity 31 (threshold 15). Drivers by points: if/else 7 (22 pts), boolean chains 4, error handling 1 (2 pts), loops 1 (2 pts), ternaries 1 (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":"packages/cli/src/config/settings.ts"},"region":{"startLine":655}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d9371806a6d1998457bcb3531eea6ee7b5b755c635ee806c8c75fe9c21d3899"}},{"ruleId":"D2","level":"warning","message":{"text":"Scrollable.Scrollable (cognitive 31): Scrollable.Scrollable has cognitive complexity 31 (threshold 15). Drivers by points: if/else 15 (25 pts), boolean chains 5, ternaries 1 (nesting depth added 10). Most of this is not in the body itself: 1 of the 31 points is its own statement and the rest belongs to 9 function literals inside it that branch (lines 189, 145, 76, \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":"packages/cli/src/ui/components/shared/Scrollable.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"626f1bbe1f75f98ad55e5c9745ff0c5b7477acf9f36ef3b69092a1c4d2b20944"}},{"ruleId":"D2","level":"warning","message":{"text":"activityLogger.setupNetworkLogging (cognitive 31): activityLogger.setupNetworkLogging has cognitive complexity 31 (threshold 15). Drivers by points: if/else 11 (13 pts), boolean chains 10, ternaries 2 (3 pts), error handling 2, loops 2, match/switch 1 (nesting depth added 3). Most of this is not in the body itself: 0 of the 31 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 764, 855, 877, \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":"packages/cli/src/utils/activityLogger.ts"},"region":{"startLine":734}}}],"partialFingerprints":{"codehealthFindingId/v1":"1568cdb7cd5f58ac9c390e5ad2244c9d3e3ad06b28a3eb12d48433f029271c62"}},{"ruleId":"D2","level":"warning","message":{"text":"MockAgentProtocol.send (cognitive 31): MockAgentProtocol.send has cognitive complexity 31 (threshold 15). Drivers by points: if/else 13 (18 pts), boolean chains 5, ternaries 3 (5 pts), loops 2 (3 pts) (nesting depth added 8). Of this number, 29 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":"packages/core/src/agent/mock.ts"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"01578bfe095a8093263dfdb03406416c1ab45bbb6e549a21f3ad300cd9d8d578"}},{"ruleId":"D2","level":"warning","message":{"text":"A2AResultReassembler.update (cognitive 31): A2AResultReassembler.update has cognitive complexity 31 (threshold 15). Drivers by points: if/else 10 (21 pts), loops 2 (7 pts), boolean chains 2, 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":"packages/core/src/agents/a2aUtils.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a602c9c861c5cade77bcfed2fe9cf48ac82e1da295ad8c640c6a629708eb1fd"}},{"ruleId":"D2","level":"warning","message":{"text":"browserAgentFactory.createBrowserAgentDefinition (cognitive 31): browserAgentFactory.createBrowserAgentDefinition has cognitive complexity 31 (threshold 15). Drivers by points: if/else 13 (22 pts), loops 2 (4 pts), boolean chains 3, error handling 1, ternaries 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":"packages/core/src/agents/browser/browserAgentFactory.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cc68bd8a417c10213df5ff54b1e70afa4590db8cadd355fbf8f05d3309e0688"}},{"ruleId":"D2","level":"warning","message":{"text":"BrowserManager.connectMcp (cognitive 31): BrowserManager.connectMcp has cognitive complexity 31 (threshold 15). Drivers by points: if/else 15 (18 pts), boolean chains 5, error handling 2 (4 pts), ternaries 3 (4 pts) (nesting depth added 6). Of this number, 29 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, 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":"packages/core/src/agents/browser/browserManager.ts"},"region":{"startLine":559}}}],"partialFingerprints":{"codehealthFindingId/v1":"05cc7e35a55c74c4c535dc81ed7c40df0477bc39285a5b29ee10084c545d5a53"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectRegistry.claimNewSlug (cognitive 31): ProjectRegistry.claimNewSlug has cognitive complexity 31 (threshold 15). Drivers by points: if/else 5 (14 pts), error handling 2 (6 pts), ternaries 2 (5 pts), boolean chains 3, loops 2 (3 pts) (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/config/projectRegistry.ts"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"98166bdb133a794672824cd688697099fd998b6b00dd24a3d7e1bb6fc09f4cc9"}},{"ruleId":"D2","level":"warning","message":{"text":"HookAggregator.mergeWithOrDecision (cognitive 31): HookAggregator.mergeWithOrDecision has cognitive complexity 31 (threshold 15). Drivers by points: if/else 15 (26 pts), boolean chains 4, 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":"packages/core/src/hooks/hookAggregator.ts"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"295f9dddb73e53c7b5a20eaf6fedc9bfced16bb4fc4d2131db85a5e8c4772bbf"}},{"ruleId":"D2","level":"warning","message":{"text":"ide-connection-utils.getConnectionConfigFromFile (cognitive 31): ide-connection-utils.getConnectionConfigFromFile has cognitive complexity 31 (threshold 15). Drivers by points: if/else 17 (24 pts), boolean chains 4, error handling 3 (nesting depth added 7). Of this number, 24 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":"packages/core/src/ide/ide-connection-utils.ts"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"5937600aca4a3fe3396f2306e888cd39d8fc6e186f8f404555cf249767b3bd85"}},{"ruleId":"D2","level":"warning","message":{"text":"GrepToolInvocation.performRipgrepSearch (cognitive 31): GrepToolInvocation.performRipgrepSearch has cognitive complexity 31 (threshold 15). Drivers by points: if/else 16 (24 pts), loops 2 (3 pts), boolean chains 2, error handling 1, ternaries 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/ripGrep.ts"},"region":{"startLine":409}}}],"partialFingerprints":{"codehealthFindingId/v1":"0852c807e9a7102876f97c1321e1d3f9b2874336f5e4462033dd6a129c6cbe4c"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentRunner.run_agent (cognitive 31): AgentRunner.run_agent has cognitive complexity 31 (threshold 15). Drivers by points: if/else 12 (22 pts), loops 4 (7 pts), boolean chains 1, 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":"tools/caretaker-agent/cloudrun/pr-generator/workflow/agent_runner.py"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9f625148b1a23fb10e042ffad82f2d80fa53fe1b74120e0d5a483501692dac6"}},{"ruleId":"D2","level":"warning","message":{"text":"gemini.resolveSessionId (cognitive 30): gemini.resolveSessionId has cognitive complexity 30 (threshold 15). Drivers by points: if/else 8 (14 pts), boolean chains 5, ternaries 2 (5 pts), error handling 2 (3 pts), loops 1 (3 pts) (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/gemini.tsx"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"98e58e422e74cda975aec62773993cba64fede72088d9989c28423d5038f4acc"}},{"ruleId":"D2","level":"warning","message":{"text":"FooterConfigDialog.FooterConfigDialog (cognitive 30): FooterConfigDialog.FooterConfigDialog has cognitive complexity 30 (threshold 15). Drivers by points: if/else 13 (15 pts), ternaries 8 (9 pts), boolean chains 6 (nesting depth added 3). Most of this is not in the body itself: 4 of the 30 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 185, 338, 168, \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":"packages/cli/src/ui/components/FooterConfigDialog.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb00b91f6493cc8a63a23bddc52cd90fd353c366256ea95af908d1456cb70372"}},{"ruleId":"D2","level":"warning","message":{"text":"clipboardUtils.splitDragAndDropPaths (cognitive 30): clipboardUtils.splitDragAndDropPaths has cognitive complexity 30 (threshold 15). Drivers by points: if/else 15 (28 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":"packages/cli/src/ui/utils/clipboardUtils.ts"},"region":{"startLine":442}}}],"partialFingerprints":{"codehealthFindingId/v1":"2786e5653fa428ce1621e6cb82138a3b3301e859e085ba91709508da554334e0"}},{"ruleId":"D2","level":"warning","message":{"text":"stateSnapshotProcessor.createStateSnapshotProcessor (cognitive 30): stateSnapshotProcessor.createStateSnapshotProcessor has cognitive complexity 30 (threshold 15). Drivers by points: if/else 17 (24 pts), loops 2 (3 pts), boolean chains 1, error handling 1, ternaries 1 (nesting depth added 8). Most of this is not in the body itself: 0 of the 30 points are its own statements and the rest belongs to one function literal inside it that branches (line 56). 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":"packages/core/src/context/processors/stateSnapshotProcessor.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3dbe6986fd0e01880abf05ced12592a395950621a99b4aed39af5a51cc2fa57"}},{"ruleId":"D2","level":"warning","message":{"text":"PolicyEngine.getExcludedTools (cognitive 30): PolicyEngine.getExcludedTools has cognitive complexity 30 (threshold 15). Drivers by points: if/else 9 (24 pts), loops 2 (3 pts), ternaries 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":"packages/core/src/policy/policy-engine.ts"},"region":{"startLine":1027}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4025b44b154007b8109e5c801e82892a32e50cf679ddc32c4583b518caa427c"}},{"ruleId":"D2","level":"warning","message":{"text":"AllowedPathChecker.check (cognitive 30): AllowedPathChecker.check has cognitive complexity 30 (threshold 15). Drivers by points: if/else 8 (21 pts), loops 4 (8 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":"packages/core/src/safety/built-in.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"64b140105b86aa36012ccddbc47ba499ee6bea6c039e36197d96a516feed58b5"}},{"ruleId":"D2","level":"warning","message":{"text":"memoryService.buildExistingSkillsSummary (cognitive 30): memoryService.buildExistingSkillsSummary has cognitive complexity 30 (threshold 15). Drivers by points: if/else 13 (21 pts), error handling 3 (4 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/services/memoryService.ts"},"region":{"startLine":729}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f592ec05dbfaaffba7a2cc1ec95c951787cd83e2420c2698b62ac8214f0091f"}},{"ruleId":"D2","level":"warning","message":{"text":"download-ripgrep-binaries.downloadBinary (cognitive 30): download-ripgrep-binaries.downloadBinary has cognitive complexity 30 (threshold 15). Drivers by points: if/else 13 (27 pts), ternaries 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":"scripts/download-ripgrep-binaries.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"6da2d600ce6970b9925baef94b2041fc4d40b515421f36a3dfa75d09ae3be1c3"}},{"ruleId":"D2","level":"warning","message":{"text":"telemetry_utils.manageTelemetrySettings (cognitive 30): telemetry_utils.manageTelemetrySettings has cognitive complexity 30 (threshold 15). Drivers by points: if/else 16 (27 pts), ternaries 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":"scripts/telemetry_utils.js"},"region":{"startLine":315}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcddd0f40d8ad2ab4f7bc50edfd98f10b7a1d89266406d5e30c27f7f25aefabd"}},{"ruleId":"D2","level":"warning","message":{"text":"sandboxConfig.getSandboxCommand (cognitive 29): sandboxConfig.getSandboxCommand has cognitive complexity 29 (threshold 15). Drivers by points: if/else 14 (19 pts), boolean chains 10 (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":"packages/cli/src/config/sandboxConfig.ts"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed09006f1713f64bf8c96c8fd61bebcdaf8794f6454bd8f2401036439d01e77b"}},{"ruleId":"D2","level":"warning","message":{"text":"mcpCommand.listAction (cognitive 29): mcpCommand.listAction has cognitive complexity 29 (threshold 15). Drivers by points: if/else 11 (19 pts), boolean chains 7, loops 3 (nesting depth added 8). Of this number, 28 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":"packages/cli/src/ui/commands/mcpCommand.ts"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc70e5e7c59fed090c5d79ecee2ffc20cd6403c333cdde70a57493630f4d511e"}},{"ruleId":"D2","level":"warning","message":{"text":"useExtensionUpdates.useExtensionUpdates (cognitive 29): useExtensionUpdates.useExtensionUpdates has cognitive complexity 29 (threshold 15). Drivers by points: if/else 14 (21 pts), boolean chains 2, 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 29 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 118, 95, 94, \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":"packages/cli/src/ui/hooks/useExtensionUpdates.ts"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"437003b3362963e1093af55058873a444700d073ca8bd118e0bbbb7fcd0cdfc1"}},{"ruleId":"D2","level":"warning","message":{"text":"borderStyles.getToolGroupBorderAppearance (cognitive 29): borderStyles.getToolGroupBorderAppearance has cognitive complexity 29 (threshold 15). Drivers by points: boolean chains 15, if/else 7, ternaries 4 (7 pts) (nesting depth added 3). Of this number, 18 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":"packages/cli/src/ui/utils/borderStyles.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"22ffa0edba80ed367b9affa589aaf2dbb2be038ff4f70890b39d550edc35d99a"}},{"ruleId":"D2","level":"warning","message":{"text":"highlight.parseInputForHighlighting (cognitive 29): highlight.parseInputForHighlighting has cognitive complexity 29 (threshold 15). Drivers by points: if/else 9 (13 pts), ternaries 5 (9 pts), loops 3 (4 pts), boolean chains 3 (nesting depth added 9). Of this number, 15 points are the body\u0027s own statements and 14 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":"packages/cli/src/ui/utils/highlight.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6b478abd9e9d2882a51343e63ae80502c903b1e23f7e74e11370287f75ce1f2"}},{"ruleId":"D2","level":"warning","message":{"text":"atCommandUtils.resolveAtCommandPath (cognitive 29): atCommandUtils.resolveAtCommandPath has cognitive complexity 29 (threshold 15). Drivers by points: if/else 9 (18 pts), boolean chains 4, error handling 2 (4 pts), 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":"packages/core/src/utils/atCommandUtils.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9e762c37a699cb5e3d3954bce473ddf4eee9247272282050d01b5fc086b05e4"}},{"ruleId":"D2","level":"warning","message":{"text":"paths.robustRealpath (cognitive 29): paths.robustRealpath has cognitive complexity 29 (threshold 15). Drivers by points: if/else 8 (17 pts), boolean chains 6, error handling 2 (4 pts), ternaries 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":"packages/core/src/utils/paths.ts"},"region":{"startLine":459}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5445c754d7de3757f774d9de4c229b76dc94b98d5f792cdd6c18e4162aeffa6"}},{"ruleId":"D2","level":"warning","message":{"text":"shell-utils.detectBashSubstitution (cognitive 29): shell-utils.detectBashSubstitution has cognitive complexity 29 (threshold 15). Drivers by points: if/else 10 (22 pts), boolean chains 6, loops 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/shell-utils.ts"},"region":{"startLine":1095}}}],"partialFingerprints":{"codehealthFindingId/v1":"647af1ad051acb88172b84c2943abfe92113c62bc1d16e293ed39363e8436703"}},{"ruleId":"D2","level":"warning","message":{"text":"get-release-version.detectRollbackAndGetBaseline (cognitive 29): get-release-version.detectRollbackAndGetBaseline has cognitive complexity 29 (threshold 15). Drivers by points: if/else 12 (18 pts), error handling 2 (6 pts), boolean chains 3, loops 1, 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":"scripts/get-release-version.js"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a8c42e6daf6ad158500e0d9f4571d91724fb927b34e8e1c553fe4e52fb1f274"}},{"ruleId":"D2","level":"warning","message":{"text":"eval-inventory.formatInventoryReport (cognitive 29): eval-inventory.formatInventoryReport has cognitive complexity 29 (threshold 15). Drivers by points: loops 10 (19 pts), if/else 6 (8 pts), boolean chains 2 (nesting depth added 11). 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, 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":"scripts/utils/eval-inventory.ts"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b5e52cdf5137e44be7aeb45c36237fd45f283d12700cfea8984960b6f98ba36"}},{"ruleId":"D2","level":"warning","message":{"text":"config.refreshAuthentication (cognitive 28): config.refreshAuthentication has cognitive complexity 28 (threshold 15). Drivers by points: ternaries 3 (12 pts), if/else 5 (10 pts), error handling 2 (5 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":"packages/a2a-server/src/config/config.ts"},"region":{"startLine":644}}}],"partialFingerprints":{"codehealthFindingId/v1":"67d30f8bc0b620dc33cd8ab4ea4f39bfcc0b0156ea0bee328c358d937b2d63fa"}},{"ruleId":"D2","level":"warning","message":{"text":"SlicingMaxSizedBox.SlicingMaxSizedBox (cognitive 28): SlicingMaxSizedBox.SlicingMaxSizedBox has cognitive complexity 28 (threshold 15). Drivers by points: if/else 10 (20 pts), ternaries 2 (6 pts), boolean chains 2 (nesting depth added 14). Most of this is not in the body itself: 0 of the 28 points are its own statements and the rest belongs to one function literal inside it that branches (line 34). 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":"packages/cli/src/ui/components/shared/SlicingMaxSizedBox.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"bef9be90da8fa9bdc520c3302aa0e3b9270bb747a60152968f6693209f017de1"}},{"ruleId":"D2","level":"warning","message":{"text":"sessionUtils.formatRelativeTime (cognitive 28): sessionUtils.formatRelativeTime has cognitive complexity 28 (threshold 15). Drivers by points: if/else 11 (17 pts), ternaries 4 (11 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":"packages/cli/src/utils/sessionUtils.ts"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"5413b4657140b7e5478da2ca938b241a9e20a01e258088cd6626daaec7673d91"}},{"ruleId":"D2","level":"warning","message":{"text":"telemetry.summarizeToolCalls (cognitive 28): telemetry.summarizeToolCalls has cognitive complexity 28 (threshold 15). Drivers by points: if/else 7 (22 pts), boolean chains 4, loops 1, ternaries 1 (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":"packages/core/src/code_assist/telemetry.ts"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf9ab75c001e23c03c714e74443b085b53ff388b13d947593957bff1829d1cc5"}},{"ruleId":"D2","level":"warning","message":{"text":"memory.listInboxMemoryPatches (cognitive 28): memory.listInboxMemoryPatches has cognitive complexity 28 (threshold 15). Drivers by points: if/else 5 (14 pts), error handling 2 (6 pts), loops 3 (6 pts), boolean chains 2 (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/commands/memory.ts"},"region":{"startLine":449}}}],"partialFingerprints":{"codehealthFindingId/v1":"77567911259ee95f5da28aa83932a70c604081a5f15a91a7dfd790c1133f7b4c"}},{"ruleId":"D2","level":"warning","message":{"text":"config.createPolicyUpdater (cognitive 28): config.createPolicyUpdater has cognitive complexity 28 (threshold 15). Drivers by points: if/else 7 (12 pts), boolean chains 8, ternaries 3 (6 pts), loops 1 (2 pts) (nesting depth added 9). Most of this is not in the body itself: 0 of the 28 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 722, 796). 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":"packages/core/src/policy/config.ts"},"region":{"startLine":712}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d67781a1e89304760dea460d8fbf8707d5975a6bb2f4e8f5e9083c7be2a90fe"}},{"ruleId":"D2","level":"warning","message":{"text":"sessionSummaryUtils.getPreviousSession (cognitive 28): sessionSummaryUtils.getPreviousSession has cognitive complexity 28 (threshold 15). Drivers by points: if/else 9 (16 pts), error handling 3 (4 pts), ternaries 2 (4 pts), boolean chains 3, loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/services/sessionSummaryUtils.ts"},"region":{"startLine":460}}}],"partialFingerprints":{"codehealthFindingId/v1":"c355948ddb6c7c3718fb272543d9c32b44326113a7086d4f7a748d58a598ed28"}},{"ruleId":"D2","level":"warning","message":{"text":"ToolRegistry.discoverAndRegisterToolsFromCommand (cognitive 28): ToolRegistry.discoverAndRegisterToolsFromCommand has cognitive complexity 28 (threshold 15). Drivers by points: if/else 16 (20 pts), boolean chains 3, loops 2, ternaries 1 (2 pts), error handling 1 (nesting depth added 5). 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: 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":"packages/core/src/tools/tool-registry.ts"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ef411fa496bc741adb5d9fc0cc84aa399a84e91f609770235e782c34c4104b4"}},{"ruleId":"D2","level":"warning","message":{"text":"tools.hasCycleInSchema (cognitive 28): tools.hasCycleInSchema has cognitive complexity 28 (threshold 15). Drivers by points: if/else 11 (20 pts), boolean chains 4, loops 3 (4 pts) (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/tools.ts"},"region":{"startLine":798}}}],"partialFingerprints":{"codehealthFindingId/v1":"0aab16d587499da34caad31f778bc1df19a8c226253177a9c018f30054d89dff"}},{"ruleId":"D2","level":"warning","message":{"text":"memoryDiscovery.readGeminiMdFiles (cognitive 28): memoryDiscovery.readGeminiMdFiles has cognitive complexity 28 (threshold 15). Drivers by points: if/else 5 (12 pts), ternaries 2 (9 pts), loops 2 (3 pts), boolean chains 2, error handling 1 (2 pts) (nesting depth added 16). Most of this is not in the body itself: 11 of the 28 points are its own statements and the rest belongs to one function literal inside it that branches (line 221). 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":"packages/core/src/utils/memoryDiscovery.ts"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"dad9323d1ffa6e2121ac5ef2a83a97d4da6a4de9c168e5c5285a7b25d1b05283"}},{"ruleId":"D2","level":"warning","message":{"text":"oauth-flow.parseTokenEndpointResponse (cognitive 28): oauth-flow.parseTokenEndpointResponse has cognitive complexity 28 (threshold 15). Drivers by points: boolean chains 10, ternaries 5 (9 pts), if/else 5 (6 pts), error handling 2 (3 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/oauth-flow.ts"},"region":{"startLine":485}}}],"partialFingerprints":{"codehealthFindingId/v1":"0daddb308eb9db987ad0287ffdfda592a4b804c3dd24cad88d269041561c04b1"}},{"ruleId":"D2","level":"warning","message":{"text":"aggregate_evals.generateMarkdown (cognitive 28): aggregate_evals.generateMarkdown has cognitive complexity 28 (threshold 15). Drivers by points: if/else 6 (13 pts), loops 5 (10 pts), ternaries 2 (5 pts) (nesting depth added 15). 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":"scripts/aggregate_evals.js"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"e42ffed5aa89ef4bc348603ccddf9505ad92857f6315ef9be89f025b1c28aeed"}},{"ruleId":"D2","level":"warning","message":{"text":"config.loadConfig (cognitive 27): config.loadConfig has cognitive complexity 27 (threshold 15). Drivers by points: if/else 10 (17 pts), boolean chains 7, ternaries 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":"packages/a2a-server/src/config/config.ts"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3a3440baaced27c2779bd9f8b1658f375505a5b023f68865483a6cf504bf1d3"}},{"ruleId":"D2","level":"warning","message":{"text":"ShellProcessor.processString (cognitive 27): ShellProcessor.processString has cognitive complexity 27 (threshold 15). Drivers by points: if/else 14 (22 pts), boolean chains 3, loops 2 (nesting depth added 8). Of this number, 26 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":"packages/cli/src/services/prompt-processors/shellProcessor.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"a392f1088a73205bf0d51846434f798456ecfcfea90134817a3627437ded2848"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentConfigDialog.AgentConfigDialog (cognitive 27): AgentConfigDialog.AgentConfigDialog has cognitive complexity 27 (threshold 15). Drivers by points: if/else 13 (16 pts), ternaries 6, boolean chains 4, loops 1 (nesting depth added 3). 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 258, 335, 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":"packages/cli/src/ui/components/AgentConfigDialog.tsx"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb4efae80b8d78d21f736318f34a5b5086192698acc6c868d398c642692dd824"}},{"ruleId":"D2","level":"warning","message":{"text":"LoadingIndicator.LoadingIndicator (cognitive 27): LoadingIndicator.LoadingIndicator has cognitive complexity 27 (threshold 15). Drivers by points: boolean chains 16, ternaries 7 (9 pts), if/else 2 (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":"packages/cli/src/ui/components/LoadingIndicator.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"89e7034afedd01d66beb9584aba3e097014931f93e239b87a2e4f88fe5b6dc94"}},{"ruleId":"D2","level":"warning","message":{"text":"SubagentProgressDisplay.SubagentProgressDisplay (cognitive 27): SubagentProgressDisplay.SubagentProgressDisplay has cognitive complexity 27 (threshold 15). Drivers by points: ternaries 6 (15 pts), boolean chains 6, if/else 6 (nesting depth added 9). Most of this is not in the body itself: 7 of the 27 points are its own statements and the rest belongs to one function literal inside it that branches (line 91). 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":"packages/cli/src/ui/components/messages/SubagentProgressDisplay.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"e26b6fd7842b9d23dc392ed50ec0b55f86b61d60599d8283615a74272a43bcbe"}},{"ruleId":"D2","level":"warning","message":{"text":"ToolGroupDisplay.ToolGroupDisplay (cognitive 27): ToolGroupDisplay.ToolGroupDisplay has cognitive complexity 27 (threshold 15). Drivers by points: ternaries 9 (17 pts), boolean chains 8, if/else 2 (nesting depth added 8). Of this number, 20 points are the body\u0027s own statements and 7 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":"packages/cli/src/ui/components/messages/ToolGroupDisplay.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"03de48577c5d6e5f8ccbcca48801935afb102b3cd780a21a0f6c04efb4f155af"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentRegistry.registerRemoteAgent (cognitive 27): AgentRegistry.registerRemoteAgent has cognitive complexity 27 (threshold 15). Drivers by points: if/else 18 (22 pts), boolean chains 4, error handling 1 (nesting depth added 4). Of this number, 26 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, 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":"packages/core/src/agents/registry.ts"},"region":{"startLine":453}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1c169870f4f85340207d0791dd218444e89abbc15060516165a81d77e159386"}},{"ruleId":"D2","level":"warning","message":{"text":"ContextManager.renderHistory (cognitive 27): ContextManager.renderHistory has cognitive complexity 27 (threshold 15). Drivers by points: if/else 11 (15 pts), boolean chains 6, loops 3 (4 pts), ternaries 2 (nesting depth added 5). Of this number, 23 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, 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":"packages/core/src/context/contextManager.ts"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"0da554fcddb386bfca0f99c788c4d602218200292c0cbd50113cc06664d0c07a"}},{"ruleId":"D2","level":"warning","message":{"text":"HookRunner.applyHookOutputToInput (cognitive 27): HookRunner.applyHookOutputToInput has cognitive complexity 27 (threshold 15). Drivers by points: if/else 7 (22 pts), boolean chains 3, match/switch 1 (2 pts) (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/hooks/hookRunner.ts"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"45b2a7d205bad5c14e2a677c024f9f28f8ef23cbd34c98f50ec11024f960e2c0"}},{"ruleId":"D2","level":"warning","message":{"text":"HookTranslatorGenAIv1.toHookLLMRequest (cognitive 27): HookTranslatorGenAIv1.toHookLLMRequest has cognitive complexity 27 (threshold 15). Drivers by points: ternaries 4 (15 pts), if/else 4 (9 pts), loops 1 (2 pts), boolean chains 1 (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":"packages/core/src/hooks/hookTranslator.ts"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8c1146ce4d47c42f41c053c8471201ce8bf4d4506276a82f5d31a01801910e1"}},{"ruleId":"D2","level":"warning","message":{"text":"ide-installer.findCommand (cognitive 27): ide-installer.findCommand has cognitive complexity 27 (threshold 15). Drivers by points: if/else 13 (22 pts), boolean chains 3, error handling 1, loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/ide/ide-installer.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"154060aa706b14a279c7700d3047a438af6e8ae53caa06f5c2ca87b9b17a4028"}},{"ruleId":"D2","level":"warning","message":{"text":"oauth-utils.validateOAuthEndpointUrl (cognitive 27): oauth-utils.validateOAuthEndpointUrl has cognitive complexity 27 (threshold 15). Drivers by points: if/else 11 (15 pts), error handling 4 (6 pts), boolean chains 5, 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":"packages/core/src/mcp/oauth-utils.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"9535bd71535411c13da98bd6dbfa54a660e566c28a6d46ae9d4aa6ce3fb34c17"}},{"ruleId":"D2","level":"warning","message":{"text":"AskUserTool.validateToolParamValues (cognitive 27): AskUserTool.validateToolParamValues has cognitive complexity 27 (threshold 15). Drivers by points: if/else 7 (19 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":"packages/core/src/tools/ask-user.ts"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8bb48c654da64ac7c4ec2a9b377901fd7c5e30be19c0d68e8eadb5a793bb4f0"}},{"ruleId":"D2","level":"warning","message":{"text":"RipGrepTool.validateToolParamValues (cognitive 27): RipGrepTool.validateToolParamValues has cognitive complexity 27 (threshold 15). Drivers by points: if/else 8 (12 pts), error handling 4 (8 pts), boolean chains 4, ternaries 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":"packages/core/src/tools/ripGrep.ts"},"region":{"startLine":659}}}],"partialFingerprints":{"codehealthFindingId/v1":"30bc6a245929cc3115ce1b86a0130e55a99f06c39aa8c6879e941a87f53c3e77"}},{"ruleId":"D2","level":"warning","message":{"text":"memoryDiscovery.findProjectRoot (cognitive 27): memoryDiscovery.findProjectRoot has cognitive complexity 27 (threshold 15). Drivers by points: if/else 6 (16 pts), boolean chains 5, error handling 1 (3 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":"packages/core/src/utils/memoryDiscovery.ts"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"032b080a77746e9750966038bf4efb4d6eae607dc68bf7f290bbb1450a655749"}},{"ruleId":"D2","level":"warning","message":{"text":"shell-utils.detectPowerShellSubstitution (cognitive 27): shell-utils.detectPowerShellSubstitution has cognitive complexity 27 (threshold 15). Drivers by points: if/else 9 (20 pts), boolean chains 6, 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":"packages/core/src/utils/shell-utils.ts"},"region":{"startLine":1148}}}],"partialFingerprints":{"codehealthFindingId/v1":"496e773483aa6ab8b6906be7c42441c407b038f1d8ab15ebcf2d12a54b5e1d18"}},{"ruleId":"D2","level":"warning","message":{"text":"get_trustworthy_evals.main (cognitive 27): get_trustworthy_evals.main has cognitive complexity 27 (threshold 15). Drivers by points: if/else 11 (21 pts), loops 3 (4 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":"scripts/get_trustworthy_evals.js"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"224fbfe32eb69ee6180ac0168fcb65fd33461c223748cc53c2f20e625564eb25"}},{"ruleId":"D2","level":"warning","message":{"text":"local_telemetry.main (cognitive 27): local_telemetry.main has cognitive complexity 27 (threshold 15). Drivers by points: if/else 13 (19 pts), error handling 6, boolean chains 2 (nesting depth added 6). Of this number, 26 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":"scripts/local_telemetry.js"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"411149611a0320126799f8d3f276d0e0a5cbb8a640409cf191c25dcde9e9fe7c"}},{"ruleId":"D2","level":"warning","message":{"text":"app.createApp (cognitive 26): app.createApp has cognitive complexity 26 (threshold 15). Drivers by points: if/else 11 (13 pts), ternaries 3 (6 pts), error handling 4, boolean chains 2, loops 1 (nesting depth added 5). 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 356, 284, 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":"packages/a2a-server/src/http/app.ts"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ec4a6662f75cb2e5d2c3efe0f7c843a5d93675363eae90e9ece7dff2c2f2cdd"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelStatsDisplay.ModelStatsDisplay (cognitive 26): ModelStatsDisplay.ModelStatsDisplay has cognitive complexity 26 (threshold 15). Drivers by points: if/else 13 (14 pts), boolean chains 8, ternaries 4 (nesting depth added 1). Most of this is not in the body itself: 12 of the 26 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 304, 102, 256, \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":"packages/cli/src/ui/components/ModelStatsDisplay.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"90825fa2da2c4d06a10265a564c9bc0b2dcc02a1bad823ba8c6de2eacc2e8237"}},{"ruleId":"D2","level":"warning","message":{"text":"ValidationDialog.ValidationDialog (cognitive 26): ValidationDialog.ValidationDialog has cognitive complexity 26 (threshold 15). Drivers by points: if/else 11 (14 pts), boolean chains 5, ternaries 1 (4 pts), error handling 1 (3 pts) (nesting depth added 8). Most of this is not in the body itself: 6 of the 26 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 81, 55, 70). 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":"packages/cli/src/ui/components/ValidationDialog.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0d726d3f8be0b702765256cafbddf9411b6ea3baef33351e49723f57f8e9bd6"}},{"ruleId":"D2","level":"warning","message":{"text":"ExpandableText._ExpandableText (cognitive 26): ExpandableText._ExpandableText has cognitive complexity 26 (threshold 15). Drivers by points: if/else 13 (23 pts), boolean chains 2, 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":"packages/cli/src/ui/components/shared/ExpandableText.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7b4de72a14195dcbb1b346b5bee30890e57c620b620f14318fc5e5c0dc24933"}},{"ruleId":"D2","level":"warning","message":{"text":"MouseContext.MouseProvider (cognitive 26): MouseContext.MouseProvider has cognitive complexity 26 (threshold 15). Drivers by points: if/else 12 (19 pts), loops 3 (5 pts), boolean chains 2 (nesting depth added 9). Most of this is not in the body itself: 0 of the 26 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 102, 148, 95). 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":"packages/cli/src/ui/contexts/MouseContext.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"84649a5b329aad65de2409c3870468d31fff8f2512e85dbdc05abc7a2312d09f"}},{"ruleId":"D2","level":"warning","message":{"text":"CodeColorizer.colorizeCode (cognitive 26): CodeColorizer.colorizeCode has cognitive complexity 26 (threshold 15). Drivers by points: ternaries 7 (10 pts), if/else 6 (9 pts), boolean chains 6, error handling 1 (nesting depth added 6). Of this number, 20 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":"packages/cli/src/ui/utils/CodeColorizer.tsx"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca94f7a6040b106000021c70d2d72293a06a76667f0ef183cf51bbcee1fd5301"}},{"ruleId":"D2","level":"warning","message":{"text":"TerminalCapabilityManager.detectCapabilities (cognitive 26): TerminalCapabilityManager.detectCapabilities has cognitive complexity 26 (threshold 15). Drivers by points: if/else 16 (22 pts), boolean chains 3, error handling 1 (nesting depth added 6). Most of this is not in the body itself: 3 of the 26 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 151, 120, 135). 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":"packages/cli/src/ui/utils/terminalCapabilityManager.ts"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"88226957eb7e9724dec4a7d10abb3cfc21dbb4f90b1966fd5cbd95e8c4f5ee3c"}},{"ruleId":"D2","level":"warning","message":{"text":"sandboxUtils.safeResolveToRealPath (cognitive 26): sandboxUtils.safeResolveToRealPath has cognitive complexity 26 (threshold 15). Drivers by points: if/else 4 (14 pts), error handling 2 (6 pts), boolean chains 3, ternaries 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":"packages/cli/src/utils/sandboxUtils.ts"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dcefa390e9445187bdb37e866e70ee103d2e6181f37cfe010e84cac90f9fafe"}},{"ruleId":"D2","level":"warning","message":{"text":"sessionUtils.convertSessionToHistoryFormats (cognitive 26): sessionUtils.convertSessionToHistoryFormats has cognitive complexity 26 (threshold 15). Drivers by points: if/else 4 (8 pts), boolean chains 6, ternaries 2 (5 pts), loops 2 (4 pts), match/switch 1 (3 pts) (nesting depth added 11). Of this number, 21 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":"packages/cli/src/utils/sessionUtils.ts"},"region":{"startLine":574}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cbdcc89abb18b6ebef4fe0a85e188bc8c3affb85ef5b6a81517a352e6da49cf"}},{"ruleId":"D2","level":"warning","message":{"text":"LocalAgentExecutor.callModel (cognitive 26): LocalAgentExecutor.callModel has cognitive complexity 26 (threshold 15). Drivers by points: if/else 8 (17 pts), boolean chains 5, 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":"packages/core/src/agents/local-executor.ts"},"region":{"startLine":955}}}],"partialFingerprints":{"codehealthFindingId/v1":"3072713a7ddfe3a4ebd7442656c564a457904d9fc7ab800f74e71bc1823a2fe6"}},{"ruleId":"D2","level":"warning","message":{"text":"PromptProvider.getCoreSystemPrompt (cognitive 26): PromptProvider.getCoreSystemPrompt has cognitive complexity 26 (threshold 15). Drivers by points: if/else 8 (11 pts), ternaries 6 (10 pts), boolean chains 5 (nesting depth added 7). Of this number, 22 points are the body\u0027s own statements and 4 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":"packages/core/src/prompts/promptProvider.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c1895328f0272d0f5c7bde862272860c788243a297645a03317a3cbce86f027"}},{"ruleId":"D2","level":"warning","message":{"text":"sessionSummaryUtils.generateAndSaveSummary (cognitive 26): sessionSummaryUtils.generateAndSaveSummary has cognitive complexity 26 (threshold 15). Drivers by points: if/else 17 (22 pts), boolean chains 3, ternaries 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":"packages/core/src/services/sessionSummaryUtils.ts"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1dc062bfdacc8a6738fe31da2fdc78abaa023b695b551d6ce1bce8c83b3c197"}},{"ruleId":"D2","level":"warning","message":{"text":"compare_evals.main (cognitive 26): compare_evals.main has cognitive complexity 26 (threshold 15). Drivers by points: if/else 8 (13 pts), ternaries 2 (6 pts), loops 3 (5 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":"scripts/compare_evals.js"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7b7f479242d7dc2de4728e96cc61770a495e1584080339dcdb0efd0838c52d2"}},{"ruleId":"D2","level":"warning","message":{"text":"settings-validation.buildZodSchemaFromJsonSchema (cognitive 25): settings-validation.buildZodSchemaFromJsonSchema has cognitive complexity 25 (threshold 15). Drivers by points: if/else 14 (21 pts), loops 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":"packages/cli/src/config/settings-validation.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dd673af684abe1b781d1b28e92bd1847362d69c78c9bcbff11c1165067b7d6a"}},{"ruleId":"D2","level":"warning","message":{"text":"settings.findEnvFile (cognitive 25): settings.findEnvFile has cognitive complexity 25 (threshold 15). Drivers by points: if/else 8 (22 pts), boolean chains 2, 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":"packages/cli/src/config/settings.ts"},"region":{"startLine":561}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e8cf6019bf7e52928e9416cefbb8997b6259a369325812bfa6033eb158fef98"}},{"ruleId":"D2","level":"warning","message":{"text":"HooksDialog.HooksDialog (cognitive 25): HooksDialog.HooksDialog has cognitive complexity 25 (threshold 15). Drivers by points: boolean chains 10, if/else 6 (9 pts), ternaries 4 (6 pts) (nesting depth added 5). Most of this is not in the body itself: 6 of the 25 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 176, 93, 66). 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":"packages/cli/src/ui/components/HooksDialog.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"be26cad37951c50c918789689d1659dc089d07f559604ae2e2e10a79ee0870be"}},{"ruleId":"D2","level":"warning","message":{"text":"Notifications.Notifications (cognitive 25): Notifications.Notifications has cognitive complexity 25 (threshold 15). Drivers by points: boolean chains 12, if/else 10 (12 pts), error handling 1 (nesting depth added 2). Most of this is not in the body itself: 8 of the 25 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 71, 55, 59, \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":"packages/cli/src/ui/components/Notifications.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"9df2247fa2e31d5a752efb69d1c5ea972a935af1764ed654202807bbbcf52720"}},{"ruleId":"D2","level":"warning","message":{"text":"VoiceModelDialog.VoiceModelDialog (cognitive 25): VoiceModelDialog.VoiceModelDialog has cognitive complexity 25 (threshold 15). Drivers by points: ternaries 8 (13 pts), if/else 7 (8 pts), boolean chains 2, error handling 1 (2 pts) (nesting depth added 7). Most of this is not in the body itself: 10 of the 25 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 113, 76, 93, \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":"packages/cli/src/ui/components/VoiceModelDialog.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d2a4200a9aefa37aed82fc93a1c8e91caaf70b5fcb8e803291563e8493c2d22"}},{"ruleId":"D2","level":"warning","message":{"text":"activityLogger.callHttpRequest (cognitive 25): activityLogger.callHttpRequest has cognitive complexity 25 (threshold 15). Drivers by points: if/else 11 (20 pts), boolean chains 5 (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":"packages/cli/src/utils/activityLogger.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1744f913b2f40507765ab9182218e20925a18ec4ee17e050ed8854feb36784f"}},{"ruleId":"D2","level":"warning","message":{"text":"agentLoader.markdownToAgentDefinition (cognitive 25): agentLoader.markdownToAgentDefinition has cognitive complexity 25 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 5, ternaries 3 (4 pts), loops 1 (2 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/agents/agentLoader.ts"},"region":{"startLine":497}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c341dbd8465e1d665ac24670fcb69707292e355101be506c802705adb682be1"}},{"ruleId":"D2","level":"warning","message":{"text":"RemoteSessionInvocation.execute (cognitive 25): RemoteSessionInvocation.execute has cognitive complexity 25 (threshold 15). Drivers by points: if/else 9 (13 pts), ternaries 4 (8 pts), boolean chains 3, error handling 1 (nesting depth added 8). Of this number, 21 points are the body\u0027s own statements and 4 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":"packages/core/src/agents/remote-session-invocation.ts"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1c0e11398ddcef0345c25669a170fbd9aecb09076a7cca68a42e0f082ef2dfb"}},{"ruleId":"D2","level":"warning","message":{"text":"CodeAssistServer.generateContentStream (cognitive 25): CodeAssistServer.generateContentStream has cognitive complexity 25 (threshold 15). Drivers by points: if/else 6 (12 pts), boolean chains 7, loops 2 (4 pts), ternaries 2 (nesting depth added 8). Most of this is not in the body itself: 5 of the 25 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 134, 172). 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":"packages/core/src/code_assist/server.ts"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e91127a308e6a081e31b8e61342582aa78a7f0d32707b4435c60123edcc11ea"}},{"ruleId":"D2","level":"warning","message":{"text":"ContextCompressionService.applyCompressionDecision (cognitive 25): ContextCompressionService.applyCompressionDecision has cognitive complexity 25 (threshold 15). Drivers by points: if/else 17 (20 pts), boolean chains 5 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/context/contextCompressionService.ts"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4c9f78c7de0c8cd3b5e3627c58285a66541d6e9b811240a2dd95acd3303a9a2"}},{"ruleId":"D2","level":"warning","message":{"text":"ToolExecutor.execute (cognitive 25): ToolExecutor.execute has cognitive complexity 25 (threshold 15). Drivers by points: if/else 10 (12 pts), ternaries 4 (7 pts), boolean chains 5, error handling 1 (nesting depth added 5). Most of this is not in the body itself: 4 of the 25 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 96, 102). 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":"packages/core/src/scheduler/tool-executor.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f4dd14d6425eb7e757bae45ea235bcf8057b3cf289c34dc9151beb577289514"}},{"ruleId":"D2","level":"warning","message":{"text":"GlobToolInvocation.execute (cognitive 25): GlobToolInvocation.execute has cognitive complexity 25 (threshold 15). Drivers by points: if/else 11 (15 pts), error handling 4 (5 pts), ternaries 1 (3 pts), boolean chains 1, loops 1 (nesting depth added 7). Of this number, 24 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":"packages/core/src/tools/glob.ts"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad6f920f57de6ec418fad41c0de151ae58cbe51655103d67ec764c20c3ef7afd"}},{"ruleId":"D2","level":"warning","message":{"text":"LSToolInvocation.execute (cognitive 25): LSToolInvocation.execute has cognitive complexity 25 (threshold 15). Drivers by points: if/else 12 (14 pts), ternaries 3 (5 pts), error handling 2 (3 pts), boolean chains 2, loops 1 (nesting depth added 5). Of this number, 19 points are the body\u0027s own statements and 6 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":"packages/core/src/tools/ls.ts"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfa0af27b0f8943ceeb17cf611f82e635e6318d7573fc624d855f63d4cc99713"}},{"ruleId":"D2","level":"warning","message":{"text":"ShellToolInvocation.simplifyPaths (cognitive 25): ShellToolInvocation.simplifyPaths has cognitive complexity 25 (threshold 15). Drivers by points: if/else 10 (17 pts), loops 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":"packages/core/src/tools/shell.ts"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"99fb3113a2b9e40f413929568b832e2792df7446ed3e9cdb0277a935007632ff"}},{"ruleId":"D2","level":"warning","message":{"text":"fileUtils.processSingleFileContent (cognitive 25): fileUtils.processSingleFileContent has cognitive complexity 25 (threshold 15). Drivers by points: if/else 11 (18 pts), boolean chains 3, ternaries 1 (2 pts), error handling 1, match/switch 1 (nesting depth added 8). Of this number, 23 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":"packages/core/src/utils/fileUtils.ts"},"region":{"startLine":492}}}],"partialFingerprints":{"codehealthFindingId/v1":"68d19f2675fc232b3047d7ce04bc0c092584a6254190f05390c919b482177cba"}},{"ruleId":"D2","level":"warning","message":{"text":"memoryDiscovery.loadJitSubdirectoryMemory (cognitive 25): memoryDiscovery.loadJitSubdirectoryMemory has cognitive complexity 25 (threshold 15). Drivers by points: if/else 9 (14 pts), error handling 2 (4 pts), loops 3 (4 pts), boolean chains 2, ternaries 1 (nesting depth added 8). 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":"packages/core/src/utils/memoryDiscovery.ts"},"region":{"startLine":512}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f531b6e4db46f2a8e22bf6ed36516097ebb4e0845a9868b663f4e283316dc92"}},{"ruleId":"D2","level":"warning","message":{"text":"shell-utils.collectCommandDetails (cognitive 25): shell-utils.collectCommandDetails has cognitive complexity 25 (threshold 15). Drivers by points: if/else 5 (17 pts), loops 3 (7 pts), boolean chains 1 (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/shell-utils.ts"},"region":{"startLine":381}}}],"partialFingerprints":{"codehealthFindingId/v1":"b51bde9ba29941ea8dc0915921dc715e2cefa65cb7c0fc2e83ac4f4ed9c14d1b"}},{"ruleId":"D2","level":"warning","message":{"text":"shell-utils.execStreaming (cognitive 25): shell-utils.execStreaming has cognitive complexity 25 (threshold 15). Drivers by points: if/else 14 (16 pts), boolean chains 3, ternaries 1 (3 pts), error handling 1 (2 pts), loops 1 (nesting depth added 5). Most of this is not in the body itself: 9 of the 25 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 1035, 989, 1001). 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":"packages/core/src/utils/shell-utils.ts"},"region":{"startLine":953}}}],"partialFingerprints":{"codehealthFindingId/v1":"41a9e9184d79bd1a980bde1e5000756503b6696b485b88c6186fbd77672e8a1b"}},{"ruleId":"D2","level":"warning","message":{"text":"tool-utils.doesToolInvocationMatch (cognitive 25): tool-utils.doesToolInvocationMatch has cognitive complexity 25 (threshold 15). Drivers by points: if/else 12 (23 pts), boolean chains 1, 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":"packages/core/src/utils/tool-utils.ts"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"c84b1d4baa5c4bfea3798be8765a515a85454ba9190497bbed2c483a91d8fe53"}},{"ruleId":"D2","level":"warning","message":{"text":"patch-comment.main (cognitive 25): patch-comment.main has cognitive complexity 25 (threshold 15). Drivers by points: boolean chains 14, if/else 9, ternaries 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":"scripts/releasing/patch-comment.js"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7a5336c916720059d43ae8a86dbe4cf253f1100123e484e4851c149c9267a58"}},{"ruleId":"D2","level":"warning","message":{"text":"github.isGitHubWebhookPayload (cognitive 25): github.isGitHubWebhookPayload has cognitive complexity 25 (threshold 15). Drivers by points: if/else 14 (17 pts), boolean chains 8 (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":"tools/caretaker-agent/cloudrun/ingestion-service/auth/github.ts"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"28de170555536e60179d3b7d9de809ac37c85f66f3e1acb0311921a4f99a630f"}},{"ruleId":"D2","level":"warning","message":{"text":"GeminiSandbox.ApplyBulkAcls (cognitive 24): GeminiSandbox.ApplyBulkAcls has cognitive complexity 24 (threshold 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":"packages/core/src/sandbox/windows/GeminiSandbox.cs"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e4c62f7a87f67627c880846c94fb785dd2c2c097359e8be619c0fe265a165b0"}},{"ruleId":"D2","level":"warning","message":{"text":"Task._handleToolConfirmationPart (cognitive 24): Task._handleToolConfirmationPart has cognitive complexity 24 (threshold 15). Drivers by points: if/else 16, boolean chains 4, ternaries 2 (3 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":"packages/a2a-server/src/agent/task.ts"},"region":{"startLine":943}}}],"partialFingerprints":{"codehealthFindingId/v1":"d878997809fb6718eccda207a90b28e3c4cdb8ed0b9dbddc12c7e92323754765"}},{"ruleId":"D2","level":"warning","message":{"text":"github.downloadFromGitHubRelease (cognitive 24): github.downloadFromGitHubRelease has cognitive complexity 24 (threshold 15). Drivers by points: if/else 11 (13 pts), error handling 4, boolean chains 3, loops 1 (3 pts), ternaries 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":"packages/cli/src/config/extensions/github.ts"},"region":{"startLine":320}}}],"partialFingerprints":{"codehealthFindingId/v1":"be8672a6edd681300ac9167234de41c60ea073ea8f7da524367b42c3d5037956"}},{"ruleId":"D2","level":"warning","message":{"text":"text-buffer.findNextWordAcrossLines (cognitive 24): text-buffer.findNextWordAcrossLines has cognitive complexity 24 (threshold 15). Drivers by points: if/else 8 (17 pts), boolean chains 3, loops 2 (3 pts), 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. This shape REPEATS in the file: one other method here (text-buffer.findNextBigWordAcrossLines) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/shared/text-buffer.ts"},"region":{"startLine":415}}}],"partialFingerprints":{"codehealthFindingId/v1":"e727634af589f08ff34835c31680d0f2dfce8ae2118d9777b687d7e17a0d315d"}},{"ruleId":"D2","level":"warning","message":{"text":"text-buffer.findNextBigWordAcrossLines (cognitive 24): text-buffer.findNextBigWordAcrossLines has cognitive complexity 24 (threshold 15). Drivers by points: if/else 8 (17 pts), boolean chains 3, loops 2 (3 pts), 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. This shape REPEATS in the file: one other method here (text-buffer.findNextWordAcrossLines) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/shared/text-buffer.ts"},"region":{"startLine":516}}}],"partialFingerprints":{"codehealthFindingId/v1":"075ccd506bfec78506efa73f362d11dbecdeb984aac0d1e63315ab1f91df1c67"}},{"ruleId":"D2","level":"warning","message":{"text":"usePhraseCycler.usePhraseCycler (cognitive 24): usePhraseCycler.usePhraseCycler has cognitive complexity 24 (threshold 15). Drivers by points: if/else 15, boolean chains 6, ternaries 3. Most of this is not in the body itself: 3 of the 24 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 52, 81, 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":"packages/cli/src/ui/hooks/usePhraseCycler.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"e16a1d7bebd020b437e6cc71916c3064a85ca127d4788f06771153b6b8f6df9b"}},{"ruleId":"D2","level":"warning","message":{"text":"keyBindings.loadCustomKeybindings (cognitive 24): keyBindings.loadCustomKeybindings has cognitive complexity 24 (threshold 15). Drivers by points: if/else 7 (13 pts), error handling 2 (4 pts), ternaries 1 (4 pts), loops 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":"packages/cli/src/ui/key/keyBindings.ts"},"region":{"startLine":717}}}],"partialFingerprints":{"codehealthFindingId/v1":"41085d77ac836e8ac5ff1baec6bb50271ce4326fd4ba1e1bf163695bd739f54f"}},{"ruleId":"D2","level":"warning","message":{"text":"textUtils.escapeAnsiCtrlCodes (cognitive 24): textUtils.escapeAnsiCtrlCodes has cognitive complexity 24 (threshold 15). Drivers by points: if/else 8 (17 pts), loops 2 (3 pts), ternaries 2 (3 pts), boolean chains 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/utils/textUtils.ts"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"741982e220e73e51172aa0cc2143b01441c7848149ce278c56534d5d57b803b6"}},{"ruleId":"D2","level":"warning","message":{"text":"memory.applyInboxPatch (cognitive 24): memory.applyInboxPatch has cognitive complexity 24 (threshold 15). Drivers by points: error handling 5 (7 pts), ternaries 3 (6 pts), if/else 5, loops 2 (3 pts), match/switch 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":"packages/core/src/commands/memory.ts"},"region":{"startLine":1189}}}],"partialFingerprints":{"codehealthFindingId/v1":"534d88d18dd6fb7d08faa89b25d08a41d4a76b798a78f4fd3bb4303521fb4256"}},{"ruleId":"D2","level":"warning","message":{"text":"memoryPatchUtils.applyParsedPatchesWithAllowedRoots (cognitive 24): memoryPatchUtils.applyParsedPatchesWithAllowedRoots has cognitive complexity 24 (threshold 15). Drivers by points: if/else 7 (13 pts), error handling 2 (6 pts), boolean chains 4, 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":"packages/core/src/services/memoryPatchUtils.ts"},"region":{"startLine":681}}}],"partialFingerprints":{"codehealthFindingId/v1":"b240b8a635f47eb2dbd1b9aa79ec6ec1a706a30291f09727936bf50414b3916b"}},{"ruleId":"D2","level":"warning","message":{"text":"GrepTool.validateToolParamValues (cognitive 24): GrepTool.validateToolParamValues has cognitive complexity 24 (threshold 15). Drivers by points: if/else 7 (11 pts), error handling 4 (7 pts), boolean chains 3, ternaries 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":"packages/core/src/tools/grep.ts"},"region":{"startLine":711}}}],"partialFingerprints":{"codehealthFindingId/v1":"9116d564489c75e85d85e6e8314dae55477f30890796543731002966b3ae8ecd"}},{"ruleId":"D2","level":"warning","message":{"text":"mcp-tool.extractToolExplanation (cognitive 24): mcp-tool.extractToolExplanation has cognitive complexity 24 (threshold 15). Drivers by points: if/else 7 (11 pts), ternaries 2 (9 pts), boolean chains 3, loops 1 (nesting depth added 11). 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, 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":"packages/core/src/tools/mcp-tool.ts"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"611636db7d4aaf048665a0bc75bdfae49e31a3ff5449774c2164b0a2299075f4"}},{"ruleId":"D2","level":"warning","message":{"text":"WebSearchToolInvocation.execute (cognitive 24): WebSearchToolInvocation.execute has cognitive complexity 24 (threshold 15). Drivers by points: if/else 6 (11 pts), boolean chains 6, loops 2 (6 pts), error handling 1 (nesting depth added 9). 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":"packages/core/src/tools/web-search.ts"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"918f04eb6723d0d9a642e0770c4f22268adce17dbf94b520a8c88cea37abca63"}},{"ruleId":"D2","level":"warning","message":{"text":"ExtensionLoader.stopExtension (cognitive 24): ExtensionLoader.stopExtension has cognitive complexity 24 (threshold 15). Drivers by points: if/else 7 (15 pts), loops 3 (8 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":"packages/core/src/utils/extensionLoader.ts"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"85926e0fdbb025980a3b528c6bd94b7e6b7ecaa8fa10c5eba142b7d92fdee949"}},{"ruleId":"D2","level":"warning","message":{"text":"historyHardening.refineToolResponses (cognitive 24): historyHardening.refineToolResponses has cognitive complexity 24 (threshold 15). Drivers by points: if/else 5 (19 pts), boolean chains 4, loops 1 (nesting depth added 14). Of this number, 14 points are the body\u0027s own statements and 10 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":"packages/core/src/utils/historyHardening.ts"},"region":{"startLine":291}}}],"partialFingerprints":{"codehealthFindingId/v1":"f55c9939fb1cc3099efe9ad8b075785347128335c908faea3bf379e0398450dd"}},{"ruleId":"D2","level":"warning","message":{"text":"dataset_metrics._validate_spec_integrity (cognitive 24): dataset_metrics._validate_spec_integrity has cognitive complexity 24 (threshold 15). Drivers by points: if/else 9 (19 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":"tools/caretaker-agent/evals/triage/tools/dataset_metrics.py"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"72af4e49aa8a884190b76a55f2b87c19f2295e261c6ef235bf8018a6d971b3a9"}},{"ruleId":"D2","level":"warning","message":{"text":"GCSTaskStore.save (cognitive 23): GCSTaskStore.save has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (16 pts), error handling 3 (7 pts) (nesting depth added 11). Of this number, 20 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":"packages/a2a-server/src/persistence/gcs.ts"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"5891f781146fca57b0261bbcae39b8ec19a20f90119a1773ab8d901953644834"}},{"ruleId":"D2","level":"warning","message":{"text":"mcpCommand.handleEnableDisable (cognitive 23): mcpCommand.handleEnableDisable has cognitive complexity 23 (threshold 15). Drivers by points: if/else 13 (17 pts), boolean chains 3, 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, 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":"packages/cli/src/ui/commands/mcpCommand.ts"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6a510d3507cd30b4ca26f64982c5059037cfda58e5ad3a7328166f1fb0cc4ed"}},{"ruleId":"D2","level":"warning","message":{"text":"ColorsDisplay.ColorsDisplay (cognitive 23): ColorsDisplay.ColorsDisplay has cognitive complexity 23 (threshold 15). Drivers by points: if/else 10 (15 pts), boolean chains 4, ternaries 2 (3 pts), loops 1 (nesting depth added 6). Most of this is not in the body itself: 3 of the 23 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 100, 193). 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":"packages/cli/src/ui/components/ColorsDisplay.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"846b2d53cf8dea1abc494323f331b69dbebdb0112672bf297b626b5e4e319b34"}},{"ruleId":"D2","level":"warning","message":{"text":"sandboxUtils.entrypoint (cognitive 23): sandboxUtils.entrypoint has cognitive complexity 23 (threshold 15). Drivers by points: if/else 7 (11 pts), ternaries 4 (6 pts), loops 2 (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":"packages/cli/src/utils/sandboxUtils.ts"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"162bd16c229193e8d570d23ef55afedf0909ea84f51e8d0b1a96d2d00173334b"}},{"ruleId":"D2","level":"warning","message":{"text":"Config.refreshUserQuota (cognitive 23): Config.refreshUserQuota has cognitive complexity 23 (threshold 15). Drivers by points: if/else 8 (16 pts), boolean chains 4, loops 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":"packages/core/src/config/config.ts"},"region":{"startLine":2305}}}],"partialFingerprints":{"codehealthFindingId/v1":"79f0eeb78e539aeb1046e47bce5922695deebabe8dbe72d61a443c1cb940d866"}},{"ruleId":"D2","level":"warning","message":{"text":"Scheduler._execute (cognitive 23): Scheduler._execute has cognitive complexity 23 (threshold 15). Drivers by points: if/else 11 (13 pts), boolean chains 6, error handling 1 (2 pts), ternaries 1 (2 pts) (nesting depth added 4). Of this number, 21 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, 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":"packages/core/src/scheduler/scheduler.ts"},"region":{"startLine":730}}}],"partialFingerprints":{"codehealthFindingId/v1":"5183fd408457c87c88f93321e9f39473f663cb51c0086192eced82c5ecea05d6"}},{"ruleId":"D2","level":"warning","message":{"text":"ShellExecutionService.closeOrphanSlaveFd (cognitive 23): ShellExecutionService.closeOrphanSlaveFd has cognitive complexity 23 (threshold 15). Drivers by points: if/else 7 (12 pts), error handling 4 (7 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":"packages/core/src/services/shellExecutionService.ts"},"region":{"startLine":1009}}}],"partialFingerprints":{"codehealthFindingId/v1":"0240bc50e56d9f6aca41ae30c0265127d1bbfd84992fab8d0afaa5750571be0f"}},{"ruleId":"D2","level":"warning","message":{"text":"edit.calculateFuzzyReplacement (cognitive 23): edit.calculateFuzzyReplacement has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (14 pts), loops 3 (4 pts), ternaries 1 (3 pts), boolean chains 2 (nesting depth added 8). 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, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/edit.ts"},"region":{"startLine":1366}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf3858bd55f1e2855571081894b039ec4e87c93ed010684ec044ad4f7fc4e1b7"}},{"ruleId":"D2","level":"warning","message":{"text":"McpClient.refreshTools (cognitive 23): McpClient.refreshTools has cognitive complexity 23 (threshold 15). Drivers by points: if/else 4 (8 pts), boolean chains 6, loops 3 (6 pts), error handling 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":"packages/core/src/tools/mcp-client.ts"},"region":{"startLine":696}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d5f6735925ef81df2c231b373a3ce2a5e07887f96dbd244c9dd3de6c0e8ab1a"}},{"ruleId":"D2","level":"warning","message":{"text":"tool-names.isValidToolName (cognitive 23): tool-names.isValidToolName has cognitive complexity 23 (threshold 15). Drivers by points: if/else 11 (20 pts), boolean chains 3 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/tool-names.ts"},"region":{"startLine":303}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb7a5db36c729479dd3b47b588d2dd96b6a03ed76ea59cc9c60b6a4d8a54d58c"}},{"ruleId":"D2","level":"warning","message":{"text":"googleErrors.fromGaxiosError (cognitive 23): googleErrors.fromGaxiosError has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (18 pts), error handling 1 (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":"packages/core/src/utils/googleErrors.ts"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4e1f6d72510665a9ef405317ad751c22b9d79e33e5cec1c95c0a77b7a54bb2d"}},{"ruleId":"D2","level":"warning","message":{"text":"lint.runSensitiveKeywordLinter (cognitive 23): lint.runSensitiveKeywordLinter has cognitive complexity 23 (threshold 15). Drivers by points: if/else 4 (11 pts), loops 3 (7 pts), error handling 2 (3 pts), boolean chains 2 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lint.js"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"d62473c19c3a9a8ed04ef07e1c89878c0691f9e7d84167bc8f4bcdb738624516"}},{"ruleId":"D2","level":"warning","message":{"text":"update.handleUpdate (cognitive 22): update.handleUpdate has cognitive complexity 22 (threshold 15). Drivers by points: if/else 10 (18 pts), error handling 2 (4 pts) (nesting depth added 10). 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 into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/commands/extensions/update.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"74d3be1988176c0b0768d86f7e7e585904c6181aba4243f65d825e9c19c85f8f"}},{"ruleId":"D2","level":"warning","message":{"text":"ContextSummaryDisplay.ContextSummaryDisplay (cognitive 22): ContextSummaryDisplay.ContextSummaryDisplay has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (10 pts), ternaries 6 (7 pts), boolean chains 5 (nesting depth added 2). Most of this is not in the body itself: 4 of the 22 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 68, 57, 48, \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":"packages/cli/src/ui/components/ContextSummaryDisplay.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d747bcbf73a191ade21e1a05a4ebc9b96c224bdb7def6ebe62827d6327715b8"}},{"ruleId":"D2","level":"warning","message":{"text":"MaxSizedBox.MaxSizedBox (cognitive 22): MaxSizedBox.MaxSizedBox has cognitive complexity 22 (threshold 15). Drivers by points: boolean chains 10, if/else 6 (7 pts), ternaries 5 (nesting depth added 1). Of this number, 15 points are the body\u0027s own statements and 7 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":"packages/cli/src/ui/components/shared/MaxSizedBox.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"0569fbad59ee627dab8956fe4e78fd80dcbe39d1a66c86bba0acbb9ce7e698ae"}},{"ruleId":"D2","level":"warning","message":{"text":"useApprovalModeIndicator.useApprovalModeIndicator (cognitive 22): useApprovalModeIndicator.useApprovalModeIndicator has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (15 pts), boolean chains 3, error handling 1 (2 pts), match/switch 1 (2 pts) (nesting depth added 10). 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 42). 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":"packages/cli/src/ui/hooks/useApprovalModeIndicator.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"35eecbc4d4d8d21bc82f483db0d09b021cc4fa2b7e6e3f42a72ce24c214cb99d"}},{"ruleId":"D2","level":"warning","message":{"text":"formatters.formatResetTime (cognitive 22): formatters.formatResetTime has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (10 pts), ternaries 4 (9 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":"packages/cli/src/ui/utils/formatters.ts"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"f22bdc26ee2c8cd320d31749fa9c3655a260759d8c9fcd17f91ead5c0eb9e32d"}},{"ruleId":"D2","level":"warning","message":{"text":"sandboxUtils.isSensitiveHostPath (cognitive 22): sandboxUtils.isSensitiveHostPath has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (10 pts), boolean chains 8, ternaries 3, error handling 1 (nesting depth added 2). 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: 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":"packages/cli/src/utils/sandboxUtils.ts"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff6bcc921e8d99f25991f46de1579bf6bcfd27c895144b795a8a9cbaf3043fc0"}},{"ruleId":"D2","level":"warning","message":{"text":"content-utils.geminiPartsToContentParts (cognitive 22): content-utils.geminiPartsToContentParts has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (11 pts), boolean chains 6, ternaries 1 (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":"packages/core/src/agent/content-utils.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ec2d640973660a255f422a57582d56531e593e1af2cf0c68640d87e98d79ee1"}},{"ruleId":"D2","level":"warning","message":{"text":"A2AAuthProviderFactory.findMatchingScheme (cognitive 22): A2AAuthProviderFactory.findMatchingScheme has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (18 pts), match/switch 1 (2 pts), boolean chains 1, loops 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/agents/auth-provider/factory.ts"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4cb68560f1d23f40ca42b6242064df81e7a9b1b8a3bce201fdbe2f0bca23553"}},{"ruleId":"D2","level":"warning","message":{"text":"truncation.normalizeFunctionResponse (cognitive 22): truncation.normalizeFunctionResponse has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (18 pts), boolean chains 3, loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/context/truncation.ts"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"98c477789c9192f80ffe8cb17fd33d734ba90dcba1462c5a400448fafbf8bf6c"}},{"ruleId":"D2","level":"warning","message":{"text":"TrustedHooksManager.getUntrustedHooks (cognitive 22): TrustedHooksManager.getUntrustedHooks has cognitive complexity 22 (threshold 15). Drivers by points: if/else 4 (13 pts), loops 3 (6 pts), boolean chains 3 (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":"packages/core/src/hooks/trustedHooks.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"32108b2f5996c697b48bc506652accb807706bfde125dda613e330ab005fd404"}},{"ruleId":"D2","level":"warning","message":{"text":"stable-stringify.stableStringify (cognitive 22): stable-stringify.stableStringify has cognitive complexity 22 (threshold 15). Drivers by points: if/else 11 (16 pts), boolean chains 3, error handling 1 (2 pts), loops 1 (nesting depth added 6). Most of this is not in the body itself: 0 of the 22 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 60, 106). 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":"packages/core/src/policy/stable-stringify.ts"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf53d19fc05fe105970bf045c22e2d3dda62ce70b71f9876feb0313be5615d97"}},{"ruleId":"D2","level":"warning","message":{"text":"confirmation.resolveConfirmation (cognitive 22): confirmation.resolveConfirmation has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (16 pts), boolean chains 3, ternaries 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":"packages/core/src/scheduler/confirmation.ts"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e3dd1cbf783590c1c9731e6b6e7cb53e4ecd5d8647bd4d0855bbbda7fb6cf2c"}},{"ruleId":"D2","level":"warning","message":{"text":"shellExecutionService.getFullBufferText (cognitive 22): shellExecutionService.getFullBufferText has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (13 pts), ternaries 2 (5 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":"packages/core/src/services/shellExecutionService.ts"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"701c1b96df3faedbc672a4ca37a2671a399e30a25755d12f875f69727df6d0a7"}},{"ruleId":"D2","level":"warning","message":{"text":"RecursiveFileSearch.handleFileWatcherEvent (cognitive 22): RecursiveFileSearch.handleFileWatcherEvent has cognitive complexity 22 (threshold 15). Drivers by points: if/else 5 (9 pts), boolean chains 4, loops 2 (4 pts), ternaries 2 (4 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":"packages/core/src/utils/filesearch/fileSearch.ts"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"515566170f5f8723f16d1e8a0724323fba0e9e49ee4f10eb5571f37b58db3925"}},{"ruleId":"D2","level":"warning","message":{"text":"memoryDiscovery.deduplicatePathsByFileIdentity (cognitive 22): memoryDiscovery.deduplicatePathsByFileIdentity has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (12 pts), loops 3 (4 pts), ternaries 1 (3 pts), error handling 1 (2 pts), boolean chains 1 (nesting depth added 9). Of this number, 17 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":"packages/core/src/utils/memoryDiscovery.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6b83eac026c1ff8056016c6335fcff88cb9b492fe5444de70022d9bdfbe7491"}},{"ruleId":"D2","level":"warning","message":{"text":"pathReader.readPathFromWorkspace (cognitive 22): pathReader.readPathFromWorkspace has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (15 pts), loops 2 (4 pts), error handling 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":"packages/core/src/utils/pathReader.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"a06fe9fea47f00ff91921ef2ab3f708a92925ff7876dac8994ceb679e93003f0"}},{"ruleId":"D2","level":"warning","message":{"text":"shell-utils.hasRedirection (cognitive 22): shell-utils.hasRedirection has cognitive complexity 22 (threshold 15). Drivers by points: if/else 6 (12 pts), loops 2 (5 pts), boolean chains 3, ternaries 1 (2 pts) (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/shell-utils.ts"},"region":{"startLine":751}}}],"partialFingerprints":{"codehealthFindingId/v1":"d19e87762f9771d2ac0817781d058b7899d5177270fcc3f500a907bd61df7c2e"}},{"ruleId":"D2","level":"warning","message":{"text":"shell-utils.stripShellWrapper (cognitive 22): shell-utils.stripShellWrapper has cognitive complexity 22 (threshold 15). Drivers by points: if/else 6 (12 pts), boolean chains 6, error handling 1 (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":"packages/core/src/utils/shell-utils.ts"},"region":{"startLine":842}}}],"partialFingerprints":{"codehealthFindingId/v1":"01b4e47377ab154d03f48e41cc886798d14ad6844ab0cb73a120a6702de977e9"}},{"ruleId":"D2","level":"warning","message":{"text":"main.main (cognitive 22): main.main has cognitive complexity 22 (threshold 15). Drivers by points: if/else 10 (13 pts), error handling 5 (6 pts), 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":"tools/caretaker-agent/cloudrun/triage-worker/main.py"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8ad7e5728f4790f6ab95455bf53e9d0af30757f0887f7d1808e367f097c3d8b"}},{"ruleId":"D2","level":"warning","message":{"text":"config.setTargetDir (cognitive 21): config.setTargetDir has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (13 pts), boolean chains 5, error handling 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":"packages/a2a-server/src/config/config.ts"},"region":{"startLine":469}}}],"partialFingerprints":{"codehealthFindingId/v1":"b61c4fc0781854684ec4f0f175ba7841e42f6e7ab1bedcb19c66ddbf5c6ac76f"}},{"ruleId":"D2","level":"warning","message":{"text":"logs.readLastLines (cognitive 21): logs.readLastLines has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (12 pts), boolean chains 4, loops 2 (3 pts), ternaries 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":"packages/cli/src/commands/gemma/logs.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a5eb50e2f5b1d2417739fb6efd80ffde60f8ae7e08d6e707cffed315a12b91c"}},{"ruleId":"D2","level":"warning","message":{"text":"extensionSettings.maybePromptForSettings (cognitive 21): extensionSettings.maybePromptForSettings has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (12 pts), boolean chains 5, loops 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":"packages/cli/src/config/extensions/extensionSettings.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"08f2b46fa8286706647ebe1cfa66903bbc20d6fb1287583056088f9ef3bc7dcb"}},{"ruleId":"D2","level":"warning","message":{"text":"ToolGroupDisplay.ToolDisplayMessage (cognitive 21): ToolGroupDisplay.ToolDisplayMessage has cognitive complexity 21 (threshold 15). Drivers by points: boolean chains 17, if/else 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":"packages/cli/src/ui/components/messages/ToolGroupDisplay.tsx"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0ccfbc9d84869f28b28ea75e6de4ffe856fe898a702126c63e0dce06dc276cc"}},{"ruleId":"D2","level":"warning","message":{"text":"useSuspend.useSuspend (cognitive 21): useSuspend.useSuspend has cognitive complexity 21 (threshold 15). Drivers by points: if/else 13 (21 pts) (nesting depth added 8). 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 55, 85, 42). 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":"packages/cli/src/ui/hooks/useSuspend.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"e128c226b68094527ea2516cbb6dce72524512fa6fbc7310bf84fb012fab3c4a"}},{"ruleId":"D2","level":"warning","message":{"text":"memory.applyMemoryPatchFile (cognitive 21): memory.applyMemoryPatchFile has cognitive complexity 21 (threshold 15). Drivers by points: error handling 5 (7 pts), ternaries 3 (5 pts), if/else 4, loops 2 (3 pts), match/switch 1 (2 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/commands/memory.ts"},"region":{"startLine":782}}}],"partialFingerprints":{"codehealthFindingId/v1":"adee701015726d1b1116bb9f0e593c842576787cdb4215205520f21d77d9786a"}},{"ruleId":"D2","level":"warning","message":{"text":"toGraph.getStableId (cognitive 21): toGraph.getStableId has cognitive complexity 21 (threshold 15). Drivers by points: if/else 17 (20 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":"packages/core/src/context/graph/toGraph.ts"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc60c3f14ade8c22cd9d2ef45a0a979d2b5874993329b3d00c0d26dffea7478e"}},{"ruleId":"D2","level":"warning","message":{"text":"GeminiChat.ensureActiveLoopHasThoughtSignatures (cognitive 21): GeminiChat.ensureActiveLoopHasThoughtSignatures has cognitive complexity 21 (threshold 15). Drivers by points: if/else 5 (14 pts), loops 3 (5 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":"packages/core/src/core/geminiChat.ts"},"region":{"startLine":1262}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f89e9f57cd78ca86f1c7134d1b83f44e72763bec066fcd90814fbc0e6cc2604"}},{"ruleId":"D2","level":"warning","message":{"text":"handler.handleFallback (cognitive 21): handler.handleFallback has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (11 pts), boolean chains 5, ternaries 2 (4 pts), error handling 1 (nesting depth added 5). 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 into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/fallback/handler.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e1a34178943feec25ab654ff168361d36d73503be8175f953762e9515db22e2"}},{"ruleId":"D2","level":"warning","message":{"text":"ChatRecordingService.recordToolCalls (cognitive 21): ChatRecordingService.recordToolCalls has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (13 pts), boolean chains 5, loops 1 (2 pts), error handling 1 (nesting depth added 6). 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":"packages/core/src/services/chatRecordingService.ts"},"region":{"startLine":775}}}],"partialFingerprints":{"codehealthFindingId/v1":"49b00b413a435fb74c056bcf2a57c1fe98c7728d5a50552541e6f71fedc289c0"}},{"ruleId":"D2","level":"warning","message":{"text":"McpClient.refreshPrompts (cognitive 21): McpClient.refreshPrompts has cognitive complexity 21 (threshold 15). Drivers by points: if/else 4 (8 pts), loops 3 (6 pts), boolean chains 4, error handling 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":"packages/core/src/tools/mcp-client.ts"},"region":{"startLine":597}}}],"partialFingerprints":{"codehealthFindingId/v1":"a21ab2988c6cafdacf5ae16059572047205701a19e7d9c741edd6e07da421b11"}},{"ruleId":"D2","level":"warning","message":{"text":"GrepToolInvocation.execute (cognitive 21): GrepToolInvocation.execute has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (10 pts), boolean chains 4, error handling 4, ternaries 2 (3 pts) (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/ripGrep.ts"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"3dbfc537c8a6cd09506789e27e7e69902f589602b4f8439937d2677a86dcae2a"}},{"ruleId":"D2","level":"warning","message":{"text":"WriteFileTool.validateToolParamValues (cognitive 21): WriteFileTool.validateToolParamValues has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (8 pts), ternaries 3 (8 pts), error handling 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":"packages/core/src/tools/write-file.ts"},"region":{"startLine":616}}}],"partialFingerprints":{"codehealthFindingId/v1":"5187b478ba77c4901ff80133f709c5520051fca3c1704d93326a9b6d241c6427"}},{"ruleId":"D2","level":"warning","message":{"text":"fileUtils.detectFileType (cognitive 21): fileUtils.detectFileType has cognitive complexity 21 (threshold 15). Drivers by points: if/else 11 (17 pts), ternaries 1 (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":"packages/core/src/utils/fileUtils.ts"},"region":{"startLine":414}}}],"partialFingerprints":{"codehealthFindingId/v1":"0672543bdbb04cf34a723fa3ed3b724921caba7869e893fbc82bca8f12a3458b"}},{"ruleId":"D2","level":"warning","message":{"text":"lint.runGithubActionsPinningLinter (cognitive 21): lint.runGithubActionsPinningLinter has cognitive complexity 21 (threshold 15). Drivers by points: if/else 6 (15 pts), loops 2 (3 pts), boolean chains 2, 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":"scripts/lint.js"},"region":{"startLine":397}}}],"partialFingerprints":{"codehealthFindingId/v1":"be22ab6a823ff6a235270ca9c8e22c03c22fbdb7ab3fa4b7829f8fa38ef8d57a"}},{"ruleId":"D2","level":"warning","message":{"text":"CommandExecutor.run (cognitive 21): CommandExecutor.run has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (14 pts), boolean chains 2, loops 1 (2 pts), ternaries 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":"tools/caretaker-agent/cloudrun/pr-generator/workflow/command_executor.py"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2244433715c6339dee2452ca1879da17af565fbe2da59284e71cb338ef774ba"}},{"ruleId":"D2","level":"warning","message":{"text":"GeminiSandbox.QuoteArgument (cognitive 20): GeminiSandbox.QuoteArgument has cognitive complexity 20 (threshold 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":"packages/core/src/sandbox/windows/GeminiSandbox.cs"},"region":{"startLine":526}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d40bec2487cd90faff3ac1ee8ee6e1365c3fb508aefb864103db89eb2911631"}},{"ruleId":"D2","level":"warning","message":{"text":"validate.validateExtension (cognitive 20): validate.validateExtension has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (12 pts), loops 3 (6 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":"packages/cli/src/commands/extensions/validate.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cf61ba7024ba5dca48190fe39828b1110bed08a07cc6d862d533ca0c46191a9"}},{"ruleId":"D2","level":"warning","message":{"text":"extensionSettings.updateSetting (cognitive 20): extensionSettings.updateSetting has cognitive complexity 20 (threshold 15). Drivers by points: if/else 11 (14 pts), error handling 1 (3 pts), boolean chains 2, loops 1 (nesting depth added 5). 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: 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":"packages/cli/src/config/extensions/extensionSettings.ts"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"41ce69b7989eee2d4129f3e40ba514628cfa079a8029a791d9e03339ab7fa0a5"}},{"ruleId":"D2","level":"warning","message":{"text":"McpPromptLoader.parseArgs (cognitive 20): McpPromptLoader.parseArgs has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (14 pts), loops 4 (5 pts), boolean chains 1 (nesting depth added 6). 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":"packages/cli/src/services/McpPromptLoader.ts"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdff27a6cdb97d87c4d1e9ef0d35c6c0937b33222766bc77a838462e0432c7e5"}},{"ruleId":"D2","level":"warning","message":{"text":"useAuth.useAuthCommand (cognitive 20): useAuth.useAuthCommand has cognitive complexity 20 (threshold 15). Drivers by points: if/else 14 (17 pts), boolean chains 1, error handling 1, ternaries 1 (nesting depth added 3). Most of this is not in the body itself: 1 of the 20 points is its own statement and the rest belongs to 4 function literals inside it that branch (lines 89, 59, 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":"packages/cli/src/ui/auth/useAuth.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbe2f4b6e148cddc431abe0f987b9c5492de1622e06a13e6b15bb22d51fa6bbd"}},{"ruleId":"D2","level":"warning","message":{"text":"extensionsCommand.restartAction (cognitive 20): extensionsCommand.restartAction has cognitive complexity 20 (threshold 15). Drivers by points: if/else 11 (14 pts), boolean chains 2, error handling 1 (2 pts), ternaries 2 (nesting depth added 4). 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: 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":"packages/cli/src/ui/commands/extensionsCommand.ts"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e1640e77b9bf87e2ee12140a9b4a22cf601aeb93219df823aed1ef9b51fe5f5"}},{"ruleId":"D2","level":"warning","message":{"text":"Composer.Composer (cognitive 20): Composer.Composer has cognitive complexity 20 (threshold 15). Drivers by points: boolean chains 16, if/else 3, ternaries 1. Of this number, 17 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":"packages/cli/src/ui/components/Composer.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"1146ac225a5c02b8c2bc5110cfeb8d9d401dde101bdf9a10f0a390b6812de72a"}},{"ruleId":"D2","level":"warning","message":{"text":"ScrollableList.ScrollableList (cognitive 20): ScrollableList.ScrollableList has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (11 pts), ternaries 3 (5 pts), boolean chains 4 (nesting depth added 3). Most of this is not in the body itself: 0 of the 20 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 200, 113, 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":"packages/cli/src/ui/components/shared/ScrollableList.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"82882b8f31a85c3b8c08ad6ab0b9bbcbc2905ac9ccf58c0b509a7de8e6030c91"}},{"ruleId":"D2","level":"warning","message":{"text":"SearchableList.SearchableList (cognitive 20): SearchableList.SearchableList has cognitive complexity 20 (threshold 15). Drivers by points: boolean chains 8, if/else 6, ternaries 5 (6 pts) (nesting depth added 1). Of this number, 11 points are the body\u0027s own statements and 9 belong to 4 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":"packages/cli/src/ui/components/shared/SearchableList.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"14263470ff37b8dc75d0c3a71f8e1fe7bed33db65e4d633e53c24c6fc6925dd2"}},{"ruleId":"D2","level":"warning","message":{"text":"text-buffer.calculateTransformedLine (cognitive 20): text-buffer.calculateTransformedLine has cognitive complexity 20 (threshold 15). Drivers by points: loops 5 (10 pts), ternaries 2 (6 pts), if/else 2 (3 pts), boolean chains 1 (nesting depth added 10). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/shared/text-buffer.ts"},"region":{"startLine":1170}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c0e084f83e2e3affc04dc134d1bafa23ab6bbf45af37f09b8f3f5835f8eae32"}},{"ruleId":"D2","level":"warning","message":{"text":"KeypressContext.KeypressProvider (cognitive 20): KeypressContext.KeypressProvider has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (14 pts), loops 2 (3 pts), ternaries 2 (3 pts) (nesting depth added 6). Most of this is not in the body itself: 0 of the 20 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 834, 790, 816, \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":"packages/cli/src/ui/contexts/KeypressContext.tsx"},"region":{"startLine":769}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac7a257be073458eb1e2312ee5cf3b290ad9a3dfb06981d0a1f1e284e1a16f9f"}},{"ruleId":"D2","level":"warning","message":{"text":"useSelectionList.findNextValidIndex (cognitive 20): useSelectionList.findNextValidIndex has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 4, loops 1, ternaries 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":"packages/cli/src/ui/hooks/useSelectionList.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"acf62def5c4522dee3450d43e61baf3025b95191231162ef292e8083283926b7"}},{"ruleId":"D2","level":"warning","message":{"text":"useShellCompletion.scanPathExecutables (cognitive 20): useShellCompletion.scanPathExecutables has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (10 pts), loops 3 (5 pts), boolean chains 2, error handling 2, ternaries 1 (nesting depth added 5). Of this number, 10 points are the body\u0027s own statements and 10 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":"packages/cli/src/ui/hooks/useShellCompletion.ts"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"033d9339fcdeeb03d2ff0bc59498b87ce5a6601862ea2044823045d82a71b3ec"}},{"ruleId":"D2","level":"warning","message":{"text":"useTabbedNavigation.tabbedNavigationReducer (cognitive 20): useTabbedNavigation.tabbedNavigationReducer has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (16 pts), ternaries 1 (2 pts), boolean chains 1, match/switch 1 (nesting depth added 9). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/hooks/useTabbedNavigation.ts"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"1464949e5ece8f8742bce51210e15a7f6735b2087fd6c35d0c77349270b2e1f3"}},{"ruleId":"D2","level":"warning","message":{"text":"TableRenderer.TableRenderer (cognitive 20): TableRenderer.TableRenderer has cognitive complexity 20 (threshold 15). Drivers by points: boolean chains 8, if/else 4 (5 pts), ternaries 3 (4 pts), loops 3 (nesting depth added 2). Most of this is not in the body itself: 0 of the 20 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 95, 183, 289, \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":"packages/cli/src/ui/utils/TableRenderer.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"2421f48f0bb83a90ca61a53e56ea03be87d405b299d570a05750f00566ace762"}},{"ruleId":"D2","level":"warning","message":{"text":"logCleanup.cleanupBackgroundLogs (cognitive 20): logCleanup.cleanupBackgroundLogs has cognitive complexity 20 (threshold 15). Drivers by points: if/else 5 (12 pts), error handling 3 (5 pts), boolean chains 2, loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/utils/logCleanup.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"4240bfc6b4af829d87231d05571aac044faed907b76fd84899f105b1dcef8c0d"}},{"ruleId":"D2","level":"warning","message":{"text":"AnalyzeScreenshotInvocation.execute (cognitive 20): AnalyzeScreenshotInvocation.execute has cognitive complexity 20 (threshold 15). Drivers by points: ternaries 6 (8 pts), if/else 4 (6 pts), boolean chains 3, loops 1 (2 pts), error handling 1 (nesting depth added 5). 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 into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/agents/browser/analyzeScreenshot.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"da8f85974c64579c06c49e74c182b4ce93a9159685605575127bbe4d175ee2d6"}},{"ruleId":"D2","level":"warning","message":{"text":"BrowserManager.callTool (cognitive 20): BrowserManager.callTool has cognitive complexity 20 (threshold 15). Drivers by points: if/else 11 (16 pts), boolean chains 2, error handling 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":"packages/core/src/agents/browser/browserManager.ts"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"452f2cc80c9486c028a8ee553787167e80c5ab95b89514bbc53dcaccd4027fe5"}},{"ruleId":"D2","level":"warning","message":{"text":"IdeClient.connect (cognitive 20): IdeClient.connect has cognitive complexity 20 (threshold 15). Drivers by points: if/else 11 (19 pts), ternaries 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/ide/ide-client.ts"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cfe5b6b99745adaa2b6e8f45c7f59614fc221891720f579731c890911768a88"}},{"ruleId":"D2","level":"warning","message":{"text":"OAuthUtils.discoverOAuthConfig (cognitive 20): OAuthUtils.discoverOAuthConfig has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (17 pts), boolean chains 2, 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":"packages/core/src/mcp/oauth-utils.ts"},"region":{"startLine":404}}}],"partialFingerprints":{"codehealthFindingId/v1":"e38a0dc88909d57a89a91c4a74e65356562a15746ffe849347cfc21b4dd2d417"}},{"ruleId":"D2","level":"warning","message":{"text":"FolderTrustDiscoveryService.discoverSettings (cognitive 20): FolderTrustDiscoveryService.discoverSettings has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (11 pts), loops 2 (5 pts), ternaries 1 (2 pts), boolean chains 1, 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":"packages/core/src/services/FolderTrustDiscoveryService.ts"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae3f5e8e0e54202243de0a68acb737a0e06b140c3d6e71ec8fab35c26a17e18b"}},{"ruleId":"D2","level":"warning","message":{"text":"memoryService.validatePatches (cognitive 20): memoryService.validatePatches has cognitive complexity 20 (threshold 15). Drivers by points: if/else 5 (9 pts), error handling 3 (6 pts), match/switch 1 (4 pts), loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/services/memoryService.ts"},"region":{"startLine":856}}}],"partialFingerprints":{"codehealthFindingId/v1":"133d3b64545c83a5821f238cbf0387983ec1893a6382ab9cf6fd3f980d8550fa"}},{"ruleId":"D2","level":"warning","message":{"text":"sessionScratchpadUtils.tokenizeShellCommand (cognitive 20): sessionScratchpadUtils.tokenizeShellCommand has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (16 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":"packages/core/src/services/sessionScratchpadUtils.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"16df57ad090167699011825e4b6dbc1d95ae839e0d56618aecdf059ef37f7837"}},{"ruleId":"D2","level":"warning","message":{"text":"ShellToolInvocation.getConfirmationDetails (cognitive 20): ShellToolInvocation.getConfirmationDetails has cognitive complexity 20 (threshold 15). Drivers by points: boolean chains 8, if/else 6 (8 pts), ternaries 3 (4 pts) (nesting depth added 3). Of this number, 17 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":"packages/core/src/tools/shell.ts"},"region":{"startLine":435}}}],"partialFingerprints":{"codehealthFindingId/v1":"3689aa6d1af820f9b2369e7cbe6654260cdceed7cd62a08207cf1f15f0ec1ede"}},{"ruleId":"D2","level":"warning","message":{"text":"errorReporting.reportError (cognitive 20): errorReporting.reportError has cognitive complexity 20 (threshold 15). Drivers by points: error handling 5 (11 pts), if/else 6 (8 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":"packages/core/src/utils/errorReporting.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ba15931b42e953b810ab154152d6cacfc4fe1f62ec2c72c167f6063510aa7e2"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch.fetchWithTimeout (cognitive 20): fetch.fetchWithTimeout has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (18 pts), boolean chains 1, 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":"packages/core/src/utils/fetch.ts"},"region":{"startLine":443}}}],"partialFingerprints":{"codehealthFindingId/v1":"4528698c66b60207030a8787a063f3e9e89d913c32f5ffa17e7899418e0d0aca"}},{"ruleId":"D2","level":"warning","message":{"text":"security.parseWindowsBatchSecurityOutput (cognitive 20): security.parseWindowsBatchSecurityOutput has cognitive complexity 20 (threshold 15). Drivers by points: if/else 11 (15 pts), loops 3 (4 pts), boolean chains 1 (nesting depth added 5). 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":"packages/core/src/utils/security.ts"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"72c88755587344ab5fb14d7bfe72f92e96424a8961d50d1531c7f54ff83fdf3f"}},{"ruleId":"D2","level":"warning","message":{"text":"sessionOperations.deleteSessionFileAndArtifacts (cognitive 20): sessionOperations.deleteSessionFileAndArtifacts has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (12 pts), error handling 4 (6 pts), boolean chains 2 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/sessionOperations.ts"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab1bd1debf0294fbc669f37ebf74b771f2c6a3c19a0e3719ac6f82da740f72bd"}},{"ruleId":"D2","level":"warning","message":{"text":"App.CodeView (cognitive 20): App.CodeView has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (8 pts), boolean chains 6, ternaries 4 (5 pts), loops 1 (nesting depth added 3). Most of this is not in the body itself: 7 of the 20 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 1846, 1919, 1835). 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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":1829}}}],"partialFingerprints":{"codehealthFindingId/v1":"29254b4537fc36f8b59c5b5dacea7805bde17f338c035764186f83bc0c74002e"}},{"ruleId":"D2","level":"warning","message":{"text":"eval-validate.getNewEvalFiles (cognitive 20): eval-validate.getNewEvalFiles has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (11 pts), error handling 3 (4 pts), boolean chains 3, 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":"scripts/utils/eval-validate.ts"},"region":{"startLine":261}}}],"partialFingerprints":{"codehealthFindingId/v1":"914375622f875cdbdeccbd244563584dd2b7f905a3f9a5a83b1491fc3f19c257"}},{"ruleId":"D2","level":"warning","message":{"text":"Orchestrator._submit_pull_request (cognitive 20): Orchestrator._submit_pull_request has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (9 pts), error handling 4 (7 pts), ternaries 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":"tools/caretaker-agent/cloudrun/pr-generator/workflow/orchestrator.py"},"region":{"startLine":598}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb42771a64c52c30d6f8f73bb4fc070ba5fefff8a7f6f2acf3c05e6c15f96cac"}},{"ruleId":"D2","level":"warning","message":{"text":"status.formatGemmaStatus (cognitive 19): status.formatGemmaStatus has cognitive complexity 19 (threshold 15). Drivers by points: if/else 14 (16 pts), ternaries 2 (3 pts) (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, 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":"packages/cli/src/commands/gemma/status.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"e34bc5c817b4b2db18d26083e8b90d2af2f89717790018727b8e806e4a756884"}},{"ruleId":"D2","level":"warning","message":{"text":"migrate.migrateClaudeHooks (cognitive 19): migrate.migrateClaudeHooks has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (12 pts), boolean chains 6, loops 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 one function literal inside it that branches (line 133). 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":"packages/cli/src/commands/hooks/migrate.ts"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"f03ef7878c73b5c437ddb1497032a8b04d28b2c204e26f9b64dfe842ed83f5ac"}},{"ruleId":"D2","level":"warning","message":{"text":"FileCommandLoader.parseAndAdaptFile (cognitive 19): FileCommandLoader.parseAndAdaptFile has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (9 pts), ternaries 2 (4 pts), error handling 3, boolean chains 2, loops 1 (nesting depth added 3). Of this number, 13 points are the body\u0027s own statements and 6 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":"packages/cli/src/services/FileCommandLoader.ts"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"15f93a46235976f1b8d05732a13fbb14d09fda68bd3b706a4cead1f8e0eba60c"}},{"ruleId":"D2","level":"warning","message":{"text":"StatusRow.StatusNode (cognitive 19): StatusRow.StatusNode has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (13 pts), boolean chains 3, ternaries 1 (3 pts) (nesting depth added 6). Of this number, 10 points are the body\u0027s own statements and 9 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":"packages/cli/src/ui/components/StatusRow.tsx"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"873ba821a23ed1fcff801a7ce902736f914f21309e99e614871804c2e933bcf9"}},{"ruleId":"D2","level":"warning","message":{"text":"SessionContext.areMetricsEqual (cognitive 19): SessionContext.areMetricsEqual has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (11 pts), boolean chains 6, loops 2 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/contexts/SessionContext.tsx"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"722808833db121d509c2e4aa750d60b5cb5eaf0817545ebd15cdc9011b3cad2b"}},{"ruleId":"D2","level":"warning","message":{"text":"commentJson.preserveCommentsOnPropertyDeletion (cognitive 19): commentJson.preserveCommentsOnPropertyDeletion has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (12 pts), boolean chains 5, ternaries 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":"packages/cli/src/utils/commentJson.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"759904e792f39c4f6fdc19890c88967afd19840a209d77b386beaeb0ec4b1cab"}},{"ruleId":"D2","level":"warning","message":{"text":"envVarResolver.resolveEnvVarsInObjectInternal (cognitive 19): envVarResolver.resolveEnvVarsInObjectInternal has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (16 pts), loops 1 (2 pts), boolean chains 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/utils/envVarResolver.ts"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5c8f091de7cd524562ce0f0b776563b49d6c6a2051c14ee9862df83b9bbaed0"}},{"ruleId":"D2","level":"warning","message":{"text":"sessionCleanup.identifySessionsToDelete (cognitive 19): sessionCleanup.identifySessionsToDelete has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (14 pts), error handling 1 (2 pts), boolean chains 1, loops 1, ternaries 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/utils/sessionCleanup.ts"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2e0c50830a6c3b916ed65b76cc49e8c5f49af72a5489288f67ca830c975ae3a"}},{"ruleId":"D2","level":"warning","message":{"text":"sessionUtils.getAllSessionFiles (cognitive 19): sessionUtils.getAllSessionFiles has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (7 pts), boolean chains 6, ternaries 4, error handling 2 (nesting depth added 1). Most of this is not in the body itself: 4 of the 19 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 253, 246, 310). 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":"packages/cli/src/utils/sessionUtils.ts"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"7083a038cd7e5ce622824b0b8dd3d959b01bd81d325430668276d3be5342d48e"}},{"ruleId":"D2","level":"warning","message":{"text":"validateNonInterActiveAuth.validateNonInteractiveAuth (cognitive 19): validateNonInterActiveAuth.validateNonInteractiveAuth has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (8 pts), ternaries 3 (8 pts), boolean chains 2, 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":"packages/cli/src/validateNonInterActiveAuth.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c1798a2372fe6bca860946b387678062e5ee442a0b2eab594e43f59d487505a"}},{"ruleId":"D2","level":"warning","message":{"text":"compile-windows-sandbox.compileWindowsSandbox (cognitive 19): compile-windows-sandbox.compileWindowsSandbox has cognitive complexity 19 (threshold 15). Drivers by points: if/else 11 (17 pts), boolean chains 1, loops 1 (nesting depth added 6). 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 into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/scripts/compile-windows-sandbox.js"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b4ca85ffdf3b1b7e7116537f84c6ff69971bafe4d81526fcf72bee0dce91ab1"}},{"ruleId":"D2","level":"warning","message":{"text":"Config._initialize (cognitive 19): Config._initialize has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (10 pts), error handling 2 (4 pts), ternaries 1 (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":"packages/core/src/config/config.ts"},"region":{"startLine":1450}}}],"partialFingerprints":{"codehealthFindingId/v1":"87ad81052eaff9b571b7aea3185eff525a675ec51f9a066ab441f3527112bfb8"}},{"ruleId":"D2","level":"warning","message":{"text":"ChatCompressionService.compress (cognitive 19): ChatCompressionService.compress has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (11 pts), boolean chains 5, ternaries 3 (nesting depth added 2). Of this number, 16 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, 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":"packages/core/src/context/chatCompressionService.ts"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"fce04f9357d37c7fb2a888bbb139864f1d75c93c35ab78037e727892c1bb2c33"}},{"ruleId":"D2","level":"warning","message":{"text":"HookEventHandler.logHookExecution (cognitive 19): HookEventHandler.logHookExecution has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (15 pts), loops 2, 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":"packages/core/src/hooks/hookEventHandler.ts"},"region":{"startLine":390}}}],"partialFingerprints":{"codehealthFindingId/v1":"b53ea08abaeb19f241e94e849b87d4f27ae17720edf5e587e6f35a4675f3e108"}},{"ruleId":"D2","level":"warning","message":{"text":"PolicyEngine.constructor (cognitive 19): PolicyEngine.constructor has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (10 pts), boolean chains 7, 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":"packages/core/src/policy/policy-engine.ts"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ad0049e86eba9cbe3d7e4f77c32de16dd2b58ae0920f3e39e2c31c0b3b39ebb"}},{"ruleId":"D2","level":"warning","message":{"text":"PolicyEngine.applyShellHeuristics (cognitive 19): PolicyEngine.applyShellHeuristics has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (11 pts), boolean chains 5, ternaries 2, error handling 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/policy/policy-engine.ts"},"region":{"startLine":359}}}],"partialFingerprints":{"codehealthFindingId/v1":"178e58fd3141cc7f9246f97c10f99a89bd46a9012b410c9b1e7347bb1e30dd60"}},{"ruleId":"D2","level":"warning","message":{"text":"CheckerRunner.executeCheckerProcess (cognitive 19): CheckerRunner.executeCheckerProcess has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (11 pts), ternaries 3 (6 pts), error handling 2 (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 4 function literals inside it that branch (lines 168, 213, 255, \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":"packages/core/src/safety/checker-runner.ts"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"10dc2249c1cd218503c7484ede880ff9f95d786f96c7d1279f3e599cb9e171a0"}},{"ruleId":"D2","level":"warning","message":{"text":"chatRecordingService.parseLegacyRecordFallback (cognitive 19): chatRecordingService.parseLegacyRecordFallback has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (11 pts), boolean chains 7, error handling 1 (nesting depth added 6). Of this number, 17 points are the body\u0027s own statements and 2 belong to 3 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":"packages/core/src/services/chatRecordingService.ts"},"region":{"startLine":1041}}}],"partialFingerprints":{"codehealthFindingId/v1":"3807918fd920d3c58f1cf375edcf995d6bbd8ae8c5bed83c46cd9a46ca6cf741"}},{"ruleId":"D2","level":"warning","message":{"text":"memoryService.scanEligibleSessions (cognitive 19): memoryService.scanEligibleSessions has cognitive complexity 19 (threshold 15). Drivers by points: if/else 4 (8 pts), error handling 3 (5 pts), boolean chains 2, loops 2, ternaries 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":"packages/core/src/services/memoryService.ts"},"region":{"startLine":577}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f1e407bd2aac2b0fcb21ea3cb19a4a6bdd89d90db40508a26602c0dd9477578"}},{"ruleId":"D2","level":"warning","message":{"text":"sessionSummaryUtils.collectPathsFromValue (cognitive 19): sessionSummaryUtils.collectPathsFromValue has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (13 pts), boolean chains 3, loops 2 (3 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/services/sessionSummaryUtils.ts"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"10a2f4af8aa9e92fe20fb4fe08dd8ac48c7c7bfcbda289442303bfcf3adc9d87"}},{"ruleId":"D2","level":"warning","message":{"text":"ShellExecutionService.resizePty (cognitive 19): ShellExecutionService.resizePty has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (11 pts), boolean chains 5, error handling 2 (3 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":"packages/core/src/services/shellExecutionService.ts"},"region":{"startLine":1875}}}],"partialFingerprints":{"codehealthFindingId/v1":"eef91d2aa1eb89ba15f02c04181312070abb05602e0841bb17e3f09da53b9fe3"}},{"ruleId":"D2","level":"warning","message":{"text":"shellExecutionService.writeBufferToLogStream (cognitive 19): shellExecutionService.writeBufferToLogStream 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":"packages/core/src/services/shellExecutionService.ts"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"96aa7538af1d76253163247f6c2c46dc351e858db601cc5c26b95ff201e59ca9"}},{"ruleId":"D2","level":"warning","message":{"text":"package_skill.main (cognitive 19): package_skill.main has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (13 pts), boolean chains 4, error handling 1, 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, 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":"packages/core/src/skills/builtin/skill-creator/scripts/package_skill.cjs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"f305a7311fabdd83c20b9236ed5aa06e0933647b72c7141bdff9db6ab0b4d8d4"}},{"ruleId":"D2","level":"warning","message":{"text":"semantic.getStringReferences (cognitive 19): semantic.getStringReferences has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (16 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":"packages/core/src/telemetry/semantic.ts"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"8917048cc68f06f0ec8aede322c7a21b39e59c1d90ce697e11920365a87bba88"}},{"ruleId":"D2","level":"warning","message":{"text":"grep-utils.formatGrepResults (cognitive 19): grep-utils.formatGrepResults has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 8 (13 pts), if/else 4 (5 pts), loops 1 (nesting depth added 6). Of this number, 15 points are the body\u0027s own statements and 4 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":"packages/core/src/tools/grep-utils.ts"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebb350eeebad6fbe40d4f2fe78d80ca1a1169d7782925f5aae6d2750687fd66b"}},{"ruleId":"D2","level":"warning","message":{"text":"ReadMcpResourceToolInvocation.execute (cognitive 19): ReadMcpResourceToolInvocation.execute has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (9 pts), boolean chains 4, ternaries 2 (3 pts), 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":"packages/core/src/tools/read-mcp-resource.ts"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"de8ae242c30f067c90f270ff2d2af11b64fd5138e596d4b622b48647ac6ce356"}},{"ruleId":"D2","level":"warning","message":{"text":"WebFetchToolInvocation.executeExperimental (cognitive 19): WebFetchToolInvocation.executeExperimental has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (13 pts), boolean chains 4, 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":"packages/core/src/tools/web-fetch.ts"},"region":{"startLine":595}}}],"partialFingerprints":{"codehealthFindingId/v1":"155bc5fd2f796f36acde362e2757fc480930a520b2c400ac411779069d383e5c"}},{"ruleId":"D2","level":"warning","message":{"text":"bfsFileSearch.bfsFileSearch (cognitive 19): bfsFileSearch.bfsFileSearch has cognitive complexity 19 (threshold 15). Drivers by points: if/else 4 (10 pts), loops 3 (5 pts), boolean chains 2, error handling 1 (2 pts) (nesting depth added 9). 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 into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/bfsFileSearch.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"45d3b478b63179c19ec6321c5659958282033c70f7cf2e9f4a58984e0937d848"}},{"ruleId":"D2","level":"warning","message":{"text":"errorParsing.parseAndFormatApiError (cognitive 19): errorParsing.parseAndFormatApiError has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (14 pts), error handling 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":"packages/core/src/utils/errorParsing.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"077efde683bf288125e19616dbc04f5216745af059b8194d376c0b16e24e938c"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch.safeLookup (cognitive 19): fetch.safeLookup has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (12 pts), boolean chains 3, ternaries 2 (3 pts), loops 1 (nesting depth added 4). Most of this is not in the body itself: 8 of the 19 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 101, 131). 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":"packages/core/src/utils/fetch.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"77f34bfe795b570513717279b459942c1dd41ca1b5489a8a27eaf34e5731a487"}},{"ruleId":"D2","level":"warning","message":{"text":"fileUtils.detectBOM (cognitive 19): fileUtils.detectBOM has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (13 pts), boolean chains 6 (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":"packages/core/src/utils/fileUtils.ts"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"18c63b8c8f34509c0fe14cd4dff86850c13c699d444a3fba815853f75d59d7ee"}},{"ruleId":"D2","level":"warning","message":{"text":"markdownUtils.jsonToMarkdown (cognitive 19): markdownUtils.jsonToMarkdown has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (15 pts), boolean chains 2, ternaries 1 (2 pts) (nesting depth added 6). Of this number, 11 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":"packages/core/src/utils/markdownUtils.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"080f13bf1561d193e502d55b041dfeff9632ee09a00c6dcadbb799ef11eafc76"}},{"ruleId":"D2","level":"warning","message":{"text":"oauth-flow.startCallbackServer (cognitive 19): oauth-flow.startCallbackServer has cognitive complexity 19 (threshold 15). Drivers by points: if/else 11 (14 pts), boolean chains 4, error handling 1 (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 2 function literals inside it that branch (lines 214, 210). 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":"packages/core/src/utils/oauth-flow.ts"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"c544c45c3c6202a3abbc6051544f0c5362f7fc5cb601a8b3220137872e981af8"}},{"ruleId":"D2","level":"warning","message":{"text":"GeminiCliSession.initialize (cognitive 19): GeminiCliSession.initialize has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (13 pts), error handling 1 (2 pts), ternaries 1 (2 pts), boolean chains 1, loops 1 (nesting depth added 6). 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":"packages/sdk/src/session.ts"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"864363415b3c4331b84b80bafad222a5b77b2838c6627b991a82984e6013b0da"}},{"ruleId":"D2","level":"warning","message":{"text":"aggregate_evals.getStats (cognitive 19): aggregate_evals.getStats has cognitive complexity 19 (threshold 15). Drivers by points: if/else 4 (11 pts), loops 3 (6 pts), error handling 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":"scripts/aggregate_evals.js"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"15d730b16eef8634105343d8398fb50d73a0ad6b2370406064f3353c2a02b869"}},{"ruleId":"D2","level":"warning","message":{"text":"actions_spend.getWorkflowMinutes (cognitive 19): actions_spend.getWorkflowMinutes has cognitive complexity 19 (threshold 15). Drivers by points: if/else 4 (10 pts), boolean chains 4, loops 2 (3 pts), error handling 1 (2 pts) (nesting depth added 8). Most of this is not in the body itself: 1 of the 19 points is its own statement and the rest belongs to one function literal inside it that branches (line 45). 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":"tools/gemini-cli-bot/metrics/scripts/actions_spend.ts"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f75875d751d93915c110ba1728b3bd3b74f954cba0af2902a09b5508861f802"}},{"ruleId":"D2","level":"warning","message":{"text":"acpUtils.toToolCallContent (cognitive 18): acpUtils.toToolCallContent has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (9 pts), ternaries 2 (9 pts) (nesting depth added 10). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/acp/acpUtils.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bd3ab3821a4808a9cfe6d9f42e935abe612f13037b6d5c6a83f1c6d20bf3546"}},{"ruleId":"D2","level":"warning","message":{"text":"ExtensionManager.toOutputString (cognitive 18): ExtensionManager.toOutputString has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10 (15 pts), boolean chains 2, ternaries 1 (nesting depth added 5). 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 into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/config/extension-manager.ts"},"region":{"startLine":1109}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cfd9d4e38268aa5da74f3e57c636fed28160d52b624570a78b80861bdda3b7b"}},{"ruleId":"D2","level":"warning","message":{"text":"injectionParser.extractInjections (cognitive 18): injectionParser.extractInjections has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (12 pts), loops 2 (3 pts), ternaries 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":"packages/cli/src/services/prompt-processors/injectionParser.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7c7e43cae2cf741ad96125a5ff2fcc6dd098caca9db18de2abcb53d1746a75d"}},{"ruleId":"D2","level":"warning","message":{"text":"AskUserDialog.choiceQuestionReducer (cognitive 18): AskUserDialog.choiceQuestionReducer has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (8 pts), ternaries 3 (6 pts), loops 1 (3 pts), match/switch 1 (nesting depth added 8). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/AskUserDialog.tsx"},"region":{"startLine":437}}}],"partialFingerprints":{"codehealthFindingId/v1":"594e191dc123cc5289b3498b1fcdea1561fe98297de13473fa8a63d38a6784e4"}},{"ruleId":"D2","level":"warning","message":{"text":"SubagentProgressDisplay.formatToolArgs (cognitive 18): SubagentProgressDisplay.formatToolArgs has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9, boolean chains 8, error handling 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":"packages/cli/src/ui/components/messages/SubagentProgressDisplay.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6b85dd353fc877d79892112b76a2e927eb80137b9f45157bce1c33e7b7d67ec"}},{"ruleId":"D2","level":"warning","message":{"text":"useAnimatedScrollbar.useAnimatedScrollbar (cognitive 18): useAnimatedScrollbar.useAnimatedScrollbar has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10 (11 pts), boolean chains 4, ternaries 3 (nesting depth added 1). Most of this is not in the body itself: 0 of the 18 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 39, 66, 110, \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":"packages/cli/src/ui/hooks/useAnimatedScrollbar.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce64efeeabe9c5e3c7c12572fee7100ebf5e49166e55a74fdf8f3d8571700393"}},{"ruleId":"D2","level":"warning","message":{"text":"useIncludeDirsTrust.useIncludeDirsTrust (cognitive 18): useIncludeDirsTrust.useIncludeDirsTrust has cognitive complexity 18 (threshold 15). Drivers by points: if/else 11 (13 pts), boolean chains 4, loops 1 (nesting depth added 2). Most of this is not in the body itself: 0 of the 18 points are its own statements and the rest belongs to one function literal inside it that branches (line 62). 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":"packages/cli/src/ui/hooks/useIncludeDirsTrust.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"c24739515eef3ebb375423781175d862154a48de2f241b47e2a0161289eef97c"}},{"ruleId":"D2","level":"warning","message":{"text":"useTabbedNavigation.useTabbedNavigation (cognitive 18): useTabbedNavigation.useTabbedNavigation has cognitive complexity 18 (threshold 15). Drivers by points: if/else 12 (16 pts), boolean chains 2 (nesting depth added 4). Most of this is not in the body itself: 1 of the 18 points is its own statement and the rest belongs to 6 function literals inside it that branch (lines 205, 163, 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":"packages/cli/src/ui/hooks/useTabbedNavigation.ts"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"904326a0e76be3ea91a5745fa4a1d2e5e1f4a36d75dafdf2a137110baa1d77eb"}},{"ruleId":"D2","level":"warning","message":{"text":"updateCheck.checkForUpdates (cognitive 18): updateCheck.checkForUpdates has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (13 pts), boolean chains 4, 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":"packages/cli/src/ui/utils/updateCheck.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"43ec0fedcc343f89459804a9639b370185519ccbbe4ffebd5a8e3d9345860c28"}},{"ruleId":"D2","level":"warning","message":{"text":"skillUtils.installSkill (cognitive 18): skillUtils.installSkill has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10 (13 pts), ternaries 2 (3 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":"packages/cli/src/utils/skillUtils.ts"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"270578e9c5c4b5eb450c162a231c27095d6f2e1b942e1258f73c510f63495d7b"}},{"ruleId":"D2","level":"warning","message":{"text":"McpToolInvocation.execute (cognitive 18): McpToolInvocation.execute has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (9 pts), boolean chains 6, ternaries 1 (2 pts), error handling 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":"packages/core/src/agents/browser/mcpToolWrapper.ts"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"76b2a001b4d29d3d696eed2fb106f20409564596a42a261e458ed5f433d313ec"}},{"ruleId":"D2","level":"warning","message":{"text":"snapshotSuperseder.supersedeStaleSnapshots (cognitive 18): snapshotSuperseder.supersedeStaleSnapshots has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (12 pts), loops 3 (4 pts), boolean chains 1, ternaries 1 (nesting depth added 6). 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":"packages/core/src/agents/browser/snapshotSuperseder.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"eff630451cc4944a4987ff91a02c3ff7eb8136828b9acd212c33d476d7e45a59"}},{"ruleId":"D2","level":"warning","message":{"text":"Config.constructor (cognitive 18): Config.constructor has cognitive complexity 18 (threshold 15). Drivers by points: if/else 11, boolean chains 5, error handling 1 (2 pts) (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/config/config.ts"},"region":{"startLine":993}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cbae9bf82363b75725e9d5253b1220e694f650e9c95a8283264563a646c5deb"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectRegistry.ensureOwnershipMarkers (cognitive 18): ProjectRegistry.ensureOwnershipMarkers has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (14 pts), error handling 1 (2 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":"packages/core/src/config/projectRegistry.ts"},"region":{"startLine":372}}}],"partialFingerprints":{"codehealthFindingId/v1":"21b3c5dbb78dbd3782b1988e2c2f92fa788512555e80aa17a455155ab781b642"}},{"ruleId":"D2","level":"warning","message":{"text":"StaticTokenCalculator.calculateTokenBreakdown (cognitive 18): StaticTokenCalculator.calculateTokenBreakdown has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (13 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":"packages/core/src/context/utils/contextTokenCalculator.ts"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"0148512709e825e73985d30b1cb01ed6a3a7855f5119b26cfc781af03b4e7f5a"}},{"ruleId":"D2","level":"warning","message":{"text":"geminiChat.extractCuratedHistory (cognitive 18): geminiChat.extractCuratedHistory has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (11 pts), loops 2 (4 pts), boolean chains 3 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/core/geminiChat.ts"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"863f103dae20d299d5e2f067648a01392cf10312d6632560736935b08e5d86b2"}},{"ruleId":"D2","level":"warning","message":{"text":"toml-loader.validateMcpPolicyToolNames (cognitive 18): toml-loader.validateMcpPolicyToolNames has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (14 pts), ternaries 1 (2 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":"packages/core/src/policy/toml-loader.ts"},"region":{"startLine":699}}}],"partialFingerprints":{"codehealthFindingId/v1":"d44039898425d136678bbf11f9c647b96719f1136229074052aa7e72a4618eb9"}},{"ruleId":"D2","level":"warning","message":{"text":"diff-utils.getDiffContextSnippet (cognitive 18): diff-utils.getDiffContextSnippet has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10 (14 pts), loops 3 (4 pts) (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/diff-utils.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"560b4a53093b56da8e3acdc2d5ce3270a4896e1308496ed475ca95903e945713"}},{"ruleId":"D2","level":"warning","message":{"text":"EditTool.getModifyContext (cognitive 18): EditTool.getModifyContext has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (11 pts), error handling 4, boolean chains 3 (nesting depth added 3). Most of this is not in the body itself: 0 of the 18 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 1221, 1286, 1275). 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":"packages/core/src/tools/edit.ts"},"region":{"startLine":1220}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb568449dd41ba4e5c49f267041e1982b6b174503121d6b38a3e9d2e2d8434e3"}},{"ruleId":"D2","level":"warning","message":{"text":"McpClient.refreshResources (cognitive 18): McpClient.refreshResources has cognitive complexity 18 (threshold 15). Drivers by points: if/else 4 (8 pts), boolean chains 4, error handling 2 (3 pts), loops 2 (3 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/mcp-client.ts"},"region":{"startLine":498}}}],"partialFingerprints":{"codehealthFindingId/v1":"61b61b50fa27a51ebf634582a39c1546db4f586cc2b5b5462c96a7f60def384b"}},{"ruleId":"D2","level":"warning","message":{"text":"atCommandUtils.tryExtractPath (cognitive 18): atCommandUtils.tryExtractPath has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (11 pts), loops 2 (3 pts), boolean chains 2, 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":"packages/core/src/utils/atCommandUtils.ts"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"83dfd98124ce35cc1f1a2d9db976053b9bbc3fd9280624630754de48e04da2fd"}},{"ruleId":"D2","level":"warning","message":{"text":"shell-utils.hasPromptCommandTransform (cognitive 18): shell-utils.hasPromptCommandTransform has cognitive complexity 18 (threshold 15). Drivers by points: if/else 4 (11 pts), loops 3 (6 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":"packages/core/src/utils/shell-utils.ts"},"region":{"startLine":432}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbb57706ca59a9e40b84f32bb854faec1f039c56b36e227f94aefa4b0106bf90"}},{"ruleId":"D2","level":"warning","message":{"text":"App.highlightLine (cognitive 18): App.highlightLine has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10 (14 pts), error handling 1 (3 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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":1700}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1265f4d4d7dbe5ddeeb2dd1e71275654359e9fca74cd10a850ff93600683214"}},{"ruleId":"D2","level":"warning","message":{"text":"close_duplicate_issues.run (cognitive 18): close_duplicate_issues.run has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (13 pts), error handling 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":"scripts/close_duplicate_issues.js"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"b96fba505999b06b252fd86c46fec2ee72e38da2f679a456313f92ce38287b06"}},{"ruleId":"D2","level":"warning","message":{"text":"eval_utils.getStatsFromReports (cognitive 18): eval_utils.getStatsFromReports has cognitive complexity 18 (threshold 15). Drivers by points: if/else 3 (10 pts), loops 3 (6 pts), error handling 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":"scripts/eval_utils.js"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"6610a191675612e203f48b2b72f2bb5d5ba87774127886f1b2827f8029f75ff0"}},{"ruleId":"D2","level":"warning","message":{"text":"autogen.formatDefaultValue (cognitive 18): autogen.formatDefaultValue has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (10 pts), error handling 3 (5 pts), 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":"scripts/utils/autogen.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"77f4ae014b1b5964d944b90e1b02bdb3f14a8fd31ca3c883d6be3fdb57155274"}},{"ruleId":"D2","level":"warning","message":{"text":"LLMJudge.judgeYesNo (cognitive 17): LLMJudge.judgeYesNo has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (11 pts), boolean chains 4, error handling 1, loops 1 (nesting depth added 3). 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":"evals/llm-judge.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"482bb078aa683b4f054ffe0648e412156aa549119666576ea87346a63772ec92"}},{"ruleId":"D2","level":"warning","message":{"text":"Task.handleEventDrivenToolCall (cognitive 17): Task.handleEventDrivenToolCall has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (10 pts), boolean chains 5, ternaries 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":"packages/a2a-server/src/agent/task.ts"},"region":{"startLine":462}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f53393a3a0c8099a6bfd8ce4881474a18794fce225bcd31a757aefc83547ae6"}},{"ruleId":"D2","level":"warning","message":{"text":"settings._doLoadSettings (cognitive 17): settings._doLoadSettings has cognitive complexity 17 (threshold 15). Drivers by points: if/else 11 (13 pts), boolean chains 2, error handling 1, ternaries 1 (nesting depth added 2). Most of this is not in the body itself: 7 of the 17 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 781, 851). 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":"packages/cli/src/config/settings.ts"},"region":{"startLine":769}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae296c6e2a2e4b607d06a9ae53a4fcd413a2c868f7368e6935873c24065bfced"}},{"ruleId":"D2","level":"warning","message":{"text":"interactiveCli.startInteractiveUI (cognitive 17): interactiveCli.startInteractiveUI has cognitive complexity 17 (threshold 15). Drivers by points: error handling 6 (7 pts), if/else 6, boolean chains 3, ternaries 1 (nesting depth added 1). Of this number, 14 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":"packages/cli/src/interactiveCli.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"925c7e697a260bcee8e76636f29b8cb9687952d626c6be83ecc9b305eaf9aadd"}},{"ruleId":"D2","level":"warning","message":{"text":"BuiltinCommandLoader.loadCommands (cognitive 17): BuiltinCommandLoader.loadCommands has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 13 (14 pts), if/else 3 (nesting depth added 1). Of this number, 13 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":"packages/cli/src/services/BuiltinCommandLoader.ts"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"37f3e17afcc5f502aca461d31959e86ebe77a5855fcce4912f3f5f60945f9903"}},{"ruleId":"D2","level":"warning","message":{"text":"extensionsCommand.configAction (cognitive 17): extensionsCommand.configAction has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (14 pts), boolean chains 3 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/commands/extensionsCommand.ts"},"region":{"startLine":673}}}],"partialFingerprints":{"codehealthFindingId/v1":"891a05076082321296f4b2ed085a420baa432256bc604916affb44c556acddfb"}},{"ruleId":"D2","level":"warning","message":{"text":"DiffRenderer.DiffRenderer (cognitive 17): DiffRenderer.DiffRenderer has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 4 (8 pts), if/else 6, boolean chains 3 (nesting depth added 4). Most of this is not in the body itself: 1 of the 17 points is its own statement and the rest belongs to 2 function literals inside it that branch (lines 125, 116). 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":"packages/cli/src/ui/components/messages/DiffRenderer.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"66f3105974e34dc7182f7bbdb4da8b20f28d71ec4d47641b4c513fac1823e462"}},{"ruleId":"D2","level":"warning","message":{"text":"ShellToolMessage.ShellToolMessage (cognitive 17): ShellToolMessage.ShellToolMessage has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (9 pts), boolean chains 6, error handling 1 (2 pts) (nesting depth added 4). Most of this is not in the body itself: 4 of the 17 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 100, 129, 146). 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":"packages/cli/src/ui/components/messages/ShellToolMessage.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"398b4f035d65998197a6ba9b4789bf5b229259d5e7d453f97e40bd541aba769b"}},{"ruleId":"D2","level":"warning","message":{"text":"TopicMessage.TopicMessage (cognitive 17): TopicMessage.TopicMessage has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 11, if/else 3, ternaries 3. Of this number, 11 points are the body\u0027s own statements and 6 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":"packages/cli/src/ui/components/messages/TopicMessage.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9b968e6b1107d692d0f04b09bf00b4a0edf09a2bc07d8f1968cc73b1573f15e"}},{"ruleId":"D2","level":"warning","message":{"text":"useRunEventNotifications.useRunEventNotifications (cognitive 17): useRunEventNotifications.useRunEventNotifications has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 10, if/else 6, ternaries 1. Most of this is not in the body itself: 0 of the 17 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 81, 140). 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":"packages/cli/src/ui/hooks/useRunEventNotifications.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdc0e80c495163883d873fc5922fe05af6a237d99e5d77d20e296131d40a3487"}},{"ruleId":"D2","level":"warning","message":{"text":"sessionCleanup.validateRetentionConfig (cognitive 17): sessionCleanup.validateRetentionConfig has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (11 pts), error handling 2 (4 pts), boolean chains 2 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/utils/sessionCleanup.ts"},"region":{"startLine":414}}}],"partialFingerprints":{"codehealthFindingId/v1":"df8440c0d9f50057d432c5c4a190b43ef6a624006ede5dabb731d4f447d1e5ac"}},{"ruleId":"D2","level":"warning","message":{"text":"a2a-errors.collectErrorMessages (cognitive 17): a2a-errors.collectErrorMessages 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":"packages/core/src/agents/a2a-errors.ts"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"99c443f664a658d007ce42e545181ee5f267399fa8898bf82fdef96d95c1941f"}},{"ruleId":"D2","level":"warning","message":{"text":"value-resolver.resolveAuthValue (cognitive 17): value-resolver.resolveAuthValue has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (12 pts), boolean chains 3, error handling 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":"packages/core/src/agents/auth-provider/value-resolver.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"db7c4ddc64efa981a23241d507f871a4ecf5c5c1a43bd513a18be5c34d693fe7"}},{"ruleId":"D2","level":"warning","message":{"text":"RemoteAgentInvocation.execute (cognitive 17): RemoteAgentInvocation.execute has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (13 pts), ternaries 1 (2 pts), error handling 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":"packages/core/src/agents/remote-invocation.ts"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"02f87596d49400cd5dbf1dc0e1d8936807a28a705f35e63302199a85716260aa"}},{"ruleId":"D2","level":"warning","message":{"text":"geminiChat.stripToolCallIdPrefixes (cognitive 17): geminiChat.stripToolCallIdPrefixes has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 9, if/else 6 (8 pts) (nesting depth added 2). Most of this is not in the body itself: 0 of the 17 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 1759, 1795, 1757, \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":"packages/core/src/core/geminiChat.ts"},"region":{"startLine":1756}}}],"partialFingerprints":{"codehealthFindingId/v1":"f031445dc0234a9e65bcc781e8d637ecb799da2977eeb11789860e61968980a5"}},{"ruleId":"D2","level":"warning","message":{"text":"TrustedHooksManager.trustHooks (cognitive 17): TrustedHooksManager.trustHooks has cognitive complexity 17 (threshold 15). Drivers by points: if/else 3 (9 pts), loops 3 (6 pts), boolean chains 2 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/hooks/trustedHooks.ts"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"70562147c4de16eb98d1b87e56197678d54167ca92a160d9d78e0fe2150b4c8d"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelConfigService.resolveAliasChain (cognitive 17): ModelConfigService.resolveAliasChain has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (13 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":"packages/core/src/services/modelConfigService.ts"},"region":{"startLine":432}}}],"partialFingerprints":{"codehealthFindingId/v1":"030b386a7b2a37399d3613f210d980f8811df5cae6967b24fb6b32f0f68a683d"}},{"ruleId":"D2","level":"warning","message":{"text":"sandboxManager.resolveSandboxPaths (cognitive 17): sandboxManager.resolveSandboxPaths has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (12 pts), boolean chains 2, ternaries 2, error handling 1 (nesting depth added 6). Of this number, 12 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":"packages/core/src/services/sandboxManager.ts"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"553d08888a20217f43815ccf4fbbed40cd34feb3de71fc602bb78225d465ef9f"}},{"ruleId":"D2","level":"warning","message":{"text":"SessionSummaryService.generateSummary (cognitive 17): SessionSummaryService.generateSummary has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (8 pts), ternaries 3 (5 pts), boolean chains 3, error handling 1 (nesting depth added 3). Of this number, 13 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, 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":"packages/core/src/services/sessionSummaryService.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6a8f2d76ab242d881c04f5fae53ca30c20225cdc966b0b1b81cca95844f155c"}},{"ruleId":"D2","level":"warning","message":{"text":"validate_skill.validateSkill (cognitive 17): validate_skill.validateSkill has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10 (11 pts), ternaries 2 (3 pts), boolean chains 2, 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":"packages/core/src/skills/builtin/skill-creator/scripts/validate_skill.cjs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"baa76a0d7126c039bef44b9e9f2cb621a566667c6019f93f252cbf53f2c1921a"}},{"ruleId":"D2","level":"warning","message":{"text":"ClearcutLogger.logToolCallEvent (cognitive 17): ClearcutLogger.logToolCallEvent has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (11 pts), loops 2 (5 pts), boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts"},"region":{"startLine":756}}}],"partialFingerprints":{"codehealthFindingId/v1":"9324c1c0c09bf2192497b66b2db188165d6bbbc7ff37ed232d4c63e6ed74c848"}},{"ruleId":"D2","level":"warning","message":{"text":"WebFetchToolInvocation.execute (cognitive 17): WebFetchToolInvocation.execute has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 8, if/else 7 (8 pts), error handling 1 (nesting depth added 1). Of this number, 12 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":"packages/core/src/tools/web-fetch.ts"},"region":{"startLine":771}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ff6960ef7d15296c78de0d3bdc613138de9ea13ed869e72b32789909c8bade5"}},{"ruleId":"D2","level":"warning","message":{"text":"write-file.getCorrectedFileContent (cognitive 17): write-file.getCorrectedFileContent has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (7 pts), error handling 3 (5 pts), ternaries 1 (3 pts), boolean chains 2 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/write-file.ts"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"a69389e30e1f1495a66e10bec4d254657447588fa7a1bbcadf1ab12de79c7cb0"}},{"ruleId":"D2","level":"warning","message":{"text":"getFolderStructure.formatStructure (cognitive 17): getFolderStructure.formatStructure has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 5 (8 pts), boolean chains 4, if/else 3, 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":"packages/core/src/utils/getFolderStructure.ts"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"61a4bf84acb06820a420d0454713788e1850f5080f43a238e91f1954bce8066d"}},{"ruleId":"D2","level":"warning","message":{"text":"App.ConsoleLogEntry (cognitive 17): App.ConsoleLogEntry has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 6 (9 pts), boolean chains 4, 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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":610}}}],"partialFingerprints":{"codehealthFindingId/v1":"36d61025ba6bc9035b54154fc2a3b1361493b904f780f3e08f56439a3412f46b"}},{"ruleId":"D2","level":"warning","message":{"text":"extension.activate (cognitive 17): extension.activate has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (8 pts), boolean chains 5, ternaries 2 (3 pts), error handling 1 (nesting depth added 2). Most of this is not in the body itself: 8 of the 17 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 195, 140, 126, \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":"packages/vscode-ide-companion/src/extension.ts"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d8fcdff2f41a6efeb8aa714b5aff1bb216fd5936403ef20771d446932ded1b7"}},{"ruleId":"D2","level":"warning","message":{"text":"generate-settings-doc.collectEntries (cognitive 17): generate-settings-doc.collectEntries has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (11 pts), boolean chains 5, loops 1 (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 one function literal inside it that branches (line 119). 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":"scripts/generate-settings-doc.ts"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"2965a4c05e74c7113f24dbf0e2f422cdd8781fae7252334e8044c5f544e3a474"}},{"ruleId":"D2","level":"warning","message":{"text":"lint.runTSConfigLinter (cognitive 17): lint.runTSConfigLinter has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (13 pts), error handling 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":"scripts/lint.js"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"7acf7eb5c7e3fad31f06bd4279ffba21e740d63a7ef54e7b1c1549c61794f2db"}},{"ruleId":"D2","level":"warning","message":{"text":"run_eval_regression.main (cognitive 17): run_eval_regression.main has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (13 pts), error handling 1 (2 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":"scripts/run_eval_regression.js"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"76145e3f05d75ff54ac84423c8d25c9c42478afcf705053f6675f206b8ab0428"}},{"ruleId":"D2","level":"warning","message":{"text":"tool-log-formatter.formatToolLogChain (cognitive 17): tool-log-formatter.formatToolLogChain has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 4 (10 pts), boolean chains 3, if/else 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":"scripts/utils/tool-log-formatter.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8d84260329f35236abe8cb75a47244476d25977763f6de9e1a774b77c1c2660"}},{"ruleId":"D2","level":"warning","message":{"text":"history-helper.getHistoricalAverage (cognitive 17): history-helper.getHistoricalAverage has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (15 pts), error handling 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":"tools/gemini-cli-bot/metrics/history-helper.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"591b41e7bbbccf59500beb28b96f9e74f9bfbbceea5b111acd2fd47b711905f9"}},{"ruleId":"D2","level":"warning","message":{"text":"index.processOutputLine (cognitive 17): index.processOutputLine has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10 (14 pts), boolean chains 2, 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":"tools/gemini-cli-bot/metrics/index.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a8b4db5311ccf4996ca1d64d76c257c188b1e7526f5b0d8985003c5d224f2ba"}},{"ruleId":"D2","level":"warning","message":{"text":"db_interface._release_lock_tx (cognitive 17): db_interface._release_lock_tx has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10 (13 pts), boolean chains 2, ternaries 1 (2 pts) (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tools/caretaker-agent/cloudrun/pr-generator/workflow/db/db_interface.py"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b99122a8f6d55ed9cafd80b71eb421af39590cbdedd16642d231aaaf9628e57"}},{"ruleId":"D2","level":"warning","message":{"text":"config.loadEnvironment (cognitive 16): config.loadEnvironment has cognitive complexity 16 (threshold 15). Drivers by points: error handling 3 (7 pts), if/else 4 (6 pts), loops 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":"packages/a2a-server/src/config/config.ts"},"region":{"startLine":557}}}],"partialFingerprints":{"codehealthFindingId/v1":"abd5a16b946282bd08ae00c237223c8334537aa4a9243d04e39fb057f7c0abf9"}},{"ruleId":"D2","level":"warning","message":{"text":"acpUtils.toPermissionOptions (cognitive 16): acpUtils.toPermissionOptions has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (13 pts), match/switch 2 (3 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/acp/acpUtils.ts"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd96cf998d9c5f7aa3fe388acab559b9da1261931c90ac8e76e7235ceff0dd85"}},{"ruleId":"D2","level":"warning","message":{"text":"settings-validation.buildZodSchemaFromDefinition (cognitive 16): settings-validation.buildZodSchemaFromDefinition has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (14 pts), boolean chains 1, match/switch 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/config/settings-validation.ts"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"53c4a25c56888e593daec1ec4bcb4a93d637e7bcc123b282a2b8aa497e6e3c31"}},{"ruleId":"D2","level":"warning","message":{"text":"restoreCommand.restoreAction (cognitive 16): restoreCommand.restoreAction has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (12 pts), boolean chains 1, error handling 1, loops 1, ternaries 1 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/commands/restoreCommand.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"080fb402d617e3cdbfdb4082c26338d16cc186b467d843084e74337747c241ac"}},{"ruleId":"D2","level":"warning","message":{"text":"skillsCommand.reloadAction (cognitive 16): skillsCommand.reloadAction has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (9 pts), ternaries 3 (6 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":"packages/cli/src/ui/commands/skillsCommand.ts"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"05e6435b18f191c3eb08939326f2365232be72e7a011cb68df29783f1fd4b2c6"}},{"ruleId":"D2","level":"warning","message":{"text":"AppHeader.AppHeader (cognitive 16): AppHeader.AppHeader has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 11, if/else 2 (3 pts), ternaries 2 (nesting depth added 1). 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, 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":"packages/cli/src/ui/components/AppHeader.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f82386e2de30e1d7f9ecc5eb812f8612b8e2948c9cdba8f15d6521f854924e6"}},{"ruleId":"D2","level":"warning","message":{"text":"ConfigInitDisplay.ConfigInitDisplay (cognitive 16): ConfigInitDisplay.ConfigInitDisplay has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (6 pts), ternaries 3 (6 pts), boolean chains 3, loops 1 (nesting depth added 4). 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 26). 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":"packages/cli/src/ui/components/ConfigInitDisplay.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"b00563f49bcfc22d9a62e5b77b4587ed71da378fe4728f96da5cb5e931d06a23"}},{"ruleId":"D2","level":"warning","message":{"text":"EditorSettingsDialog.EditorSettingsDialog (cognitive 16): EditorSettingsDialog.EditorSettingsDialog has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7, ternaries 6 (7 pts), boolean chains 2 (nesting depth added 1). Of this number, 9 points are the body\u0027s own statements and 7 belong to 4 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":"packages/cli/src/ui/components/EditorSettingsDialog.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4589b7e7f886c1337ac5b071af4619a6a25be4a482af9ab9e1235c92d411836"}},{"ruleId":"D2","level":"warning","message":{"text":"ToastDisplay.ToastDisplay (cognitive 16): ToastDisplay.ToastDisplay has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (9 pts), ternaries 2 (4 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":"packages/cli/src/ui/components/ToastDisplay.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"606069d771ec5df307a1d9e5860ec5450407cee54a3d0ca39380e18c450cbee1"}},{"ruleId":"D2","level":"warning","message":{"text":"ToolConfirmationQueue.ToolConfirmationQueue (cognitive 16): ToolConfirmationQueue.ToolConfirmationQueue has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 8, ternaries 5 (6 pts), if/else 2 (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":"packages/cli/src/ui/components/ToolConfirmationQueue.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"b37e611c4757ab343b6a6c063fc9acf39d1c8d22729458cc708d8654adf25afb"}},{"ruleId":"D2","level":"warning","message":{"text":"EnumSelector.EnumSelector (cognitive 16): EnumSelector.EnumSelector has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 7, boolean chains 6, if/else 3. Of this number, 10 points are the body\u0027s own statements and 6 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":"packages/cli/src/ui/components/shared/EnumSelector.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"afab2f58a606a77176481ad0b5985776f4d3d144aed448960cf6582e3b48c568"}},{"ruleId":"D2","level":"warning","message":{"text":"text-buffer.findNextWordStartInLine (cognitive 16): text-buffer.findNextWordStartInLine has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (6 pts), loops 3 (5 pts), boolean chains 4, ternaries 1 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/shared/text-buffer.ts"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"7757f9fa4dde5edd595ed64b098d5c62ad0ff5a2b8dae834ab0e33062ccb7870"}},{"ruleId":"D2","level":"warning","message":{"text":"text-buffer.findPrevWordStartInLine (cognitive 16): text-buffer.findPrevWordStartInLine has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (7 pts), loops 3 (5 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":"packages/cli/src/ui/components/shared/text-buffer.ts"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cd52934b7ad4dce90cbb1e583f16e54ed8c05275aa656ccc6e365d99db1ce7d"}},{"ruleId":"D2","level":"warning","message":{"text":"ExtensionRegistryView.ExtensionRegistryView (cognitive 16): ExtensionRegistryView.ExtensionRegistryView has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 7 (8 pts), boolean chains 6, if/else 2 (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 3 function literals inside it that branch (lines 139, 72, 205). 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":"packages/cli/src/ui/components/views/ExtensionRegistryView.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"72e5e96250a390346926790cd2672e8d924a7e1d316df5cf84383976f005c289"}},{"ruleId":"D2","level":"warning","message":{"text":"useBanner.useBanner (cognitive 16): useBanner.useBanner has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 8, if/else 4 (6 pts), ternaries 2 (nesting depth added 2). Of this number, 9 points are the body\u0027s own statements and 7 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":"packages/cli/src/ui/hooks/useBanner.ts"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f9767a77b16825ebd046136ddd9b68249bbea3e8207aed20ec088c49e9597c2"}},{"ruleId":"D2","level":"warning","message":{"text":"useInputHistory.useInputHistory (cognitive 16): useInputHistory.useInputHistory has cognitive complexity 16 (threshold 15). Drivers by points: if/else 11 (12 pts), boolean chains 2, ternaries 1 (2 pts) (nesting depth added 2). Most of this is not in the body itself: 0 of the 16 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 63, 110, 121, \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":"packages/cli/src/ui/hooks/useInputHistory.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ce7eb07079ed06ea84331ebd71d03fd8b92951e65d6b9d0c7fa128fb47c9d00"}},{"ruleId":"D2","level":"warning","message":{"text":"useSlashCompletion.useCommandParser (cognitive 16): useSlashCompletion.useCommandParser has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (10 pts), boolean chains 5, loops 1 (nesting depth added 4). 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 64). 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":"packages/cli/src/ui/hooks/useSlashCompletion.ts"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"afd7ba8dfe70e382340a68b3efd9f9cd8229977125290d7db2ebd12133778959"}},{"ruleId":"D2","level":"warning","message":{"text":"mouse.parseX11MouseEvent (cognitive 16): mouse.parseX11MouseEvent has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (10 pts), match/switch 2 (5 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":"packages/cli/src/ui/utils/mouse.ts"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0f2af9bb55984b8fae27933ac66e637cda9a9660e075f6649fcbd365c376b6f"}},{"ruleId":"D2","level":"warning","message":{"text":"terminalSetup.detectTerminal (cognitive 16): terminalSetup.detectTerminal has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (10 pts), boolean chains 4, error handling 1 (2 pts) (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/utils/terminalSetup.ts"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2aa8a9a0f78d4604fa0f3a25bac04902e633e9045cc4281ad03904dcc18f533"}},{"ruleId":"D2","level":"warning","message":{"text":"ActivityLogger.sanitizeNetworkLog (cognitive 16): ActivityLogger.sanitizeNetworkLog has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (9 pts), loops 2 (4 pts), boolean chains 3 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/utils/activityLogger.ts"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"d713da21ac62234a316885e85517540373de4060f173ca4c57ace39b6a2cb757"}},{"ruleId":"D2","level":"warning","message":{"text":"agentLoader.authConfigSchema (cognitive 16): agentLoader.authConfigSchema has cognitive complexity 16 (threshold 15). Drivers by points: if/else 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":"packages/core/src/agents/agentLoader.ts"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"f59b3c2b7d9d0579a23b91082ec8643c3923dce1be317e6793922ceadd416f16"}},{"ruleId":"D2","level":"warning","message":{"text":"GoogleCredentialsAuthProvider.headers (cognitive 16): GoogleCredentialsAuthProvider.headers has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (7 pts), ternaries 2 (5 pts), error handling 2 (3 pts), boolean chains 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/agents/auth-provider/google-credentials-provider.ts"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"9401ffabb3c5ad4cb8385cf5b836109faa9e6e6383714fdb6009d62c858d77ba"}},{"ruleId":"D2","level":"warning","message":{"text":"BrowserManager.checkNavigationRestrictions (cognitive 16): BrowserManager.checkNavigationRestrictions has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (10 pts), error handling 2 (3 pts), boolean chains 2, loops 1 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/agents/browser/browserManager.ts"},"region":{"startLine":907}}}],"partialFingerprints":{"codehealthFindingId/v1":"a68beb54c1c9f64924da8d360c9ad416daf61e694e7353f85dbd3e86945fccb8"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectRegistry.save (cognitive 16): ProjectRegistry.save has cognitive complexity 16 (threshold 15). Drivers by points: error handling 3 (5 pts), if/else 3 (5 pts), ternaries 1 (3 pts), boolean chains 2, loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/config/projectRegistry.ts"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"a05f95b05b65eeb83bd5a1e3000327076e6acea61ad59703abe403278df4a071"}},{"ruleId":"D2","level":"warning","message":{"text":"formatNodesForLlm.formatNodesForLlm (cognitive 16): formatNodesForLlm.formatNodesForLlm has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (13 pts), boolean chains 2, loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/context/utils/formatNodesForLlm.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d3040a0ae11e5b86b0faa00e86f4441f55f30c1a29f24114fb4539632f67fca"}},{"ruleId":"D2","level":"warning","message":{"text":"contentGenerator.createContentGeneratorConfig (cognitive 16): contentGenerator.createContentGeneratorConfig has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 11, if/else 5. Of this number, 14 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":"packages/core/src/core/contentGenerator.ts"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3a956a8dd55ce3392802997af1d1120c85c8e950446fb6be3dacf79ccd62467"}},{"ruleId":"D2","level":"warning","message":{"text":"hook-utils.evaluateBeforeToolHook (cognitive 16): hook-utils.evaluateBeforeToolHook has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (8 pts), ternaries 1 (4 pts), error handling 1 (3 pts), boolean chains 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/scheduler/hook-utils.ts"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f3382e68b676a35485f6609d5e7b9166c21a3ace255aedfd0e89449ffd613a1"}},{"ruleId":"D2","level":"warning","message":{"text":"environmentSanitization.shouldRedactEnvironmentVariable (cognitive 16): environmentSanitization.shouldRedactEnvironmentVariable has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10 (13 pts), loops 2 (3 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/services/environmentSanitization.ts"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"1be8fe3c216cefb0346393f66043a81c7a3f66eb44f3072d317f5823aad4a0b6"}},{"ruleId":"D2","level":"warning","message":{"text":"ExecutionLifecycleService.settleExecution (cognitive 16): ExecutionLifecycleService.settleExecution has cognitive complexity 16 (threshold 15). Drivers by points: if/else 3 (4 pts), ternaries 2 (4 pts), boolean chains 3, error handling 1 (3 pts), 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":"packages/core/src/services/executionLifecycleService.ts"},"region":{"startLine":409}}}],"partialFingerprints":{"codehealthFindingId/v1":"0733f16d5f0fa47e79ad4c6192999ae1d894e875507fb62f4827c74f5a86c5eb"}},{"ruleId":"D2","level":"warning","message":{"text":"LoopDetectionService.checkForLoopWithLLM (cognitive 16): LoopDetectionService.checkForLoopWithLLM has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (8 pts), ternaries 5, 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":"packages/core/src/services/loopDetectionService.ts"},"region":{"startLine":563}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fb98625669adeef18a04da5792aaf95d5efdaffc7ae68b7fc188213910a8edd"}},{"ruleId":"D2","level":"warning","message":{"text":"memoryPatchUtils.validateParsedSkillPatchHeaders (cognitive 16): memoryPatchUtils.validateParsedSkillPatchHeaders has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (9 pts), ternaries 2 (4 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":"packages/core/src/services/memoryPatchUtils.ts"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcb096639efb40d38fb6ed028fc086830014428d69ec61e8f161a94e6c93eb4d"}},{"ruleId":"D2","level":"warning","message":{"text":"memoryPatchUtils.validateInboxMemoryPatchFile (cognitive 16): memoryPatchUtils.validateInboxMemoryPatchFile has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 3 (7 pts), if/else 3 (4 pts), error handling 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":"packages/core/src/services/memoryPatchUtils.ts"},"region":{"startLine":529}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d1d609c72eefa9dce6a74164c754cfdeb70ee0e79bfda570d60e072d7eaf6e7"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelConfigService.getAvailableModelOptions (cognitive 16): ModelConfigService.getAvailableModelOptions has cognitive complexity 16 (threshold 15). Drivers by points: if/else 11, boolean chains 5. Most of this is not in the body itself: 0 of the 16 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 193, 166, 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":"packages/core/src/services/modelConfigService.ts"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"cae8215c7e3b4e7686fcaca652c89a31bfb1efe75262406c44cac1eb70dbe462"}},{"ruleId":"D2","level":"warning","message":{"text":"EditToolInvocation.constructor (cognitive 16): EditToolInvocation.constructor has cognitive complexity 16 (threshold 15). Drivers by points: error handling 4 (10 pts), if/else 5 (6 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":"packages/core/src/tools/edit.ts"},"region":{"startLine":465}}}],"partialFingerprints":{"codehealthFindingId/v1":"98f7d3e945490749a23ed19e9490da52d9cfc0be4b074e5a4adac16ec1e91a94"}},{"ruleId":"D2","level":"warning","message":{"text":"ReadFileToolInvocation.execute (cognitive 16): ReadFileToolInvocation.execute has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (8 pts), boolean chains 4, ternaries 3 (4 pts) (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/read-file.ts"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cff136760e7c1b412929d59381114d1f2b720d2d86057cbc8f260b59072bd43"}},{"ruleId":"D2","level":"warning","message":{"text":"ReadBackgroundOutputInvocation.execute (cognitive 16): ReadBackgroundOutputInvocation.execute has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (7 pts), boolean chains 4, ternaries 2 (3 pts), error handling 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/shellBackgroundTools.ts"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"a27c89f6c2c41a6b00b1842de03060d3913c1948b92c26514e7d0ec839b54675"}},{"ruleId":"D2","level":"warning","message":{"text":"ToolRegistry.isActiveTool (cognitive 16): ToolRegistry.isActiveTool 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":"packages/core/src/tools/tool-registry.ts"},"region":{"startLine":605}}}],"partialFingerprints":{"codehealthFindingId/v1":"18286ef48d475aecec5bad024c08fd2dcf97e7f6668b57f02d50b275a6e6e011"}},{"ruleId":"D2","level":"warning","message":{"text":"ignorePathUtils.getNormalizedRelativePath (cognitive 16): ignorePathUtils.getNormalizedRelativePath has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (8 pts), boolean chains 4, error handling 1 (2 pts), ternaries 1 (2 pts) (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/ignorePathUtils.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"52c877c4c6202e7d5b74cd7a2bc87f7a336b29c399ca839fae8de5d141e157bb"}},{"ruleId":"D2","level":"warning","message":{"text":"security.isPathSecureSync (cognitive 16): security.isPathSecureSync has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (11 pts), error handling 3, boolean chains 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":"packages/core/src/utils/security.ts"},"region":{"startLine":499}}}],"partialFingerprints":{"codehealthFindingId/v1":"f27da07edf75d80be96f8cb91da88b1e3fb018ecebca1d071ae6af12c0403445"}},{"ruleId":"D2","level":"warning","message":{"text":"Cell.update (cognitive 16): Cell.update has cognitive complexity 16 (threshold 15). Drivers by points: if/else 16. 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":"packages/core/src/utils/terminalSerializer.ts"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbf62927035169504b1bc5977958442ef78db49de76e36bcd95cc87bb8747c02"}},{"ruleId":"D2","level":"warning","message":{"text":"GeminiCliSession.sendStream (cognitive 16): GeminiCliSession.sendStream has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (12 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":"packages/sdk/src/session.ts"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec5bc7c45016f5c4c36947820a47d51da87ee8bdb52d71458d6c342f7d38363a"}},{"ruleId":"D2","level":"warning","message":{"text":"OpenFilesManager.constructor (cognitive 16): OpenFilesManager.constructor has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (12 pts), boolean chains 2, loops 2 (nesting depth added 4). 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 60, 51, 27, \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":"packages/vscode-ide-companion/src/open-files-manager.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"e236a4a439db169a950882edc92cb6efdd86531d6d7a86f2d0771885ba56c59d"}},{"ruleId":"D2","level":"warning","message":{"text":"build_binary.signFile (cognitive 16): build_binary.signFile has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (12 pts), boolean chains 2, error handling 1 (2 pts) (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/build_binary.js"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec22bd21a68d442f50b9816533caba8bfb3ebc1d1221ec12037f505e91a76e05"}},{"ruleId":"D2","level":"warning","message":{"text":"eval-validate-cli.main (cognitive 16): eval-validate-cli.main has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (11 pts), loops 1 (2 pts), ternaries 2, 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":"scripts/eval-validate-cli.ts"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"70098d2a31fc3b010b3456727e87bf2fdf25a5c7bde26792b43210885312fe57"}},{"ruleId":"D2","level":"warning","message":{"text":"generate-settings-doc.renderSections (cognitive 16): generate-settings-doc.renderSections has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (12 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":"scripts/generate-settings-doc.ts"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1d3907a83a5b1508ade5641503f447a5699155c52ca35d76352ed0e3d102647"}},{"ruleId":"D2","level":"warning","message":{"text":"run_regression_check.processResults (cognitive 16): run_regression_check.processResults has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (10 pts), loops 3 (5 pts), boolean chains 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/run_regression_check.js"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"16a3ef5f94e194595efd1aa29bb5cf039e4700e6f37b6da9459681a461d080a7"}},{"ruleId":"D2","level":"warning","message":{"text":"eval-inventory.formatInventoryJson (cognitive 16): eval-inventory.formatInventoryJson has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (9 pts), loops 4, boolean chains 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":"scripts/utils/eval-inventory.ts"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"242305bab69233986e7f4c486bc6bd45218ef80a02473ccc00638a85b242a688"}},{"ruleId":"D2","level":"warning","message":{"text":"github.handleEgressEvent (cognitive 16): github.handleEgressEvent has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (9 pts), boolean chains 4, loops 1 (2 pts), match/switch 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tools/caretaker-agent/cloudrun/egress-service/src/actions/github.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e931a8fe91f339305f711b08225bf3132cc2d6d9b2e7aa9db842b56fd5b748d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AppContainer.AppContainer: FunctionTooLong \u2014 AppContainer runs 1975 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 1875 over it, 19.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":"packages/cli/src/ui/AppContainer.tsx"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"d45329fc6207770cc44acc25172a7085adfa5300100009784deb93a57088aba5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useGeminiStream.useGeminiStream: FunctionTooLong \u2014 useGeminiStream runs 1387 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 1287 over it, 13.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":"packages/cli/src/ui/hooks/useGeminiStream.ts"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3a047406be324f1f8e70cbca8101b47c7d119834149d1ede716f271edcb318f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: vim-buffer-actions.handleVimAction: FunctionTooLong \u2014 handleVimAction runs 1187 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 1087 over it, 11.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":"packages/cli/src/ui/components/shared/vim-buffer-actions.ts"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"26efaa8c896d46fc1c85863850e6fbdb76a0489fed43f84a7b3543ee50278f81"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Config: TooManyMethods \u2014 273 methods. The bar is 30 methods; this is 243 over it, 9.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":"packages/core/src/config/config.ts"},"region":{"startLine":753}}}],"partialFingerprints":{"codehealthFindingId/v1":"d675abbe43d9c04247b9ce14837b3c051ef45d6f16a7ab254a9900a624cafa98"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: vim.useVim: FunctionTooLong \u2014 useVim runs 846 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 746 over it, 8.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":"packages/cli/src/ui/hooks/vim.ts"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f2eee6a7604517079d4b9850051db30ba7e8cef3ec077d4ed1c0ee1c10cd322"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: text-buffer.useTextBuffer: FunctionTooLong \u2014 useTextBuffer 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":"packages/cli/src/ui/components/shared/text-buffer.ts"},"region":{"startLine":2832}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f90115a860b5c5eeb240068751a439f80d8cfffcf03d8feaefee32f21108c05"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: config/settingsSchema.ts: FileTooLong \u2014 3049 significant lines (blank, comment-only and punctuation-only lines excluded), about 82% of them inside a single declaration: SETTINGS_SCHEMA (159-3028). The bar is 500 significant lines; this is 2549 over it, 6.10\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/config/settingsSchema.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb10ea0bc8aefb35567f86e3160c7ff625d59b1b962ca56e280ca7a52f1cefbc"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: sandbox.start_sandbox: FunctionTooLong \u2014 start_sandbox 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":"packages/cli/src/utils/sandbox.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"db6d8ee85f717af4a2dd82b7e4c28e1b40d3c088e1553f3f42c19466e4eeb867"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: shared/text-buffer.ts: FileTooLong \u2014 2701 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 2201 over it, 5.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":"packages/cli/src/ui/components/shared/text-buffer.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"027ff9471dcb2f406373bdb0ef4ce5f6ccc710e68be78d120e7a85c32d836e37"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: config/config.ts: FileTooLong \u2014 2674 significant lines (blank, comment-only and punctuation-only lines excluded), about 78% of them inside a single declaration: Config (753-4203). The bar is 500 significant lines; this is 2174 over it, 5.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":"packages/core/src/config/config.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad3ed8f7af1b32ff7ab16b25954f0c25e6f6959d25fbee191c23cac58b8a573f"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Config: ClassTooLong \u2014 2090 significant lines (blank, comment-only and punctuation-only lines excluded), 273 methods. The bar is 400 significant lines; this is 1690 over it, 5.23\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/config/config.ts"},"region":{"startLine":753}}}],"partialFingerprints":{"codehealthFindingId/v1":"11c5962499632aa8c00209b0b12462350c6db5b372582f26cf99c130f7ba5f5c"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AppContainer: ClassTooLong \u2014 1975 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 1575 over it, 4.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":"packages/cli/src/ui/AppContainer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"36455121cef347a7efb19e220a5fbb832b6e3f51e471bddea1a85cf2eb2144e8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: slashCommandProcessor.useSlashCommandProcessor: FunctionTooLong \u2014 useSlashCommandProcessor 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":"packages/cli/src/ui/hooks/slashCommandProcessor.ts"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"c67fd7e8ff85a831600f864cbe9e534b2329caa05693c50b6e800ae4844ef141"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ShellToolInvocation.execute: MethodTooLong \u2014 execute runs 458 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 358 over it, 4.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":"packages/core/src/tools/shell.ts"},"region":{"startLine":523}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6349b307adcf8ed2a2018cdf033ddfef8666aeb322168b55b28090105d44836"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: VirtualizedList.VirtualizedList: FunctionTooLong \u2014 VirtualizedList runs 453 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 353 over it, 4.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":"packages/cli/src/ui/components/shared/VirtualizedList.tsx"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dcaf9331c0d88c7cb5123a9177853fa4bee6abdf49151d8136b21a7af82ee29"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/AppContainer.tsx: FileTooLong \u2014 2176 significant lines (blank, comment-only and punctuation-only lines excluded), about 91% of them inside a single declaration: AppContainer (223-2869). The bar is 500 significant lines; this is 1676 over it, 4.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":"packages/cli/src/ui/AppContainer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b154323984bcdad8d2de2ae02961b52333bfe6aaeca8d60babfd123177c8d2a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: nonInteractiveCliAgentSession.runNonInteractive: FunctionTooLong \u2014 runNonInteractive runs 435 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 335 over it, 4.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":"packages/cli/src/nonInteractiveCliAgentSession.ts"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"6480d41ce308633bb83b9ee3fa4f648f0d20d05c292279614645b5d590980c5b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: App.App: FunctionTooLong \u2014 App runs 434 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 334 over it, 4.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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fce3fa9667d9f96b956ef4a72083ff5baa2a60367dce3e9ebefc204bd026a48"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useExecutionLifecycle.useExecutionLifecycle: FunctionTooLong \u2014 useExecutionLifecycle runs 426 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 326 over it, 4.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":"packages/cli/src/ui/hooks/useExecutionLifecycle.ts"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"909c412e341d5e2c8cc5b51a420b0f36b4f8eb9bf5488e9f053d9948876d5cc8"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ShellExecutionService.executeWithPty: MethodTooLong \u2014 executeWithPty runs 421 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 321 over it, 4.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":"packages/core/src/services/shellExecutionService.ts"},"region":{"startLine":1103}}}],"partialFingerprints":{"codehealthFindingId/v1":"f89d4276ff87ca6a9de62b99803ca00c7268c109af3c150bd59a25f14953e28f"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Session.#resolvePrompt: MethodTooLong \u2014 #resolvePrompt runs 392 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 292 over it, 3.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":"packages/cli/src/acp/acpSession.ts"},"region":{"startLine":969}}}],"partialFingerprints":{"codehealthFindingId/v1":"11dae3d5168ed5a929bc80ef88f024d0c41c8cd03a9dcb7d271cd887be78c243"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: nonInteractiveCli.runNonInteractive: FunctionTooLong \u2014 runNonInteractive runs 380 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 280 over it, 3.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":"packages/cli/src/nonInteractiveCli.ts"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"c71df2e635266ac7b044e24af01e650a4d02a27865432d3bb77fbe35b7605c0f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: telemetry/types.ts: FileTooLong \u2014 1845 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1345 over it, 3.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":"packages/core/src/telemetry/types.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6adf08a8d62e0632024d9233368b95fa988017d64cf382837f21340123542d2f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: BaseSettingsDialog.BaseSettingsDialog: FunctionTooLong \u2014 BaseSettingsDialog 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":"packages/cli/src/ui/components/shared/BaseSettingsDialog.tsx"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"e887b09db7338d59819e3f2ab0d14a3bcccee636ad453203d04c989cc8ba1752"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Config.constructor: MethodTooLong \u2014 constructor runs 350 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 250 over it, 3.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":"packages/core/src/config/config.ts"},"region":{"startLine":993}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fa39d2c7a57b8710719ba82de214d922941a2b2fc6c1bc0c945e1dd1c4f2c4a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: CoderAgentExecutor.execute: MethodTooLong \u2014 execute 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":"packages/a2a-server/src/agent/executor.ts"},"region":{"startLine":439}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7d16b0970eb4d073c0843d8f1ef34d57a2361116d616577c46361ad91780f0f"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: useGeminiStream: ClassTooLong \u2014 1387 significant lines (blank, comment-only and punctuation-only lines excluded), 6 methods. The bar is 400 significant lines; this is 987 over it, 3.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":"packages/cli/src/ui/hooks/useGeminiStream.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c68c3e87cb3eeeec0eb99515d85246c504fa47c8a227c7ce48b9f83fc99cd0ff"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: hooks/useGeminiStream.ts: FileTooLong \u2014 1557 significant lines (blank, comment-only and punctuation-only lines excluded), about 89% of them inside a single declaration: useGeminiStream (224-2299). The bar is 500 significant lines; this is 1057 over it, 3.11\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/hooks/useGeminiStream.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"10639295a9a9ce921867bd93a6a5183c3549a7f9c37e9d7852d04b2c15eb527f"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: InputPrompt: ClassTooLong \u2014 1240 significant lines (blank, comment-only and punctuation-only lines excluded), 5 methods. The bar is 400 significant lines; this is 840 over it, 3.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":"packages/cli/src/ui/components/InputPrompt.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b8d34f621bbdb6a9b777b3120084b2251af8ba8a01035b5200b90effcccfe1b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: gemini.main: FunctionTooLong \u2014 main 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":"packages/cli/src/gemini.tsx"},"region":{"startLine":466}}}],"partialFingerprints":{"codehealthFindingId/v1":"929d6da61d80f4788e7126112be9f5ab82a8c32662a9cf3c3c01989ae9c072ee"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/App.tsx: FileTooLong \u2014 1535 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1035 over it, 3.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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"445fe0aaca449b7b26394a511dd136284968a636a3ea2be325598a073f3c9293"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: config.parseArguments: FunctionTooLong \u2014 parseArguments runs 299 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 199 over it, 2.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":"packages/cli/src/config/config.ts"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"34e0ad4b75940ba7a35ed4c04e973eb2b57c733cca52ef5565bed94707d00884"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useCommandCompletion.useCommandCompletion: FunctionTooLong \u2014 useCommandCompletion runs 295 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 195 over it, 2.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":"packages/cli/src/ui/hooks/useCommandCompletion.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbd661cf4cf03d43b612d40a6d29ddd10e27a5de08b2f703a7df5a4d690f1401"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: tools/mcp-client.ts: FileTooLong \u2014 1443 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 943 over it, 2.89\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/mcp-client.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4c801ef9e07c175ec57c6b12d8fa599e9f24d5eccb6b22bd0cf710859285cb0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: App.NetworkView: FunctionTooLong \u2014 NetworkView 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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":831}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7860adc6a81d1b9ea1b98a960da7293fa3c72a97ff46174e25ec42b4ea5b64c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useVoiceMode.useVoiceMode: FunctionTooLong \u2014 useVoiceMode runs 281 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 181 over it, 2.81\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/hooks/useVoiceMode.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b884fe8fa9d8dec5e8f505425ae5a5b7b807c66a0fcb42ffa02a6a578f3b085"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: components/InputPrompt.tsx: FileTooLong \u2014 1396 significant lines (blank, comment-only and punctuation-only lines excluded), about 89% of them inside a single declaration: InputPrompt (207-1933). The bar is 500 significant lines; this is 896 over it, 2.79\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/InputPrompt.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"591d6daf52604c4907db74dd0dee76e1b4545be367e8db3d88ae4bfd48714e05"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ShellExecutionService: ClassTooLong \u2014 1062 significant lines (blank, comment-only and punctuation-only lines excluded), 23 methods. The bar is 400 significant lines; this is 662 over it, 2.66\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":"packages/core/src/services/shellExecutionService.ts"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"7053683b22b9701cdbb7d366e5b93995751f3acb34c0c8c6937a0c8c6a3b990e"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ExtensionManager.installOrUpdateExtension: MethodTooLong \u2014 installOrUpdateExtension 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":"packages/cli/src/config/extension-manager.ts"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddb7b57c8680e4be03b68ddf4bc85da2742201962f26a50638a451723cedd6f5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: services/shellExecutionService.ts: FileTooLong \u2014 1288 significant lines (blank, comment-only and punctuation-only lines excluded), about 82% of them inside a single declaration: ShellExecutionService (374-2021). The bar is 500 significant lines; this is 788 over it, 2.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":"packages/core/src/services/shellExecutionService.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7a09d7738241bb8de1d9c2041258133bd86330b07a0303224108b1e72306f0f"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ClearcutLogger: ClassTooLong \u2014 1027 significant lines (blank, comment-only and punctuation-only lines excluded), 71 methods. The bar is 400 significant lines; this is 627 over it, 2.57\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts"},"region":{"startLine":294}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6f075b376ab060696d1e917e0bbb606eb6151d405ecdcd37ad1e51bff643b82"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: telemetry/metrics.ts: FileTooLong \u2014 1260 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 760 over it, 2.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":"packages/core/src/telemetry/metrics.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d4b009bc56858b80b966e8043507cf46533e4b77f3ed6dbb19b102d746f35bc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: shared/vim-buffer-actions.ts: FileTooLong \u2014 1255 significant lines (blank, comment-only and punctuation-only lines excluded), about 95% of them inside a single declaration: handleVimAction (164-1849). The bar is 500 significant lines; this is 755 over it, 2.51\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":"packages/cli/src/ui/components/shared/vim-buffer-actions.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"07148e63e94791d4cec07b8bbc3ebbb5aad6fbd3be0dc3ea463db5342a199fec"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: patch-create-comment.main: FunctionTooLong \u2014 main runs 251 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 151 over it, 2.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":"scripts/releasing/patch-create-comment.js"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b104f42cc759ef02fd078df4fa94ef60f96ec784e0e5ba10c8ef956f9f207e5"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Session: ClassTooLong \u2014 993 significant lines (blank, comment-only and punctuation-only lines excluded), 17 methods. The bar is 400 significant lines; this is 593 over it, 2.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":"packages/cli/src/acp/acpSession.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"7149e4b531d9d9b51d600171baef0da5b6398a96f166c4f06790ea2dda1d641d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: toml-loader.loadPoliciesFromToml: FunctionTooLong \u2014 loadPoliciesFromToml runs 248 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 148 over it, 2.48\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/policy/toml-loader.ts"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e8d5e61552cd2f6b228f0f180bf8e64afbc8b57b31a0535f836e2a6a5391945"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ModelDialog.ModelDialog: FunctionTooLong \u2014 ModelDialog runs 247 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"packages/cli/src/ui/components/ModelDialog.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"50e972f298be3463c516264ed9fc568f0fdaef1e9668c4aa108e2da693cc082a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: clearcut-logger/clearcut-logger.ts: FileTooLong \u2014 1233 significant lines (blank, comment-only and punctuation-only lines excluded), about 83% of them inside a single declaration: ClearcutLogger (294-2205). The bar is 500 significant lines; this is 733 over it, 2.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":"packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff0ac36a3e7b2e5bcbfd6b5c97c9251f9ea472ce4c930a6c8249e5f4a4155d50"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BrowserAgentInvocation.execute: MethodTooLong \u2014 execute runs 242 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 142 over it, 2.42\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/agents/browser/browserAgentInvocation.ts"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"79b23c259e44895715366aba9b93c2a309ab9b9549a60fbbf959ed0f7a9c8316"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ClearcutLogger: TooManyMethods \u2014 71 methods. The bar is 30 methods; this is 41 over it, 2.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":"packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts"},"region":{"startLine":294}}}],"partialFingerprints":{"codehealthFindingId/v1":"636f1d975b64c9038cfb1e5e5a1d7102ecd6b48363972dcf488681c9c7cf641f"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ShellExecutionService.childProcessFallback: MethodTooLong \u2014 childProcessFallback 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":"packages/core/src/services/shellExecutionService.ts"},"region":{"startLine":652}}}],"partialFingerprints":{"codehealthFindingId/v1":"686f657a17d525293e091581c85aa86db0620dfb6f8d8069325c08ea201a01ac"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ThemeDialog.ThemeDialog: FunctionTooLong \u2014 ThemeDialog 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":"packages/cli/src/ui/components/ThemeDialog.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1f4f98f679f27c55909b4d20470acc3b601378b64be697240cf8667f1bc3c4f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: core/geminiChat.ts: FileTooLong \u2014 1139 significant lines (blank, comment-only and punctuation-only lines excluded), about 73% of them inside a single declaration: GeminiChat (372-1745). The bar is 500 significant lines; this is 639 over it, 2.28\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/core/geminiChat.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5024eb90f2b8f7cc134558aa59035257c8267a8dca3ec423e3100ea51ad4605"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SettingsDialog.SettingsDialog: FunctionTooLong \u2014 SettingsDialog 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":"packages/cli/src/ui/components/SettingsDialog.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd0f0a4b762c6c62ad9b3c6517bae2c2e69a8e347c8cab40f85007a510944761"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useQuotaAndFallback.useQuotaAndFallback: FunctionTooLong \u2014 useQuotaAndFallback 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":"packages/cli/src/ui/hooks/useQuotaAndFallback.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"a28b57e48467b77ef83116a20eb9a2614d6af22fd90e9f22baf9e4dc2c0e57f8"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: GeminiChat.sendMessageStream: MethodTooLong \u2014 sendMessageStream 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":"packages/core/src/core/geminiChat.ts"},"region":{"startLine":480}}}],"partialFingerprints":{"codehealthFindingId/v1":"24935dd7f5d80a765b7fbe74d16f34a5bac3ff0fb89369b45d157b75b278424e"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ReadManyFilesToolInvocation.execute: MethodTooLong \u2014 execute 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":"packages/core/src/tools/read-many-files.ts"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e7fb0ee00ecc45608f4a89202932a5bc1f1ef189bad40cba57b021621838ad0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: memoryService.startMemoryService: FunctionTooLong \u2014 startMemoryService 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":"packages/core/src/services/memoryService.ts"},"region":{"startLine":1133}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fba331e0ca7da7fc7a6b26198381f58dfe625adc1d8b23fb6c1b127c6d983ad"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Session.runTool: MethodTooLong \u2014 runTool 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":"packages/cli/src/acp/acpSession.ts"},"region":{"startLine":659}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f9bbd51aae1cc6a07c82670644e5b800d41385ff427fe0aaf93acdaf9853ac0"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: LocalAgentExecutor: ClassTooLong \u2014 878 significant lines (blank, comment-only and punctuation-only lines excluded), 18 methods. The bar is 400 significant lines; this is 478 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":"packages/core/src/agents/local-executor.ts"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"39948dade8f02a62e04019b49d99c1a4badee886398afaf4b8d58e240013ab2e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ExtensionDetails.ExtensionDetails: FunctionTooLong \u2014 ExtensionDetails 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":"packages/cli/src/ui/components/views/ExtensionDetails.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2265f6a3eb2cb4b2c61454ca9f4fd5363e30aec985f0128def508a9d9f263db"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: LocalAgentExecutor.runInternal: MethodTooLong \u2014 runInternal 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":"packages/core/src/agents/local-executor.ts"},"region":{"startLine":571}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6935a4feb0459dd005db366211ef282eacce9091eed1020f1358233c69c6c31"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: PolicyEngine.check: MethodTooLong \u2014 check 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":"packages/core/src/policy/policy-engine.ts"},"region":{"startLine":600}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e72c9fa178226aab378c615497295ea94974599b258f62220f83f7068d6eaf2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: setup.handleSetup: FunctionTooLong \u2014 handleSetup 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":"packages/cli/src/commands/gemma/setup.ts"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe1027b8832252a8dc12cb2a8f2018a3fcf39676b15ebf2be851593fd11103b7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MainContent.MainContent: FunctionTooLong \u2014 MainContent 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":"packages/cli/src/ui/components/MainContent.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ae58408e7d14c53f302615a40e4a675b3f37bc379a9af5cd71498a81e4190f0"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: LocalSessionInvocation.execute: MethodTooLong \u2014 execute runs 211 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 111 over it, 2.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":"packages/core/src/agents/local-session-invocation.ts"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"37543f2a9c67510d13d2ca5fbce73a408a53239c67d9641394dbb7d653bb50d9"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Task: ClassTooLong \u2014 841 significant lines (blank, comment-only and punctuation-only lines excluded), 31 methods. The bar is 400 significant lines; this is 441 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":"packages/a2a-server/src/agent/task.ts"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"e97b92708152654d83d67e46db35747a994484092849d4bd87d88972359e6af6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: config.createPolicyEngineConfig: FunctionTooLong \u2014 createPolicyEngineConfig 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":"packages/core/src/policy/config.ts"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6fd0a95fa174262f8b77d4461f2d788717c0db7782f514d1b948949da76224f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: acp/acpSession.ts: FileTooLong \u2014 1048 significant lines (blank, comment-only and punctuation-only lines excluded), about 95% of them inside a single declaration: Session (65-1551). The bar is 500 significant lines; this is 548 over it, 2.10\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/acp/acpSession.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"044dc49a3fe11ac7c513f5174b40ca0158cc067608e194af674fbcb2e0662d3d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: DenseToolMessage.DenseToolMessage: FunctionTooLong \u2014 DenseToolMessage 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":"packages/cli/src/ui/components/messages/DenseToolMessage.tsx"},"region":{"startLine":261}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e4be563fdebe43a5eca6baec1005df41d33186ed319747479f3fc2d9ca856e2"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: GeminiChat: ClassTooLong \u2014 833 significant lines (blank, comment-only and punctuation-only lines excluded), 23 methods. The bar is 400 significant lines; this is 433 over it, 2.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":"packages/core/src/core/geminiChat.ts"},"region":{"startLine":372}}}],"partialFingerprints":{"codehealthFindingId/v1":"330f447b4d9bbe77197d8a8e96f69c2a58940c508641bc89c40b6125c6efdd0d"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Storage: TooManyMethods \u2014 62 methods. The bar is 30 methods; this is 32 over it, 2.07\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/config/storage.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d4ff1837ec0c4c22f4e62a3226236432b95f7409ff5170ed994164819007f36"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ExtensionRegistryView.ExtensionRegistryView: FunctionTooLong \u2014 ExtensionRegistryView 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":"packages/cli/src/ui/components/views/ExtensionRegistryView.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc0d94912442905ac4c90c63ca7594b1ab9ec714e83864fb57e00d5bdda48a69"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ToolConfirmationMessage: ClassTooLong \u2014 811 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 411 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":"packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fd7687945027efca6a5a68e9df5bce16d9f8d8199683ba165ceccfbc9065b69"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: components/InboxDialog.tsx: FileTooLong \u2014 1008 significant lines (blank, comment-only and punctuation-only lines excluded), about 79% of them inside a single declaration: InboxDialog (331-1446). The bar is 500 significant lines; this is 508 over it, 2.02\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":"packages/cli/src/ui/components/InboxDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"617fb32ef9a62b51f0f27d92d5a661038241818842a89730aa34ac0785627cdd"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: InboxDialog: ClassTooLong \u2014 801 significant lines (blank, comment-only and punctuation-only lines excluded), 9 methods. The bar is 400 significant lines; this is 401 over it, 2.00\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/InboxDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a01ce39187ee82b266733349c139677f617a0df61671529d4f20947e0ee463eb"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Session.prompt: MethodTooLong \u2014 prompt 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":"packages/cli/src/acp/acpSession.ts"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a25cd5c9b0b7050831582df722cd285da2966d0867af1e85f99a66a201df390"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: mcp-client.connectToMcpServer: FunctionTooLong \u2014 connectToMcpServer 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":"packages/core/src/tools/mcp-client.ts"},"region":{"startLine":1839}}}],"partialFingerprints":{"codehealthFindingId/v1":"b09fe00be261a7f4b4061692eb953d71de2b13f3669bfca898dff61c122702a0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: tools/edit.ts: FileTooLong \u2014 992 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 492 over it, 1.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":"packages/core/src/tools/edit.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d326af1dc41f72ab294f758790c83dd331e8255cf5826bb46c636c958ce48b29"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: GeminiClient: ClassTooLong \u2014 788 significant lines (blank, comment-only and punctuation-only lines excluded), 34 methods. The bar is 400 significant lines; this is 388 over it, 1.97\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/core/client.ts"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fefd0cba65bc953f6515765e56066e873a41acc0b4888d50430b682df25ed28"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: GeminiChat.processStreamResponse: MethodTooLong \u2014 processStreamResponse runs 197 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 97 over it, 1.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":"packages/core/src/core/geminiChat.ts"},"region":{"startLine":1354}}}],"partialFingerprints":{"codehealthFindingId/v1":"0be7c93012bef757adb0c25436c9ad2757ddb98982dc5c364292483d36596ce1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: config/extension-manager.ts: FileTooLong \u2014 982 significant lines (blank, comment-only and punctuation-only lines excluded), about 77% of them inside a single declaration: ExtensionManager (105-1243). The bar is 500 significant lines; this is 482 over it, 1.96\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":"packages/cli/src/config/extension-manager.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"37eed634390769b6c7feb6d912abe8c052b3eff02f804f7c3d30dc3671197602"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: agents/local-executor.ts: FileTooLong \u2014 975 significant lines (blank, comment-only and punctuation-only lines excluded), about 90% of them inside a single declaration: LocalAgentExecutor (120-1525). The bar is 500 significant lines; this is 475 over it, 1.95\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":"packages/core/src/agents/local-executor.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"33d85233266eda50a651925c4c79dd14a963a63af06faf5ec129d3b9ed411745"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: hooks/vim.ts: FileTooLong \u2014 974 significant lines (blank, comment-only and punctuation-only lines excluded), about 87% of them inside a single declaration: useVim (187-1536). The bar is 500 significant lines; this is 474 over it, 1.95\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":"packages/cli/src/ui/hooks/vim.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b509bce198061ed517641f3ee0cf37ce2c038e34417d803d92a9db4402d42ba1"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: GeminiClient.processTurn: MethodTooLong \u2014 processTurn 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":"packages/core/src/core/client.ts"},"region":{"startLine":614}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f377695ec8c31d19ee39e610266089d5c8252de6515d44ee5eebd651342f640"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: patch-trigger.main: FunctionTooLong \u2014 main 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":"scripts/releasing/patch-trigger.js"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"62d83608729d08456b16899ad42b8e17922e0138c0707138f97f1f7c7e94fd70"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ExtensionManager._buildExtension: MethodTooLong \u2014 _buildExtension runs 192 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 92 over it, 1.92\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/config/extension-manager.ts"},"region":{"startLine":708}}}],"partialFingerprints":{"codehealthFindingId/v1":"12f65383569e3e49738ce48f508b476c2d6b5361a42cf52bfbe2c8b0ea4983b5"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: LocalSubagentInvocation.execute: MethodTooLong \u2014 execute runs 192 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 92 over it, 1.92\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/agents/local-invocation.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"aeee3c7809e690f5e53c643b6d649d4a0c14ce338e446fd33b0ffc8f1e9e990e"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ExtensionManager: ClassTooLong \u2014 754 significant lines (blank, comment-only and punctuation-only lines excluded), 21 methods. The bar is 400 significant lines; this is 354 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":"packages/cli/src/config/extension-manager.ts"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"15e108f72870b4f997314d069bc4de6364c97d4d6b1b3f8d5b33745e32343848"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: PromptProvider.getCoreSystemPrompt: MethodTooLong \u2014 getCoreSystemPrompt 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":"packages/core/src/prompts/promptProvider.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"81260dec4da2f097cc8c1cc99b50344fbdcd40d74538dc0d39cbe67760a9e30f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: retry.retryWithBackoff: FunctionTooLong \u2014 retryWithBackoff 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":"packages/core/src/utils/retry.ts"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"91ca9cabda2f6de8a6a0e47b117ed425ce946e3737d1d4599ad9b6bd9f4d75d3"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: services/memoryService.ts: FileTooLong \u2014 928 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 428 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":"packages/core/src/services/memoryService.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"971c68de047e9b257453bd222c2bf3c5db89cc119b294a63b3ea6a035556c657"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: components/AskUserDialog.tsx: FileTooLong \u2014 919 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 419 over it, 1.84\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/AskUserDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1df6049238249af202e86235c7703f9cb884ce72aaaa9575c064b83eca5c7fad"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ShellToolInvocation: ClassTooLong \u2014 733 significant lines (blank, comment-only and punctuation-only lines excluded), 12 methods. The bar is 400 significant lines; this is 333 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":"packages/core/src/tools/shell.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0d9fc0e8455acdfd958382756a4bed951e5828a3cd3ebaad371236cad33f7f0"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: GeminiChat.makeApiCallAndProcessStream: MethodTooLong \u2014 makeApiCallAndProcessStream 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":"packages/core/src/core/geminiChat.ts"},"region":{"startLine":870}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd45cadcdccf1e147e6735643b0ca987805d3e60c196535c7952a1021db846e9"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: agent/task.ts: FileTooLong \u2014 906 significant lines (blank, comment-only and punctuation-only lines excluded), about 93% of them inside a single declaration: Task (74-1305). The bar is 500 significant lines; this is 406 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":"packages/a2a-server/src/agent/task.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d1e330bae031e6c47005f9cb6d66db0fe79f47c4e7cd64bb1b610e2cbd01e93"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useAtCompletion.useAtCompletion: FunctionTooLong \u2014 useAtCompletion 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":"packages/cli/src/ui/hooks/useAtCompletion.ts"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a1f4b0621e493f2e975f686274c2124f5359fe56d5bfbcb903d9c716378f102"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: oauth2.initOauthClient: FunctionTooLong \u2014 initOauthClient 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":"packages/core/src/code_assist/oauth2.ts"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"42fdfc7297d1713d25ae7116de98200a0cd395536006f1900540a7ba616c8243"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: TriageDuplicates: ClassTooLong \u2014 720 significant lines (blank, comment-only and punctuation-only lines excluded), 3 methods. The bar is 400 significant lines; this is 320 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":"packages/cli/src/ui/components/triage/TriageDuplicates.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"99143283bb0050cac4ce09e2877e4feb53dbc4f840f1a68f45024634c02ea9f5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: utils/sandbox.ts: FileTooLong \u2014 885 significant lines (blank, comment-only and punctuation-only lines excluded), about 66% of them inside a single declaration: start_sandbox (55-1031). The bar is 500 significant lines; this is 385 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":"packages/cli/src/utils/sandbox.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf2ef6feb9f375b0426ddb529896acf4b37df62330eec10743349bf571aacce8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: config/config.ts: FileTooLong \u2014 880 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 380 over it, 1.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":"packages/cli/src/config/config.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3f8f8a4a2109df0f9598d1e8a07403fc6be6c5a22deec83a17180b38c999835"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: config/settings.ts: 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":"packages/cli/src/config/settings.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"60b74a33babb8ced7e84c9e0e93f7a7baeddd5138aaa20bb895da52f0c570535"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: MCPOAuthProvider.authenticate: MethodTooLong \u2014 authenticate 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":"packages/core/src/mcp/oauth-provider.ts"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"404487714fd8adfd054e05e36ec4b663c6f94cd7ea01f8063c6b878af8b1db66"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: core/client.ts: FileTooLong \u2014 869 significant lines (blank, comment-only and punctuation-only lines excluded), about 91% of them inside a single declaration: GeminiClient (93-1299). The bar is 500 significant lines; this is 369 over it, 1.74\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/core/client.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c37c78e7186006a92dd3cbd745bed832263238861d393939d5cfc32ddc88e315"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: tools/shell.ts: FileTooLong \u2014 866 significant lines (blank, comment-only and punctuation-only lines excluded), about 85% of them inside a single declaration: ShellToolInvocation (102-1177). 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":"packages/core/src/tools/shell.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"094d09f2e3bc079cfaf01e546cc6f87717ed7cc3a71317cd5af44102193a878e"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ActivityLogger.patchNodeHttp: MethodTooLong \u2014 patchNodeHttp 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":"packages/cli/src/utils/activityLogger.ts"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"9196a47f05b9f2f6a9898f374f75e1754b046a9158b4e40a2798d05910cb2bf7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: messages/ToolConfirmationMessage.tsx: FileTooLong \u2014 864 significant lines (blank, comment-only and punctuation-only lines excluded), about 94% of them inside a single declaration: ToolConfirmationMessage (63-1107). The bar is 500 significant lines; this is 364 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":"packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"51ef5f783434380a3f3b2b9f21faa1d32d13e58d083faac3e249875e2f3a1ea2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: theme.createCustomTheme: FunctionTooLong \u2014 createCustomTheme 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":"packages/cli/src/ui/themes/theme.ts"},"region":{"startLine":394}}}],"partialFingerprints":{"codehealthFindingId/v1":"85b91b24d4b3dccd118f39dd6e955ee4cef097d88d013ddc4ea8576d6e6298ca"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: GrepToolInvocation.performGrepSearch: MethodTooLong \u2014 performGrepSearch 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":"packages/core/src/tools/grep.ts"},"region":{"startLine":413}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f0bb0361a25a89632fc34bdea441aee9a484183cc9685b630d5c7a2b11ef4dc"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: sandbox.start_lxc_sandbox: FunctionTooLong \u2014 start_lxc_sandbox 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":"packages/cli/src/utils/sandbox.ts"},"region":{"startLine":1039}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ab272fc0c31f1112a769a7ee5f7114e94f0d0f477c7902562dbf3a4eb35bbb0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: commands/memory.ts: FileTooLong \u2014 839 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 339 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":"packages/core/src/commands/memory.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ff574ba7b2398324ea6ea6506ccbe8bb65f2e9e1ce6e3f43425498cb6bf838b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useSlashCompletion.useCommandSuggestions: FunctionTooLong \u2014 useCommandSuggestions 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":"packages/cli/src/ui/hooks/useSlashCompletion.ts"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"59a3af82c9d96dfdb30b5e7b97ee4cc52a61009aad5ee60c679ec77641b60877"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ScrollableList.ScrollableList: FunctionTooLong \u2014 ScrollableList 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":"packages/cli/src/ui/components/shared/ScrollableList.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd3fccc859273c53cb27d0833f03c40bc4f15465b19123c7a7a45c650d815b78"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: IDEServer.start: MethodTooLong \u2014 start 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":"packages/vscode-ide-companion/src/ide-server.ts"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcd5c52763943e168257e24b07566425e18f74b9c032c88edaab9efa56305609"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: create-patch-pr.main: FunctionTooLong \u2014 main 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":"scripts/releasing/create-patch-pr.js"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"119d1fadba731ec3d8921f9e89a432cdc3cfade3692b8fbd893503e06ff31967"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: LocalAgentExecutor.processFunctionCalls: MethodTooLong \u2014 processFunctionCalls runs 160 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"packages/core/src/agents/local-executor.ts"},"region":{"startLine":1105}}}],"partialFingerprints":{"codehealthFindingId/v1":"97dffbc167b8c460af59deb10d4a26041ea4c7bcb137ee287395f48ad3a3610e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: triage/TriageDuplicates.tsx: FileTooLong \u2014 792 significant lines (blank, comment-only and punctuation-only lines excluded), about 91% of them inside a single declaration: TriageDuplicates (105-1054). 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":"packages/cli/src/ui/components/triage/TriageDuplicates.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"951120ead17d76fb97ab15a5bff1ecf3976efdacd8aaba3298f3f650bdaa8c4f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AuthDialog.AuthDialog: FunctionTooLong \u2014 AuthDialog 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":"packages/cli/src/ui/auth/AuthDialog.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"75bc2445d959741091a8da3fdd96d6a87f1f5a7c95863c21c24403c6532d5294"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useToolScheduler.useToolScheduler: FunctionTooLong \u2014 useToolScheduler 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":"packages/cli/src/ui/hooks/useToolScheduler.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d1ec087a6a7b6b30e2617b5cdaee432b9d01d2bfe55e5a368e4d50abe5085a3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: activityLogger.setupNetworkLogging: FunctionTooLong \u2014 setupNetworkLogging 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":"packages/cli/src/utils/activityLogger.ts"},"region":{"startLine":734}}}],"partialFingerprints":{"codehealthFindingId/v1":"a88484ff93c45a3220f901294f5c59fb9ae72ae4d5e1098b131a4da6c363e6d5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: contentGenerator.createContentGenerator: FunctionTooLong \u2014 createContentGenerator 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":"packages/core/src/core/contentGenerator.ts"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa839b65687b25a0c14f47043c64b9206a6c0c2a67ed3004cd5042c94755fed9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AgentConfigDialog.AgentConfigDialog: FunctionTooLong \u2014 AgentConfigDialog 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":"packages/cli/src/ui/components/AgentConfigDialog.tsx"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"738ef3e6ee8667f3e121889d01f282fe634512bc419c0fd2ec8268b480ecf9d9"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Scheduler._execute: MethodTooLong \u2014 _execute 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":"packages/core/src/scheduler/scheduler.ts"},"region":{"startLine":730}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d799bbad9a00c74389a8ea2fc13871000120169c1b69217d5b55fe3a05d3e6a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: sdk.initializeTelemetry: FunctionTooLong \u2014 initializeTelemetry 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":"packages/core/src/telemetry/sdk.ts"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"15324985b3bfdae9cad2df2e67e0d4e5ee8456909c1569d601536c75351c6c4a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: patch-comment.main: FunctionTooLong \u2014 main 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":"scripts/releasing/patch-comment.js"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdb890f69666e280fc1ee0a80443ec260924fe71cd7c57f953d97e6b4831e7d4"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: settings.migrateDeprecatedSettings: FunctionTooLong \u2014 migrateDeprecatedSettings 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":"packages/cli/src/config/settings.ts"},"region":{"startLine":1001}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9e1df496b409ac8e8c26c5ff3c4ea05dd5e614d911397725bc0a62a6ac6ec41"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: WriteFileToolInvocation.execute: MethodTooLong \u2014 execute 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":"packages/core/src/tools/write-file.ts"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3c9e344e21ba39cc1e7edafab8ae0fc25fafa4300d73f942c46de638a6c0313"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: oauth-flow.startCallbackServer: FunctionTooLong \u2014 startCallbackServer 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":"packages/core/src/utils/oauth-flow.ts"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"33098e45bb33e1dc0b757d61d9b32951adb243af35dd9fa6c94f3325e3f00cb0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: telemetry/loggers.ts: FileTooLong \u2014 755 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 255 over it, 1.51\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/telemetry/loggers.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b817e84351db698c073746121f65cc1c3346d95d5267d92d161b124247cc86f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: VoiceModelDialog.VoiceModelDialog: FunctionTooLong \u2014 VoiceModelDialog 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":"packages/cli/src/ui/components/VoiceModelDialog.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"09a7b37f1fae09bb11a970ceeb451aa325e5745cd1a35c4f24db258c1cad0f2b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: services/chatRecordingService.ts: FileTooLong \u2014 743 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 243 over it, 1.49\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":"packages/core/src/services/chatRecordingService.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"46cc3e33bffaef44ac9f17ab3df8b5ace61dc8dfd189b6cd581a8c7397befedd"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ToolStatsDisplay.ToolStatsDisplay: FunctionTooLong \u2014 ToolStatsDisplay 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":"packages/cli/src/ui/components/ToolStatsDisplay.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"392567fdba14936e6f2daa1904ee044ccd76ab09644015269effcbf1ad77f8db"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ChatCompressionService.compress: MethodTooLong \u2014 compress 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":"packages/core/src/context/chatCompressionService.ts"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f71d397553a9a2e9548ed0eefb18a7c6c89d9b2ee30b74765da80888a83f02e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: googleQuotaErrors.classifyGoogleError: FunctionTooLong \u2014 classifyGoogleError 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":"packages/core/src/utils/googleQuotaErrors.ts"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"c86dacaa3cdbb2f5d47c072b448cf5617cda245bd84c026ad669733c99883e86"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: settings._doLoadSettings: FunctionTooLong \u2014 _doLoadSettings 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":"packages/cli/src/config/settings.ts"},"region":{"startLine":769}}}],"partialFingerprints":{"codehealthFindingId/v1":"b93a1f2f0c2436f7a5b4bd9b19d1673ce8c679e2f49a6c124b7a71bb6a7ba939"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: app.createApp: FunctionTooLong \u2014 createApp 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":"packages/a2a-server/src/http/app.ts"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"aab58cc32634c7b8d71011f2a8981d9d0ae8fe75662a46f855e6894257e41a6b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: event-translator.translateEvent: FunctionTooLong \u2014 translateEvent 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":"packages/core/src/agent/event-translator.ts"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6e711a93b82af178e2185121de81dc723dc711c5497da2b5a28cacd27f10418"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: CoderAgentExecutor: ClassTooLong \u2014 583 significant lines (blank, comment-only and punctuation-only lines excluded), 10 methods. The bar is 400 significant lines; this is 183 over it, 1.46\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":"packages/a2a-server/src/agent/executor.ts"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"eaa1be098fb16dead2c38be6d2b1fd00d099fe9da8f932ee4905d356af5c2607"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: interactiveCli.startInteractiveUI: FunctionTooLong \u2014 startInteractiveUI 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":"packages/cli/src/interactiveCli.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"540061a815c894e3694c57eb53638c38e25352127141136dd1b88408b8d0955a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: utils/shell-utils.ts: FileTooLong \u2014 721 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 221 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":"packages/core/src/utils/shell-utils.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd5355cb1738dbb000cce8df5c7ddd16e628102f38a206b213cee3bb34de2d74"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: browserAgentFactory.createBrowserAgentDefinition: FunctionTooLong \u2014 createBrowserAgentDefinition 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":"packages/core/src/agents/browser/browserAgentFactory.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4e39e2696abfb68245ca8571c2a1e332ed7c17d4aee6e5461e823109a1a02d6"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ContextCompressionService.compressHistory: MethodTooLong \u2014 compressHistory 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":"packages/core/src/context/contextCompressionService.ts"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5cbb8df245e0e01d1056b66b732cb246fcfd012d983cc57c8b59291e681ed80"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: config.createPolicyUpdater: FunctionTooLong \u2014 createPolicyUpdater 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":"packages/core/src/policy/config.ts"},"region":{"startLine":712}}}],"partialFingerprints":{"codehealthFindingId/v1":"4aa7f90023de7ff1b84c26f29e79a1cf1afca8424de9fccf57484818cd718a6a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: evals/skill_extraction.eval.ts: FileTooLong \u2014 714 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 214 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":"evals/skill_extraction.eval.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"17329648e9cd1e81e7a734c808883b731d17d7df6c39705603ce961cde79f6dc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: prompts/snippets.ts: FileTooLong \u2014 710 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 210 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":"packages/core/src/prompts/snippets.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"18d7ca91bd832af4f440598522753601860c9b3d851d9ae4d7039bbc9c6c51ca"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: EditorSettingsDialog.EditorSettingsDialog: FunctionTooLong \u2014 EditorSettingsDialog 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":"packages/cli/src/ui/components/EditorSettingsDialog.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"298849ec8416944d6cd739ae9bd01f27cd46e8daf726f758c1550db794b8bcd2"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BrowserManager.connectMcp: MethodTooLong \u2014 connectMcp 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":"packages/core/src/agents/browser/browserManager.ts"},"region":{"startLine":559}}}],"partialFingerprints":{"codehealthFindingId/v1":"f56c972d707aa6906edd75a3b8959376225d239a4766446cb6fe6cabb393cbca"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: utils/activityLogger.ts: 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":"packages/cli/src/utils/activityLogger.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7dad9ffb977bf590be71954c451245d55832f3ff8d14d3155823e37e73707bd"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SearchableList.SearchableList: FunctionTooLong \u2014 SearchableList 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":"packages/cli/src/ui/components/shared/SearchableList.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"484bb0843867fd123b32225ac86036b4cc862b019726f449c094c2c0834fb710"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useShellCompletion.useShellCompletion: FunctionTooLong \u2014 useShellCompletion 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":"packages/cli/src/ui/hooks/useShellCompletion.ts"},"region":{"startLine":443}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4c04da921ffaac0ccd34ca19e2442de330dfa39476ffdc7c79d188f3838c385"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Scheduler: ClassTooLong \u2014 559 significant lines (blank, comment-only and punctuation-only lines excluded), 19 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":"packages/core/src/scheduler/scheduler.ts"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"eda646df48daf289ac06d1efb5c3caa220c764db8af929e3e9c9bbd9318f66cb"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: fileUtils.processSingleFileContent: FunctionTooLong \u2014 processSingleFileContent 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":"packages/core/src/utils/fileUtils.ts"},"region":{"startLine":492}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd347dcafbb5c6512aa638ab1b04f95c2c825bf5a4ebb7c0c4b6d3b98fb5574c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: App.BodyView: FunctionTooLong \u2014 BodyView 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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":1426}}}],"partialFingerprints":{"codehealthFindingId/v1":"82b4f7063442459f28df0add8dd4bc7329bae33100814c2c9477ab2767c509f8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/gemini.tsx: FileTooLong \u2014 688 significant lines (blank, comment-only and punctuation-only lines excluded). 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":"packages/cli/src/gemini.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e65509afeedcf5e54f9bbeb314cee0760a6da3a5542861d95f055e2dc51a942"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: usePromptCompletion.usePromptCompletion: FunctionTooLong \u2014 usePromptCompletion 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":"packages/cli/src/ui/hooks/usePromptCompletion.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f6a2abfc21cbd69fbc590ada6f0e8e1ab1a7508170c66675d526baa41709653"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ToolOutputMaskingService.mask: MethodTooLong \u2014 mask 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":"packages/core/src/context/toolOutputMaskingService.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b7652f153a19abbf94079b59edb3238477c72cb6c86fe792ad379c84be27ed2"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: policy/policy-engine.ts: FileTooLong \u2014 662 significant lines (blank, comment-only and punctuation-only lines excluded), about 77% of them inside a single declaration: PolicyEngine (242-1104). The bar is 500 significant lines; this is 162 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":"packages/core/src/policy/policy-engine.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2dcb357f62a8e6d5442f23b19940e0feba0e20281f971f5966ebe3e73a8c540c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: config.loadConfig: FunctionTooLong \u2014 loadConfig runs 132 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"packages/a2a-server/src/config/config.ts"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"11eae9be0d0754c37883b7177c37d2f12580a3b56bbed694eb1b090baf50ca09"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: text-buffer.calculateLayout: FunctionTooLong \u2014 calculateLayout runs 132 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"packages/cli/src/ui/components/shared/text-buffer.ts"},"region":{"startLine":1288}}}],"partialFingerprints":{"codehealthFindingId/v1":"196cbb6dc4ac1096a6dd620c585b8db0f521c341893e2fae9d1701fe8caf8c9f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: toolMaskingProcessor.createToolMaskingProcessor: FunctionTooLong \u2014 createToolMaskingProcessor runs 132 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"packages/core/src/context/processors/toolMaskingProcessor.ts"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"10cb0e08dd19e9097496fc44849ed30e0079fcec17468e4d5371b5da466a03cd"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: EditToolInvocation.execute: MethodTooLong \u2014 execute 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":"packages/core/src/tools/edit.ts"},"region":{"startLine":904}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e571751c47b206d73f4679dd4188c1b0fa763fa8c50c77bd618cc7572bc8ff3"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: GrepToolInvocation.execute: MethodTooLong \u2014 execute 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":"packages/core/src/tools/grep.ts"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"768ab533efcf65c4f34ca43379bd67d23c8e81b6d77a886eb961d87c55833d5b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: tools/web-fetch.ts: FileTooLong \u2014 654 significant lines (blank, comment-only and punctuation-only lines excluded), about 70% of them inside a single declaration: WebFetchToolInvocation (222-894). The bar is 500 significant lines; this is 154 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":"packages/core/src/tools/web-fetch.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6c5562c98cf19cf04462c0386469afc8ed36a10beaa584251ff47945de3d1f5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: agent/executor.ts: FileTooLong \u2014 653 significant lines (blank, comment-only and punctuation-only lines excluded), about 89% of them inside a single declaration: CoderAgentExecutor (101-939). The bar is 500 significant lines; this is 153 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":"packages/a2a-server/src/agent/executor.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0498cc14ab79d23728df5edec0e46768d577429018db052ac8b67bca8471bd9f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useSelectionList.useSelectionList: FunctionTooLong \u2014 useSelectionList 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":"packages/cli/src/ui/hooks/useSelectionList.ts"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a1daf67c66195b8de928195ddec5f1f0aa78709e0dafdc16ec039b53b274018"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: tools/tools.ts: FileTooLong \u2014 641 significant lines (blank, comment-only and punctuation-only lines excluded). 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":"packages/core/src/tools/tools.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea3c7d4bd40c21f4a559a37779223588a5a1fdee13582c6ce3d60544ad39f80e"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: HookRunner.executeCommandHook: MethodTooLong \u2014 executeCommandHook 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":"packages/core/src/hooks/hookRunner.ts"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4a2ced457440dc709a7a98bebfd9b5e9f84f81a2c724407971ec799758a4157"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: PolicyEngine: ClassTooLong \u2014 509 significant lines (blank, comment-only and punctuation-only lines excluded), 22 methods. The bar is 400 significant lines; this is 109 over it, 1.27\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/policy/policy-engine.ts"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"f64cfae2a8801045b5058df9028cc85f7c6acfe72a1ce09faacb92f56db6ea16"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: scheduler/scheduler.ts: FileTooLong \u2014 636 significant lines (blank, comment-only and punctuation-only lines excluded), about 88% of them inside a single declaration: Scheduler (99-970). 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":"packages/core/src/scheduler/scheduler.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d392ef4a0669f1eac4f4c318e89026d4d3ad641d7968530ebee2b657bcada72"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: commands/extensionsCommand.ts: FileTooLong \u2014 635 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 135 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":"packages/cli/src/ui/commands/extensionsCommand.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"34fa460ce22c22e7f5374555f972ed6cfb3d87cc81ebd632809e909e02d29bfc"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ideCommand.ideCommand: FunctionTooLong \u2014 ideCommand 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":"packages/cli/src/ui/commands/ideCommand.ts"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef6e354bb841835f2eea901ef99c88380267583bccafb9e3473f32650fa240a1"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: McpPromptLoader.loadCommands: MethodTooLong \u2014 loadCommands 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":"packages/cli/src/services/McpPromptLoader.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"4765f430ccc5b9365f710744c99f5afd019952106203fe24d76429424ce9d533"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BuiltinCommandLoader.loadCommands: MethodTooLong \u2014 loadCommands 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":"packages/cli/src/services/BuiltinCommandLoader.ts"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbc81fd726089c5bbcfb75d25528d51572d48cf15efe101ac917d04a7335b0b3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: installationInfo.getInstallationInfo: FunctionTooLong \u2014 getInstallationInfo 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":"packages/cli/src/utils/installationInfo.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"28bf161ee13e0f979b146af2e5ff389e7ebdd42cd017623605de1076a7fe34e9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: sessionCleanup.cleanupExpiredSessions: FunctionTooLong \u2014 cleanupExpiredSessions 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":"packages/cli/src/utils/sessionCleanup.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"c13a8ad0f0b8210b83b76cc2f4138180b84263552431638ef969f2c43eb391e1"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: GrepToolInvocation.execute: MethodTooLong \u2014 execute 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":"packages/core/src/tools/ripGrep.ts"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0e127e5a715c4d3cba492a559825614c90094e15d58d5d264f02e392220005f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: App.NetworkDetail: FunctionTooLong \u2014 NetworkDetail 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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":1186}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d0e5a7f5997b06b189736e67f8573a9e787ba53329dfa44b5d5a073a49d9c7a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: LegacyAgentProtocol._runLoop: MethodTooLong \u2014 _runLoop 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":"packages/core/src/agent/legacy-agent-session.ts"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0d6a12aad2068a932a29dace14aa142f4ed62d251991ca319ad466bdcb22c2a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CodeColorizer.colorizeCode: FunctionTooLong \u2014 colorizeCode 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":"packages/cli/src/ui/utils/CodeColorizer.tsx"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6fccd897f373174f06ae23e58f9f6b6bcaf9ef78ef5a2971f89b2c2a9de07e9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: stateSnapshotProcessor.createStateSnapshotProcessor: FunctionTooLong \u2014 createStateSnapshotProcessor 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":"packages/core/src/context/processors/stateSnapshotProcessor.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c4a8372d9154a3ffa14dbe5eaa7f4189d54fbc5ddc22bdca58ff5df6d41f594"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: contexts/KeypressContext.tsx: FileTooLong \u2014 598 significant lines (blank, comment-only and punctuation-only lines excluded). 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":"packages/cli/src/ui/contexts/KeypressContext.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbc867e7ffd0eb0ee834bde518e945307d795491dfdddd7a4cf85b7ee5d0438d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: StatsDisplay.ModelUsageTable: FunctionTooLong \u2014 ModelUsageTable 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":"packages/cli/src/ui/components/StatsDisplay.tsx"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"6619e755b064f9dec7965b92503c50076f1fe33c20a6d56ab9e4d0f8ecbca763"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: Composer.Composer: FunctionTooLong \u2014 Composer 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":"packages/cli/src/ui/components/Composer.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fd330bb121d77a144eb2b885cf9ff0b050918980d04e4c238c539afdec1d014"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ContextManager.renderHistory: MethodTooLong \u2014 renderHistory 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":"packages/core/src/context/contextManager.ts"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"336c77658d0dfe3d1c22959a91e554bbf2dc81c08cbd2af971ef2ed43161474f"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: WebFetchToolInvocation.executeExperimental: MethodTooLong \u2014 executeExperimental 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":"packages/core/src/tools/web-fetch.ts"},"region":{"startLine":595}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b56669cd2aca92e0fb8e4cdb37a7c8cdd5853c7c3d58e0474f64e4cb0a53715"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: TriageIssues: ClassTooLong \u2014 470 significant lines (blank, comment-only and punctuation-only lines excluded), 2 methods. The bar is 400 significant lines; this is 70 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":"packages/cli/src/ui/components/triage/TriageIssues.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"740363dc5e29451f3d846d534e9cd03c6a9c22a2d90cc5b9c9eeeddd787ddb7c"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: SchedulerStateManager: TooManyMethods \u2014 35 methods. The bar is 30 methods; this is 5 over it, 1.17\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/scheduler/state-manager.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"70193b39483d1d21a38fc515cdc91e401f78c94783754fa0fdafdddcd81c07bd"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: prompts/snippets.legacy.ts: FileTooLong \u2014 583 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 83 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":"packages/core/src/prompts/snippets.legacy.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"61a257afa136f9aaea5244f583394ffe51f6699c2e19d72a4c181b06ad314c1c"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: BrowserManager: ClassTooLong \u2014 464 significant lines (blank, comment-only and punctuation-only lines excluded), 22 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":"packages/core/src/agents/browser/browserManager.ts"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"838892dacc5c2e5d140526d841def1149e389f82250f1823dd1af71e3561b922"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: GlobToolInvocation.execute: MethodTooLong \u2014 execute 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":"packages/core/src/tools/glob.ts"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"28c3227470a3ccbdac6f263c7f9209e547f1757304302776c951222e7f10f6c7"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: WebFetchToolInvocation: ClassTooLong \u2014 460 significant lines (blank, comment-only and punctuation-only lines excluded), 12 methods. The bar is 400 significant lines; this is 60 over it, 1.15\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/web-fetch.ts"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"995604c290e84a9658fcd2f26fbd0c795bcc0b625a7a76b0a334e717d7aa1a72"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useExtensionUpdates.useExtensionUpdates: FunctionTooLong \u2014 useExtensionUpdates 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":"packages/cli/src/ui/hooks/useExtensionUpdates.ts"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb64ef78396a5da68879ccc3164fa185045c62772468c37a772238918782b6e7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: coreToolHookTriggers.executeToolWithHooks: FunctionTooLong \u2014 executeToolWithHooks 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":"packages/core/src/core/coreToolHookTriggers.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"71697eebd64764dfef715fd9cb1346d378951ad235829c37d16bd130e03001ef"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: GeminiClient: 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":"packages/core/src/core/client.ts"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"59584d4033b135dfbff011c9733653a1926d449e3ad59ea198c5f6c3aafe4fdd"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: VirtualizedList: ClassTooLong \u2014 453 significant lines (blank, comment-only and punctuation-only lines excluded), 3 methods. The bar is 400 significant lines; this is 53 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":"packages/cli/src/ui/components/shared/VirtualizedList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"63620143becf52450816967c95f09507b76274abf84771ac1733408111e8ae55"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: memory.applyMemoryPatchFile: FunctionTooLong \u2014 applyMemoryPatchFile 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":"packages/core/src/commands/memory.ts"},"region":{"startLine":782}}}],"partialFingerprints":{"codehealthFindingId/v1":"af7e65def7dbf745141bc8ca68a0c58ae4c2a3ab53737f7241d07698a150dd80"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ToolRegistry.discoverAndRegisterToolsFromCommand: MethodTooLong \u2014 discoverAndRegisterToolsFromCommand 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":"packages/core/src/tools/tool-registry.ts"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"110fa9c05d97e816cfc0ad401a2cd8ef49173510230f94938bc26c50e8d02f2a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: key/keyBindings.ts: FileTooLong \u2014 563 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 63 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":"packages/cli/src/ui/key/keyBindings.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0347b87bcd0bd67cf55ccf5c0fffa8fc30b1b2d3ff2cdba0a3f5e7377955f74b"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: GeminiClient.getIdeContextParts: MethodTooLong \u2014 getIdeContextParts 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":"packages/core/src/core/client.ts"},"region":{"startLine":429}}}],"partialFingerprints":{"codehealthFindingId/v1":"28516f912ce344c87e3680f8eca21d58f05200becd6009962ac81d8799cc4c98"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: hooks/slashCommandProcessor.ts: FileTooLong \u2014 558 significant lines (blank, comment-only and punctuation-only lines excluded), about 85% of them inside a single declaration: useSlashCommandProcessor (97-763). The bar is 500 significant lines; this is 58 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":"packages/cli/src/ui/hooks/slashCommandProcessor.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ee4c30b753471650761f02d4ca1a652cca3f1d6a151fca4dd718f1c34b8113d"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: EditToolInvocation: ClassTooLong \u2014 446 significant lines (blank, comment-only and punctuation-only lines excluded), 9 methods. The bar is 400 significant lines; this is 46 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":"packages/core/src/tools/edit.ts"},"region":{"startLine":459}}}],"partialFingerprints":{"codehealthFindingId/v1":"0983da8479229c3f4a207380ec71c2898f9edc5f25feb21a9d133170a4c6c497"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: shared/VirtualizedList.tsx: FileTooLong \u2014 557 significant lines (blank, comment-only and punctuation-only lines excluded), about 81% of them inside a single declaration: VirtualizedList (129-755). The bar is 500 significant lines; this is 57 over it, 1.11\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/shared/VirtualizedList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa19b98f62195867aa1dfe20785bb8675c84b101b370b71a5c187cec7a9abc67"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: policy/config.ts: FileTooLong \u2014 556 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 56 over it, 1.11\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/policy/config.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3748120c77bb5847f6895e8352a18524e8b6341c8bd195f99e3f12f5ba6b58d"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: CoderAgentExecutor.cancelTask: MethodTooLong \u2014 cancelTask 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":"packages/a2a-server/src/agent/executor.ts"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"d73d5046a41ca13b3230f636ed5677917492582b17aededc33b0c2b8cbc05b66"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: usePhraseCycler.usePhraseCycler: FunctionTooLong \u2014 usePhraseCycler 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":"packages/cli/src/ui/hooks/usePhraseCycler.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"32ebedcc1ad1fa71adff34ca6bc3ba530b2bcf553ec0da89140bb0228e759d09"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: editorUtils.openFileInEditor: FunctionTooLong \u2014 openFileInEditor 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":"packages/cli/src/ui/utils/editorUtils.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"5da2e41fe6ac78a9e415cccf3db8fbb858a5050ddc2d6989f1c55410b26d88ac"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ValidationDialog.ValidationDialog: FunctionTooLong \u2014 ValidationDialog 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":"packages/cli/src/ui/components/ValidationDialog.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"276d14d2a094fb5b865fe4898e3d435b819d72a35d2c399b23e2350708060f5c"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ActivityLogger.patchGlobalFetch: MethodTooLong \u2014 patchGlobalFetch 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":"packages/cli/src/utils/activityLogger.ts"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"c915d1b1bcf9150e734fe15f6c5c4f21708099f238f06b1a68a2ea95489fa4ed"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: App: ClassTooLong \u2014 434 significant lines (blank, comment-only and punctuation-only lines excluded), 16 methods. The bar is 400 significant lines; this is 34 over it, 1.09\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/devtools/client/src/App.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"be420b5c736a0df0e7d3cf6ae009edcd345e5479961be58aa0aa12d1d449bd06"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SessionBrowser.useSessionBrowserInput: FunctionTooLong \u2014 useSessionBrowserInput 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":"packages/cli/src/ui/components/SessionBrowser.tsx"},"region":{"startLine":542}}}],"partialFingerprints":{"codehealthFindingId/v1":"30a9eaf061bdbf3071d7f207eccd7ddfa990a9464e9fcb443a80bed3196960fc"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: codebase-investigator.CodebaseInvestigatorAgent: FunctionTooLong \u2014 CodebaseInvestigatorAgent 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":"packages/core/src/agents/codebase-investigator.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"2799412476bb1eb385356d39ceec702d0b4b213229c7e91883f2b936197b2a24"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: atCommandProcessor.resolveFilePaths: FunctionTooLong \u2014 resolveFilePaths 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":"packages/cli/src/ui/hooks/atCommandProcessor.ts"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"13370bf795da9edfe53a58ed265924ed846ca4db9052b4e9aa6c19444fa502f1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: App.ConsoleLogEntry: FunctionTooLong \u2014 ConsoleLogEntry 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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":610}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a5c3bdbd815353607b247011cf9c0a30990ff3187684a818e18c906ca39f868"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: local_telemetry.main: FunctionTooLong \u2014 main 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":"scripts/local_telemetry.js"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"270d8115e8f19ba6606b5bf55703b2b9d6b7c8b36fcb644585003f8dcc2ceb2c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: code_assist/oauth2.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":"packages/core/src/code_assist/oauth2.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9b395325f18bc74c04af4daf82e822d83179452e21234db14d60563aae509ba"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: useExecutionLifecycle: ClassTooLong \u2014 426 significant lines (blank, comment-only and punctuation-only lines excluded), 2 methods. The bar is 400 significant lines; this is 26 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":"packages/cli/src/ui/hooks/useExecutionLifecycle.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f16600d76a082a42ec473b8b612538e5166312de0b1774ebd00979a4a7b2c28"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: GeminiClient.sendMessageStream: MethodTooLong \u2014 sendMessageStream 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":"packages/core/src/core/client.ts"},"region":{"startLine":910}}}],"partialFingerprints":{"codehealthFindingId/v1":"ade93c1e02afdbfc0d3d4604afc74c12676762266323ce848095110aa71de8cb"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ShellExecutionService.prepareExecution: MethodTooLong \u2014 prepareExecution 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":"packages/core/src/services/shellExecutionService.ts"},"region":{"startLine":507}}}],"partialFingerprints":{"codehealthFindingId/v1":"d14e4a664eed8b7475c132a50f7b4401007e8c886c9c6bb3770101cc52ab2e67"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: cleanup-branches.main: FunctionTooLong \u2014 main 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":"scripts/cleanup-branches.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"4295e679ff8fd5f8af29ed38e8781109b01bbd38ce29dcdb9537b329050035e7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: consent.extensionConsentString: FunctionTooLong \u2014 extensionConsentString 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":"packages/cli/src/config/extensions/consent.ts"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"778805736052595683b895d3fe0cb4a8374ff8b925d74cca8e296050e93e00c7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useSlashCompletion.useSlashCompletion: FunctionTooLong \u2014 useSlashCompletion 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":"packages/cli/src/ui/hooks/useSlashCompletion.ts"},"region":{"startLine":482}}}],"partialFingerprints":{"codehealthFindingId/v1":"71f8895a3cbd313ef76d1403d4cddefec78ff858c33b523f599a18b189bc46cc"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: terminalSetup.configureVSCodeStyle: FunctionTooLong \u2014 configureVSCodeStyle 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":"packages/cli/src/ui/utils/terminalSetup.ts"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"37ce47485ecdaea199b0bda0d7d7c0aaf7a5e4e6ac06489cbf3cd5b7d3de82c1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: memory.applyInboxPatch: FunctionTooLong \u2014 applyInboxPatch 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":"packages/core/src/commands/memory.ts"},"region":{"startLine":1189}}}],"partialFingerprints":{"codehealthFindingId/v1":"f995d3c19f61b28c33a2a060f9648c3a681aed9d85863ad2ebdf9b7e545c7794"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AgentRegistry: ClassTooLong \u2014 418 significant lines (blank, comment-only and punctuation-only lines excluded), 22 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":"packages/core/src/agents/registry.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"34d349db583b6d927552c1cf53a8723b6e00d094011ccfd7210841b9ba7ac9dc"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: mcpCommand.listAction: FunctionTooLong \u2014 listAction 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":"packages/cli/src/ui/commands/mcpCommand.ts"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"f13dbdabce6263a25c5bdc86ba5eca3a45b8d2c5e66af1441ae3ba3739e62ee6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: tools/grep.ts: FileTooLong \u2014 518 significant lines (blank, comment-only and punctuation-only lines excluded), about 78% of them inside a single declaration: GrepToolInvocation (87-683). The bar is 500 significant lines; this is 18 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":"packages/core/src/tools/grep.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"47469c544a1d57900d4f877015590b762c1da01d21e0f2debf11acb7fd0a1b80"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Task: 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":"packages/a2a-server/src/agent/task.ts"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e6f3fe4a5f044994289e9ead28c7f039dab54639631e720dc5fcfa7b4f01137"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: triage/TriageIssues.tsx: FileTooLong \u2014 516 significant lines (blank, comment-only and punctuation-only lines excluded), about 91% of them inside a single declaration: TriageIssues (66-674). The bar is 500 significant lines; this is 16 over it, 1.03\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/triage/TriageIssues.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"de34c304244a137dc412698f7d7bace7bfa8f45b439dac22c08ed0e5039680f3"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: components/SessionBrowser.tsx: FileTooLong \u2014 515 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 15 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":"packages/cli/src/ui/components/SessionBrowser.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"133b8767fa5d10263270a6ab24a5968ef17a6d3fb74e5c9c1dfeeebc93d23c8b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: tools/write-file.ts: FileTooLong \u2014 515 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 15 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":"packages/core/src/tools/write-file.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fd0f2b5d7954cf6d8b610921e6702dac15a1fd63d1dc2cc578cd1b59cca5113"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useRunEventNotifications.useRunEventNotifications: FunctionTooLong \u2014 useRunEventNotifications 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":"packages/cli/src/ui/hooks/useRunEventNotifications.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"bef088d6c2de981e1242300aee478232b0ced3473b77631049557e017a114aae"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: nodeDistillationProcessor.createNodeDistillationProcessor: FunctionTooLong \u2014 createNodeDistillationProcessor 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":"packages/core/src/context/processors/nodeDistillationProcessor.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"c448d47fcf23303c661381e4c2d25c0a768dde9bfabd8e977fa13d0390d67413"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: historyHardening.pairToolsAndEnforceSignatures: FunctionTooLong \u2014 pairToolsAndEnforceSignatures 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":"packages/core/src/utils/historyHardening.ts"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"c75be743a73c0f9d467f76fa56e5897eb63d36fb08202532f256eb98215fb456"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: App.CodeView: FunctionTooLong \u2014 CodeView 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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":1829}}}],"partialFingerprints":{"codehealthFindingId/v1":"5aaf7f2a154b31bca225d6fc11689a95015a30f7d16446ce55b2cee59f0c4236"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: hooks/atCommandProcessor.ts: FileTooLong \u2014 513 significant lines (blank, comment-only and punctuation-only lines excluded). 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":"packages/cli/src/ui/hooks/atCommandProcessor.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"23f2145b9592f9a54bb3c03f5c3f519919aa2666d5976ebb211d6dab04f832b3"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: services/memoryPatchUtils.ts: FileTooLong \u2014 513 significant lines (blank, comment-only and punctuation-only lines excluded). 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":"packages/core/src/services/memoryPatchUtils.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"20e5509be327ad2b9cb81ab09f2dc72d2455afe181a74185f0ebde96713dd86e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: Notifications.Notifications: FunctionTooLong \u2014 Notifications 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":"packages/cli/src/ui/components/Notifications.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b5f0aa1a185684aa578465da3ec1cd1d76ff1907700a8dbeb3e5fd76108175e"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ToolExecutor.execute: MethodTooLong \u2014 execute 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":"packages/core/src/scheduler/tool-executor.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"878a93fb30503b7d5858600f7f6de4e183f4606c2e828128c02a588d97bfd9aa"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: LSToolInvocation.execute: MethodTooLong \u2014 execute 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":"packages/core/src/tools/ls.ts"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"106143784324767d3be1f7f5abd04be1efa5da0e5922d8849e4fc6f825601258"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: workflow/orchestrator.py: FileTooLong \u2014 509 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 9 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":"tools/caretaker-agent/cloudrun/pr-generator/workflow/orchestrator.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9cdeb3d00b7cf36d049e14a254fc3332e1e86ee98d772c9abe279786baebe39"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: McpClientManager: ClassTooLong \u2014 406 significant lines (blank, comment-only and punctuation-only lines excluded), 27 methods. The bar is 400 significant lines; this is 6 over it, 1.02\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/mcp-client-manager.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ae6528fbb822f60d941c90b141035dfa9a6fdcb58150767377de5404e9c23db"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: tools/tool-registry.ts: FileTooLong \u2014 506 significant lines (blank, comment-only and punctuation-only lines excluded), about 63% of them inside a single declaration: ToolRegistry (247-824). The bar is 500 significant lines; this is 6 over it, 1.01\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/tool-registry.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"343457e78106e30d19441796b0255433646d9e7898a59b92a2219ed9dd462a4c"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: GrepToolInvocation: ClassTooLong \u2014 404 significant lines (blank, comment-only and punctuation-only lines excluded), 7 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":"packages/core/src/tools/grep.ts"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"63e0c6eb0713030c0d2482b66060dd06e0795567fe39ecb70f90d31da7f81e36"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: github.downloadFromGitHubRelease: FunctionTooLong \u2014 downloadFromGitHubRelease 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":"packages/cli/src/config/extensions/github.ts"},"region":{"startLine":320}}}],"partialFingerprints":{"codehealthFindingId/v1":"6952e4729ce990219e84558e302140e387c300d0c7f60924ef201c799865f5cb"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BaseLlmClient._generateWithRetry: MethodTooLong \u2014 _generateWithRetry 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":"packages/core/src/core/baseLlmClient.ts"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"162244bfdbed8ad61199f51c9e8b42670f25f180bf3a32582663a24943fa8afd"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: browser/browserManager.ts: FileTooLong \u2014 504 significant lines (blank, comment-only and punctuation-only lines excluded), about 92% of them inside a single declaration: BrowserManager (113-992). 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":"packages/core/src/agents/browser/browserManager.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab917c3920e42943519551de83c56cad20bdb798692d5d2d87338546f8f140ee"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ChatRecordingService: ClassTooLong \u2014 403 significant lines (blank, comment-only and punctuation-only lines excluded), 22 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":"packages/core/src/services/chatRecordingService.ts"},"region":{"startLine":402}}}],"partialFingerprints":{"codehealthFindingId/v1":"705f2027f0dbb962fdbf596401a33f70cb31564b5328a3076d47ffd313356848"}},{"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 the vitest suite in the repository root ran and passed but wrote no lcov report. 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: should initialize WhisperTranscriptionProvider and handle process: 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":"integration-tests/voice-mode.test.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"6402144f54a84a1c8161741e378c711d1778f40dbb9109a550a3784bbfe83878"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should run a command in the background, list it, and read its output: 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":"integration-tests/shell-background.test.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"82548f69b6c6dbd8e1e0d60bcd11d94e9ef401b72ad67e5236e4e2958db2f7a9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: $name: 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":"integration-tests/policy-headless.test.ts"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"5710087b769463a36780fa11d3ae4eca90d90837a4b83e03567c03cfaa720e77"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: mcp tool list should include tool with cyclic tool schema: 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":"integration-tests/mcp_server_cyclic_schema.test.ts"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"387ada0578a26afbccabd0b0c1b7fecde9a647b4e58080b17280a844a7b1a901"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should be able to list a directory: 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":"integration-tests/list_directory.test.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"f581f1f21fc83bfd06caddf4eaf6abcb42246bbee6df06093928a37e76780c20"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should not emit any deprecation warnings when $description: 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":"integration-tests/deprecation-warnings.test.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"24b686761502747a30649bd2aa8c70ba0f83500e00f7b7810311766d421c0911"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should clean up browser processes after completion: 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":"integration-tests/browser-agent.test.ts"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"f31c9b50b340af422f592923132f61e57e39d3606b78bb3a0c15c6e387fef00c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should handle tool confirmation for write_file without crashing: 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":"integration-tests/browser-agent.test.ts"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"af53a795b4a70f63eddde1e5dfadb69cd3c5ba5e91e9edf49aa5337b1759d497"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: idle-session-startup: memory usage within baseline: 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":"memory-tests/memory-usage.test.ts"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbc3b975b55419ac9ede611d5bdf5e56791abce333c797b585142117d5e8f6ce"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: simple-prompt-response: memory usage within baseline: 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":"memory-tests/memory-usage.test.ts"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"4985ec3371de6086d0aa298ffe113cb52de1a0ea6eff7d7a3f33ed150a580bef"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: multi-turn-conversation: memory remains stable over turns: 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":"memory-tests/memory-usage.test.ts"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4233dff8e3703c9de336568e493bed10405bd4392671f88115c9eff3827f633"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: multi-function-call-repo-search: memory after tool use: 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":"memory-tests/memory-usage.test.ts"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"6592a4d322ece6484434b940932fc2ffc6cddf3b76194cb3e0e874c8f49fb36d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: large-chat: memory usage within baseline: 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":"memory-tests/memory-usage.test.ts"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cdd2158d5b6df92044b5feb1c1bc83e296e62f656c5097a31b8ef2be2be11d9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: resume-large-chat: memory usage within baseline: 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":"memory-tests/memory-usage.test.ts"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce87d6e290e7a311dcf64f7e37a24d1a9662e8160f791f7df6e35fad3b218125"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: resume-large-chat-with-messages: memory usage within baseline: 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":"memory-tests/memory-usage.test.ts"},"region":{"startLine":315}}}],"partialFingerprints":{"codehealthFindingId/v1":"c582b430f8af9cd6f77173750b334aa41b7946690f6f15745013a0aa264ed2ff"}},{"ruleId":"D10","level":"error","message":{"text":"No assertions (empty test): should set window title when hideWindowTitle is false: Test method has an empty body \u2014 it asserts nothing and exercises no code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/gemini.test.tsx"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"78e9bd102e5e76a713d75bce98cd1079c38d3c6a2543a35553a0fa42206eef16"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should use $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":"packages/cli/src/acp/acpFileSystemService.test.ts"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"99ff3bbe00a4760c2dcf6d74de93a500641e56f5c5ca98fa21ea32bf1b091995"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should not prompt for settings if promptForSettings is false: 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":"packages/cli/src/config/extension.test.ts"},"region":{"startLine":1685}}}],"partialFingerprints":{"codehealthFindingId/v1":"1da1a1a16671303fb5d577fc06cd742de8d534c279debe2272651651f0c88ade"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should extract zip using extract-zip: 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":"packages/cli/src/config/extensions/github.test.ts"},"region":{"startLine":642}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0a349cbcd84751cd5d0a642dc06ba1b0fb5ab57c8e77b44eebc504e64ff39e5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should not throw if deleting a non-existent sensitive setting with empty value: 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":"packages/cli/src/config/extensions/extensionSettings.test.ts"},"region":{"startLine":849}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7c33fd7019bc7561ea2172a301ca9b254a32a8efd093b8523ce024c62802637"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should steer the model using a hint during a tool turn: 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":"packages/cli/src/integration-tests/modelSteering.test.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a666b33014e520605e9d504ac736dc77139d4b80e608ca8c60d80a9cb476336"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should render the app and handle a simple message: 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":"packages/cli/src/test-utils/AppRig.test.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc04370fb9791698a4a8092d2b4819ce081cfff073c5c5837f7627fff427ab7e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: handles debug mode 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":"packages/cli/src/ui/AppContainer.test.tsx"},"region":{"startLine":918}}}],"partialFingerprints":{"codehealthFindingId/v1":"71795b287f2e3affb357ed9cbad9b37c0f224538d6d0a4bb81fc1fd5b7623767"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: handles config methods that might throw: 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":"packages/cli/src/ui/AppContainer.test.tsx"},"region":{"startLine":1002}}}],"partialFingerprints":{"codehealthFindingId/v1":"f802d4585ff0e01bd1ca236de939dc84a3c3511004734248db70a4ff54ccaaef"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: establishes correct provider nesting order: 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":"packages/cli/src/ui/AppContainer.test.tsx"},"region":{"startLine":1027}}}],"partialFingerprints":{"codehealthFindingId/v1":"1987930fdaf58bf48a640710ddd6d34e4d67b2f0eed7f7a2bd2d52342bb14f74"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: handles resumed session data correctly: 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":"packages/cli/src/ui/AppContainer.test.tsx"},"region":{"startLine":1037}}}],"partialFingerprints":{"codehealthFindingId/v1":"190c298c3a4cb44daad64a45f3fe25e1520c515eb399bdbcff5fef8da9b9bc6c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders without resumed session data: 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":"packages/cli/src/ui/AppContainer.test.tsx"},"region":{"startLine":1076}}}],"partialFingerprints":{"codehealthFindingId/v1":"632e302613412d0acdca8c38060400c8a6cdc44853dd5cf66492a6ab01e5d7b3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: initializes chat recording service when config has it: 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":"packages/cli/src/ui/AppContainer.test.tsx"},"region":{"startLine":1089}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2534831e25869de763042132ffd94933b145d4de319352d2319c7df9f260075"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: $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":"packages/cli/src/ui/auth/AuthDialog.test.tsx"},"region":{"startLine":386}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cc8f6179d9e2081ea5bc75d9c10d5b90f3c16ebc20c59ad0fcace3541f2b954"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should handle vim mode setting specially: 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":"packages/cli/src/ui/components/SettingsDialog.test.tsx"},"region":{"startLine":573}}}],"partialFingerprints":{"codehealthFindingId/v1":"5182c51b857a189e0089aa00bf68bcba55b31d100c48409823f6081e628f6030"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should switch between scopes: 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":"packages/cli/src/ui/components/SettingsDialog.test.tsx"},"region":{"startLine":595}}}],"partialFingerprints":{"codehealthFindingId/v1":"569d1127bc990771c11f1d884c1c21fb6cfd1a7f2c5208bdab588a2c2939244c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should show restart prompt for restart-required settings: 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":"packages/cli/src/ui/components/SettingsDialog.test.tsx"},"region":{"startLine":763}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebb789208e1b579d8820d1fa786c30246d836a8c4936fd0d39e59394d0630cf4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should handle restart request when r is pressed: 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":"packages/cli/src/ui/components/SettingsDialog.test.tsx"},"region":{"startLine":777}}}],"partialFingerprints":{"codehealthFindingId/v1":"63448d0f099c1be9157a78acc9109ce093c65ebb96e845f3c73cbfae5fa7c7f2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should persist settings across scope changes: 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":"packages/cli/src/ui/components/SettingsDialog.test.tsx"},"region":{"startLine":824}}}],"partialFingerprints":{"codehealthFindingId/v1":"a990f9a08065e6ba49d49bac83238837d6195162994fc9ff612d7e3d13693de0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should track modified settings correctly: 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":"packages/cli/src/ui/components/SettingsDialog.test.tsx"},"region":{"startLine":874}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cebe44b185c02d58c4ba2d8848872254219d786e302b17b7be2104b76cc3307"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should handle scrolling when there are many settings: 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":"packages/cli/src/ui/components/SettingsDialog.test.tsx"},"region":{"startLine":901}}}],"partialFingerprints":{"codehealthFindingId/v1":"6231720fb39b7fc35eb7ac97252403ccaf6a685a0ba7e11f3c1afbad13e88197"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should handle immediate settings save for non-restart-required settings: 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":"packages/cli/src/ui/components/SettingsDialog.test.tsx"},"region":{"startLine":951}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bb2be3154bffb80d2d49f8d22911b9072ba375a2e7c1d55484bffa3097a8957"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should clear restart prompt when switching scopes: 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":"packages/cli/src/ui/components/SettingsDialog.test.tsx"},"region":{"startLine":989}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b1a1247353d2559f3da7d8c1313dd0ebaf2476fc29fa01f0e4688a9fe60677f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should handle rapid key presses gracefully: 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":"packages/cli/src/ui/components/SettingsDialog.test.tsx"},"region":{"startLine":1107}}}],"partialFingerprints":{"codehealthFindingId/v1":"d80c919f464e38a31d654bfe109c7b406978906ef8c508c2b60ce6629efea4bc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should handle $key to reset current setting to default: 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":"packages/cli/src/ui/components/SettingsDialog.test.tsx"},"region":{"startLine":1129}}}],"partialFingerprints":{"codehealthFindingId/v1":"3181521270a82dc60467d6cc2cf9f2a866396798812926188b008b4f29a0e93e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should handle navigation when only one setting exists: 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":"packages/cli/src/ui/components/SettingsDialog.test.tsx"},"region":{"startLine":1153}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffff1ed23f7f1d58ae89abcf0752e75662f00eb5b3dc4741e7b1605a22d628bb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should allow changing multiple settings without losing pending changes: 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":"packages/cli/src/ui/components/SettingsDialog.test.tsx"},"region":{"startLine":1254}}}],"partialFingerprints":{"codehealthFindingId/v1":"2aea7541a86e95be6defecf4b744a2585982bdbec00b167e0dc93d4f72fd8dcb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should maintain state consistency during complex interactions: 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":"packages/cli/src/ui/components/SettingsDialog.test.tsx"},"region":{"startLine":1290}}}],"partialFingerprints":{"codehealthFindingId/v1":"634df8d25fc4bafab30831df1f2ad00f90776ad1ce783738a2e7e92a6521e3bb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should not call onEscapePromptChange when not provided: 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":"packages/cli/src/ui/components/InputPrompt.test.tsx"},"region":{"startLine":2902}}}],"partialFingerprints":{"codehealthFindingId/v1":"15fcb15887af22d78822e1714cdd45210a9309b8eda0f3ad541db0e0efc4502a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should toggle recording off when space is pressed again (toggle): 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":"packages/cli/src/ui/components/InputPrompt.test.tsx"},"region":{"startLine":5058}}}],"partialFingerprints":{"codehealthFindingId/v1":"e707b9501fd21bd42bd9ca1ba079f1c6addef8c788e3bdee6ed04bf31b1dc3ad"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should skip tool calls without confirmationDetails: 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":"packages/cli/src/ui/hooks/useGeminiStream.test.tsx"},"region":{"startLine":2853}}}],"partialFingerprints":{"codehealthFindingId/v1":"62a79f74f6d929a94cf221f8aed6e4654a42d451fe1ed798614a295be017dc6e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should hide banner if show count exceeds max limit (Legacy format): 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":"packages/cli/src/ui/hooks/useBanner.test.ts"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"22015043d20e2204deb6ee15ef40cf8055362bc58f66bf22e0da2bd37171b450"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should not crash if Date.now() goes backwards (regression test): 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":"packages/cli/src/ui/hooks/useAnimatedScrollbar.test.tsx"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3e4a651add4248453c6c16fa4bd7c94cf45ba79aae5c275c3156f5cd409d0fb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: handles extremely small terminal widths without crashing: 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":"packages/cli/src/ui/utils/TableRenderer.test.tsx"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"22c635b05dc65b4f69ddff1b2a83e66b4e67ea777fccb8f6d7a629ff7e060c89"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should not call connectMcp twice when ensureConnection is called concurrently: 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":"packages/core/src/agents/browser/browserManager.test.ts"},"region":{"startLine":1093}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a62aafc8c5c3b9fa13f4f39cfe509ee148e6a4a84bc4ac22631b5248d273505"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should NOT re-inject overlay when tool returns an error result: 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":"packages/core/src/agents/browser/browserManager.test.ts"},"region":{"startLine":1211}}}],"partialFingerprints":{"codehealthFindingId/v1":"5625ee55da448043c3543c7b2747012126ff43340e55a199b93bada2c07793f5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should safely process random response streams in generateContentStream (consumed/remaining credits): 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":"packages/core/src/code_assist/server.test.ts"},"region":{"startLine":1023}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc8d595bf566988e7485675f988e544636fb5f728583beeddae162731eefc6ae"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should handle invalid callback request: 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":"packages/core/src/mcp/oauth-provider.test.ts"},"region":{"startLine":924}}}],"partialFingerprints":{"codehealthFindingId/v1":"b03a0edabdfc53069ddf85563e5da9af430cc19e829ea6f32a72463fa813c8b1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should allow luci.app: 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":"packages/core/src/mcp/google-auth-provider.test.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"f59ac19f64f9565e389c1191c905c63943c25a9a3d82a4fc54979d04d8fe26a0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should allow sub.luci.app: 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":"packages/core/src/mcp/google-auth-provider.test.ts"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"6994186564e5a5ca3fa4e93e19cc3ffbd3b7c7d6b0900196eeacf9bbe73f3d96"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should NOT start a timeout if timeoutMs is \u003C= 0: 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":"packages/core/src/tools/shell.test.ts"},"region":{"startLine":649}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ed32be3e7c6a928aef0a350fc9eb0bf3c1979a92f78743a3b9ec6f6e6cb1398"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should emit addDir and unlinkDir events for directories: 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":"packages/core/src/utils/filesearch/fileWatcher.test.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c7333edb948ed3761368e939f4e418229973f92ab3fd17a309247a755b46038"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: cold-startup-time: startup completes within baseline: 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":"perf-tests/perf-usage.test.ts"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"99936a7523a8d4fd4fb82338820964e78654a01fd811d0d2dd9222ab10b609b8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: idle-cpu-usage: CPU stays low when idle: 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":"perf-tests/perf-usage.test.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"58c5a6821af01bab2a283195a8da2828c5d10f469f5e108afe2048553426ba68"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: asian-language-conv: verify perf is acceptable : 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":"perf-tests/perf-usage.test.ts"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5ba7ce01e7fd9ea13a94bb726cb0a96dcb177e98a2ecabb56ae2a12ff49c92e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: skill-loading-time: startup with many skills within baseline: 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":"perf-tests/perf-usage.test.ts"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"46625d3201c0511e09bee1f69df98f826d7412f50e96176ecf6c272706ed10e9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: high-volume-shell-output: handles large output efficiently: 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":"perf-tests/perf-usage.test.ts"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ad800d535f442f10595bd1ed7546fb62f6b9f062119d605da2e03fa71ec1675"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: session-load: resume a 60MB chat history: 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":"perf-tests/perf-usage.test.ts"},"region":{"startLine":353}}}],"partialFingerprints":{"codehealthFindingId/v1":"84b33927c1a5a0e1e938fe82a2659f16871b12e8ac4b8b814b9a18a08403435c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: typing: latency when typing into a large session: 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":"perf-tests/perf-usage.test.ts"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"41ab1c5e9a09b835ec0d3b6717ef0bf55a724b395d716a5b1a7b0ec8a7eb1be9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: execution: response latency for a simple shell command: 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":"perf-tests/perf-usage.test.ts"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb799cc4e0a736eb1f8a7b7bccfe8feb38d9bcddf6a808949b180c9fa133559b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: terminal-scrolling: latency when scrolling a large terminal buffer: 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":"perf-tests/perf-usage.test.ts"},"region":{"startLine":458}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6d51ca1dd6541fd51a9c5f9da8f1ebd34a5feeb03f3094e9f4a24fcf8120bc4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: alternate-scrolling: latency when scrolling a large alternate buffer: 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":"perf-tests/perf-usage.test.ts"},"region":{"startLine":559}}}],"partialFingerprints":{"codehealthFindingId/v1":"77a9f022da58a343b8754094bbd696174147ca1a49fab629d68a8e6f4373267e"}},{"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":"a65fb4df69cec5fab2804fafcef6da3095fe8786edb3afacb8c29495fdc826b8"},"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: packages/cli/src/ui/hooks/useGeminiStream.ts: packages/cli/src/ui/hooks/useGeminiStream.ts changed 3 times in last 90 days, max cyclomatic complexity 261 in useGeminiStream.useGeminiStream at line 224. 3 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-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/cli/src/ui/hooks/useGeminiStream.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":"packages/cli/src/ui/hooks/useGeminiStream.ts"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"3401a4db476b082a8a409eba90e63f839df0c62621a33a6a35653eceac4624d8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/core/src/core/geminiChat.ts: packages/core/src/core/geminiChat.ts changed 9 times in last 90 days, max cyclomatic complexity 68 in GeminiChat.processStreamResponse at line 1354. 9 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-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/core/src/core/geminiChat.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":"packages/core/src/core/geminiChat.ts"},"region":{"startLine":1354}}}],"partialFingerprints":{"codehealthFindingId/v1":"489947df7505d79eacc3c1a3cb182c779d76a031fcf1b45b1da7bb517ad20f27"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/cli/src/utils/sandbox.ts: packages/cli/src/utils/sandbox.ts changed 4 times in last 90 days, max cyclomatic complexity 146 in sandbox.start_sandbox at line 55. 4 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-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/cli/src/utils/sandbox.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":"packages/cli/src/utils/sandbox.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1b4e99c9fa2422b3af0615e5065b721d033c5562868e4071f6a0920e14b362b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/core/src/services/shellExecutionService.ts: packages/core/src/services/shellExecutionService.ts changed 6 times in last 90 days, max cyclomatic complexity 79 in ShellExecutionService.executeWithPty at line 1103. 5 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-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/core/src/services/shellExecutionService.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":"packages/core/src/services/shellExecutionService.ts"},"region":{"startLine":1103}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba66c95f41484cc64c25977a75035f6848d60c35a27020890e9e732454eda021"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/core/src/tools/shell.ts: packages/core/src/tools/shell.ts changed 3 times in last 90 days, max cyclomatic complexity 130 in ShellToolInvocation.execute at line 523. 3 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-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/core/src/tools/shell.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":"packages/core/src/tools/shell.ts"},"region":{"startLine":523}}}],"partialFingerprints":{"codehealthFindingId/v1":"6796f3d9883bef5acbbe6bd4f2c31b0d2fccfe81d6e4bb19b620f85f303e4d81"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx: packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx changed 2 times in last 90 days, max cyclomatic complexity 156 in ToolConfirmationMessage.ToolConfirmationMessage at line 65. 2 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-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/cli/src/ui/components/messages/ToolConfirmationMessage.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":"packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"ece498c5598992498096c2b1156841b70144d7ece8667efbb47dd3c175744b7d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/cli/src/acp/acpSession.ts: packages/cli/src/acp/acpSession.ts changed 3 times in last 90 days, max cyclomatic complexity 91 in Session.#resolvePrompt at line 969. 3 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-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/cli/src/acp/acpSession.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":"packages/cli/src/acp/acpSession.ts"},"region":{"startLine":969}}}],"partialFingerprints":{"codehealthFindingId/v1":"e11937b4e371913604ca14b24c34ec0998d502c6ee78378754c58eb942c57d7e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/a2a-server/src/agent/executor.ts: packages/a2a-server/src/agent/executor.ts changed 4 times in last 90 days, max cyclomatic complexity 65 in CoderAgentExecutor.execute at line 439. 4 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-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/a2a-server/src/agent/executor.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":"packages/a2a-server/src/agent/executor.ts"},"region":{"startLine":439}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d1b36bc1a07bbbdea9b07eb471e2bad2a5fbf51aaea29bac02166e0c891e4f9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/core/src/policy/policy-engine.ts: packages/core/src/policy/policy-engine.ts changed 3 times in last 90 days, max cyclomatic complexity 61 in PolicyEngine.check at line 600. 3 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-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/core/src/policy/policy-engine.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":"packages/core/src/policy/policy-engine.ts"},"region":{"startLine":600}}}],"partialFingerprints":{"codehealthFindingId/v1":"f98414f33ade4565ecee15af930d7fa4e7499a2263a0590f470f153beaa12e99"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/core/src/utils/googleQuotaErrors.ts: packages/core/src/utils/googleQuotaErrors.ts changed 3 times in last 90 days, max cyclomatic complexity 57 in googleQuotaErrors.classifyGoogleError at line 223. 2 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-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/core/src/utils/googleQuotaErrors.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":"packages/core/src/utils/googleQuotaErrors.ts"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"bddf1bcae9c1fd9c81452625e8f4db843cd5337055bf2b5a55cb3abe506782d8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/core/src/mcp/oauth-provider.ts: packages/core/src/mcp/oauth-provider.ts changed 4 times in last 90 days, max cyclomatic complexity 39 in MCPOAuthProvider.authenticate at line 304. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/core/src/mcp/oauth-provider.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":"packages/core/src/mcp/oauth-provider.ts"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed20e6cd7a2d760d839415b5ee234860380a3715255d8d014bf0a45ddbfcbdda"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/core/src/config/config.ts: packages/core/src/config/config.ts changed 7 times in last 90 days, max cyclomatic complexity 20 in Config.constructor at line 993. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/core/src/config/config.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":"packages/core/src/config/config.ts"},"region":{"startLine":993}}}],"partialFingerprints":{"codehealthFindingId/v1":"06ec8a98653f0345c772a0d39da27d67c104082b106c23b84a761b2f83b7a2a4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/cli/src/ui/hooks/useQuotaAndFallback.ts: packages/cli/src/ui/hooks/useQuotaAndFallback.ts changed 3 times in last 90 days, max cyclomatic complexity 42 in useQuotaAndFallback.useQuotaAndFallback 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-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/cli/src/ui/hooks/useQuotaAndFallback.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":"packages/cli/src/ui/hooks/useQuotaAndFallback.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"60e46c1142b195ff608f56aba5866bd9d1d1713db4daacf4903922094ff1f282"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/a2a-server/src/agent/task.ts: packages/a2a-server/src/agent/task.ts changed 5 times in last 90 days, max cyclomatic complexity 25 in Task.acceptAgentMessage at line 821. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/a2a-server/src/agent/task.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":"packages/a2a-server/src/agent/task.ts"},"region":{"startLine":821}}}],"partialFingerprints":{"codehealthFindingId/v1":"11c2cbc31fe37d64a34f7ecbfa0fcf15256a379c501d107ebfabcba6d2a7d017"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/core/src/utils/retry.ts: packages/core/src/utils/retry.ts changed 2 times in last 90 days, max cyclomatic complexity 55 in retry.retryWithBackoff at line 258. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/core/src/utils/retry.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":"packages/core/src/utils/retry.ts"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0c9d44e337f3fad1d04a9a9f7c63ce0c2d3143db9dc708aeaff021367e871df"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/core/src/tools/write-file.ts: packages/core/src/tools/write-file.ts changed 4 times in last 90 days, max cyclomatic complexity 27 in WriteFileToolInvocation.execute at line 370. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/core/src/tools/write-file.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":"packages/core/src/tools/write-file.ts"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"de8c06de4df1ac1856d56e33bb185036cf1f0c8a32bf2946e9c8bcf841983ab3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/core/src/core/contentGenerator.ts: packages/core/src/core/contentGenerator.ts changed 2 times in last 90 days, max cyclomatic complexity 50 in contentGenerator.createContentGenerator 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-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/core/src/core/contentGenerator.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":"packages/core/src/core/contentGenerator.ts"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8dbb0956c5ccc710884216b84f58893cd54ace4a40046ba62e8c6a1a0baa9bc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/core/src/tools/grep.ts: packages/core/src/tools/grep.ts changed 2 times in last 90 days, max cyclomatic complexity 47 in GrepToolInvocation.performGrepSearch at line 413. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/core/src/tools/grep.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":"packages/core/src/tools/grep.ts"},"region":{"startLine":413}}}],"partialFingerprints":{"codehealthFindingId/v1":"02cb53ac684a01a1d35336b060dfb18db383d237e6919fa20e92c31feefe458e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/core/src/utils/paths.ts: packages/core/src/utils/paths.ts changed 3 times in last 90 days, max cyclomatic complexity 31 in paths.shortenPath 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-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/core/src/utils/paths.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":"packages/core/src/utils/paths.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd84451017a05a6f2fc0afd23aced6ebd455057d93c8f72bd12c1fbc2b0af76d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/core/src/tools/edit.ts: packages/core/src/tools/edit.ts changed 4 times in last 90 days, max cyclomatic complexity 23 in EditToolInvocation.execute at line 904. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/core/src/tools/edit.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":"packages/core/src/tools/edit.ts"},"region":{"startLine":904}}}],"partialFingerprints":{"codehealthFindingId/v1":"640be0016e1cabe35b5e017ae56c9ff3b68ee367f004644730a1379f8a61f628"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/cli/src/utils/sandboxUtils.ts: packages/cli/src/utils/sandboxUtils.ts changed 3 times in last 90 days, max cyclomatic complexity 30 in sandboxUtils.isSensitiveHostPath 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-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/cli/src/utils/sandboxUtils.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":"packages/cli/src/utils/sandboxUtils.ts"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff3bcaf68bb139cbbe53bb9f60592f5dad10db2f186daf214f3bd985e0bcd58d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/core/src/utils/oauth-flow.ts: packages/core/src/utils/oauth-flow.ts changed 3 times in last 90 days, max cyclomatic complexity 25 in oauth-flow.parseTokenEndpointResponse at line 485. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/core/src/utils/oauth-flow.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":"packages/core/src/utils/oauth-flow.ts"},"region":{"startLine":485}}}],"partialFingerprints":{"codehealthFindingId/v1":"888ffb34551e9ef86329a659b6e144010b533debf1f696256b750a91801d869b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/a2a-server/src/config/config.ts: packages/a2a-server/src/config/config.ts changed 3 times in last 90 days, max cyclomatic complexity 23 in config.setTargetDir at line 469. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/a2a-server/src/config/config.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":"packages/a2a-server/src/config/config.ts"},"region":{"startLine":469}}}],"partialFingerprints":{"codehealthFindingId/v1":"981fe750887f0080b462d41c868b6e3af3184a550737f170d408ffee85ae55e7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/core/src/agent/legacy-agent-session.ts: packages/core/src/agent/legacy-agent-session.ts changed 2 times in last 90 days, max cyclomatic complexity 34 in LegacyAgentProtocol._runLoop 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-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/core/src/agent/legacy-agent-session.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":"packages/core/src/agent/legacy-agent-session.ts"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"b282cd4e93aa15df308f299352d11126e8138ee60d73c112136f70af39ad2daf"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/core/src/code_assist/oauth2.ts: packages/core/src/code_assist/oauth2.ts changed 2 times in last 90 days, max cyclomatic complexity 32 in oauth2.initOauthClient 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-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/core/src/code_assist/oauth2.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":"packages/core/src/code_assist/oauth2.ts"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"011d5312be697bf0b60615c256e196b9415c5332148e26c75b901a2362fade46"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/cli/src/ui/components/messages/DiffRenderer.tsx: packages/cli/src/ui/components/messages/DiffRenderer.tsx changed 2 times in last 90 days, max cyclomatic complexity 28 in DiffRenderer.renderDiffLines at line 232. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/cli/src/ui/components/messages/DiffRenderer.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":"packages/cli/src/ui/components/messages/DiffRenderer.tsx"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"71a83c1c4be475543ce4c972a664c618b9067a74df6ad1fe8265a5e1efcbbd56"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: tools/caretaker-agent/cloudrun/ingestion-service/auth/github.ts: tools/caretaker-agent/cloudrun/ingestion-service/auth/github.ts changed 2 times in last 90 days, max cyclomatic complexity 25 in github.isGitHubWebhookPayload at line 89. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- tools/caretaker-agent/cloudrun/ingestion-service/auth/github.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":"tools/caretaker-agent/cloudrun/ingestion-service/auth/github.ts"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d5cdb025b22b5f0359efb2e0cf8a39d6d30c4ca238ed36c47c2232cf34e358d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/a2a-server/src/http/app.ts: packages/a2a-server/src/http/app.ts changed 2 times in last 90 days, max cyclomatic complexity 20 in app.createApp at line 197. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- packages/a2a-server/src/http/app.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":"packages/a2a-server/src/http/app.ts"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f247cea66fcc14b622ee9a91b463a6ceac9335f790bb4e2ba89e109e74a97c3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: tools/caretaker-agent/cloudrun/egress-service/src/actions/github.ts: tools/caretaker-agent/cloudrun/egress-service/src/actions/github.ts changed 2 times in last 90 days, max cyclomatic complexity 16 in github.handleEgressEvent 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-23..2026-09-21, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-23 20:36:40 \u002B00:00\u0027 --until=\u00272026-09-21 20:36:40 \u002B00:00\u0027 --full-history --no-merges -- tools/caretaker-agent/cloudrun/egress-service/src/actions/github.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":"tools/caretaker-agent/cloudrun/egress-service/src/actions/github.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b5e2879fd50310e890936b93bf5328d3c4ab0982181a0ff88203c3b3d36c3de"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #1: If anonymized user #1 becomes unavailable, 16 significant file(s) lose their only recent owner: tools/caretaker-agent/evals/triage/helpers/summary.py, tools/caretaker-agent/cloudrun/ingestion-service/app.ts, tools/caretaker-agent/cloudrun/triage-worker/db/issues_store.py, tools/caretaker-agent/evals/triage/runner.py, tools/caretaker-agent/cloudrun/triage-worker/main.py, tools/caretaker-agent/evals/triage/judge.py, tools/caretaker-agent/cloudrun/triage-worker/utils/agent_logger.py, tools/caretaker-agent/evals/triage/tools/dataset_metrics.py (\u002B8 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"8d80e05b55c51250b8c9064bd7786dbc1e5a8b1dc9a426bc71fdad58ecca40c4"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #2: If anonymized user #2 becomes unavailable, 14 significant file(s) lose their only recent owner: packages/core/src/context/utils/snapshotGenerator.ts, packages/core/src/context/pipeline/contextWorkingBuffer.ts, packages/core/src/context/testing/contextTestUtils.ts, packages/core/src/context/config/profiles.ts, packages/core/src/context/graph/toGraph.ts, packages/core/src/context/graph/render.ts, packages/core/src/context/processors/stateSnapshotProcessor.ts, packages/core/src/context/utils/contextTokenCalculator.ts (\u002B6 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9d3628d21f9ffb1f47a936329ffe397395410398d35d3dc90e70dc44ba949898"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #3: If anonymized user #3 becomes unavailable, 7 significant file(s) lose their only recent owner: scripts/utils/eval-analysis.ts, scripts/utils/eval-validate.ts, scripts/utils/eval-inventory.ts, scripts/utils/eval-report.ts, scripts/utils/eval-coverage.ts, scripts/utils/tool-registry.ts, scripts/eval-validate-cli.ts. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"b4c11b5746b2cf112a7e70bd6503b83e4545164979af97f0d3c0a0cd68a2dd4b"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #4: If anonymized user #4 becomes unavailable, 7 significant file(s) lose their only recent owner: packages/cli/src/ui/components/InboxDialog.tsx, packages/core/src/services/memoryService.ts, evals/skill_extraction.eval.ts, packages/core/src/agents/skill-extraction-agent.ts, packages/core/src/services/memoryPatchUtils.ts, packages/cli/src/utils/devtoolsService.ts, packages/core/src/config/scoped-config.ts. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"5763857871272f3718c68cf702dcd132c88436eccf72ac1c5139c0b01589e8d0"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #5: If anonymized user #5 becomes unavailable, 6 significant file(s) lose their only recent owner: evals/frugalReads.eval.ts, evals/answer-vs-act.eval.ts, evals/automated-tool-use.eval.ts, tools/gemini-cli-bot/metrics/scripts/actions_spend.ts, evals/frugalSearch.eval.ts, evals/edit-locations-eval.eval.ts. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e6ab1f92fa8919e0cf7ee33f2b6321311cd25be9a79bd04c3c1523beb9bdec7d"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #6: If anonymized user #6 becomes unavailable, 4 significant file(s) lose their only recent owner: packages/core/src/agents/remote-subagent-protocol.ts, packages/core/src/agents/local-subagent-protocol.ts, packages/core/src/agents/local-session-invocation.ts, packages/core/src/agents/remote-session-invocation.ts. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"3f7000856c79cc0f7f9a303ced91ccf5b656ba38cd0b7e14058f52741c158af3"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #7: If anonymized user #7 becomes unavailable, 3 significant file(s) lose their only recent owner: tools/caretaker-agent/cloudrun/pr-generator/workflow/orchestrator.py, tools/caretaker-agent/cloudrun/pr-generator/workflow/db/db_interface.py, tools/caretaker-agent/cloudrun/pr-generator/workflow/agent_runner.py. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e81d2e04e421af511c20724402fb1173d22ac759d91659bd6c3a2a46be3c8302"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #8: If anonymized user #8 becomes unavailable, 3 significant file(s) lose their only recent owner: packages/core/src/tools/trackerTools.ts, packages/core/src/services/trackerService.ts, packages/core/src/tools/definitions/trackerTools.ts. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ba618a75ff0d0c060be3ca7ce79107684e54fa01fa1048d31ad7308e7f05c985"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #9: If anonymized user #9 becomes unavailable, 3 significant file(s) lose their only recent owner: packages/cli/src/ui/utils/mouse.ts, scripts/cleanup-branches.ts, packages/cli/src/ui/hooks/useAnimatedScrollbar.ts. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d90153c23933dc1783e40906145f1262cb1c6457f2300f0ecccba88cd4c4f4c4"}},{"ruleId":"D16","level":"note","message":{"text":"Further sole-owners (lower concentration): 12 other contributor(s) are each the sole owner of a small amount of code below the off-boarding threshold \u2014 folded into the bus-factor score and metrics (77 single-owned of 770 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; 770 of the 1202 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)) (\u002B6 more) \u2014 spread or document their files in the same way, at lower priority than the named off-boarding risks above."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6eac528f2429e724e1a97ed868f79eefbcf1888dab4af9a9e673429369bb5b2f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This test currently fails in sandbox mode (Docker/Podman) because \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"integration-tests/stdin-context.test.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"66691dd006ce46666ae598f01bc1198acd37d62beb97e1fd1ed6d95d99fdefbd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // More aggressive global replace for all TODO patterns \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"integration-tests/skill-creator-scripts.test.ts"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"23021b2a0962fa7b7451ad091e62add27b6336b515f33aef3fa73b1f5fc7ce8f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(#11062): Un-skip this once we can make it reliable by using hard coded"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"integration-tests/run_shell_command.test.ts"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"2651d8613c11850704ec8d2ec2c94c1ee5ebd19cf4aa1a45e1a28e96c5195928"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(#11966): Deflake this test and re-enable once the underlying race is resolved."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"integration-tests/run_shell_command.test.ts"},"region":{"startLine":447}}}],"partialFingerprints":{"codehealthFindingId/v1":"231cdd5f93cedd96abc2f80c25a34843a640ab9b866104fe9fb7716c02e71b3e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(#14527): Re-enable this once fixed"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"integration-tests/extensions-reload.test.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca20f18bab6db01d4615ffaa68078a7cceaef27f46df1e210e6de47f74097710"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Context compression is broken and doesn\u0027t include the system \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"integration-tests/context-compress-interactive.test.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"4020e0f517ea8bc3899ade856c7e41ae7291c6587925ce0dd5ad20dd109fd375"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Ensure full compatibility with V2 nested settings structure (settings.schema.json). \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/a2a-server/src/config/settings.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"11bfe438c9adc4b63a0c7590223f6a1978393c49feb916af7cc5b699fcee9d95"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Cache settings in sandbox mode as well. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/gemini.tsx"},"region":{"startLine":473}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6bf1b2ac05773d7fcda5b958ab13285882406b83de0bfc66448eced15ce8f2b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(jacobr): refactor loadCliConfig so there is a minimal version \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/gemini.tsx"},"region":{"startLine":692}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7661b51b0f5e4c95c90cb1660e446469a3870fbde5a2c470091a8570fcac1c9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: issue 19387 - Enable symlink tests on Windows \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/config/trustedFolders.test.ts"},"region":{"startLine":508}}}],"partialFingerprints":{"codehealthFindingId/v1":"c622f441dc1de670bc381e008b8f9ba74f7a9daf94503e9e875d7f388127ace0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Gracefully handle this call failing, we should back up the old \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/config/extension-manager.ts"},"region":{"startLine":450}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cf27689162515887cabe14e0f4ef1c5b28af3de63568f904d07c28705f8618f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(b/343434939): This is a bit of a hack. The contextFileName should ideally be passed \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/config/config.ts"},"region":{"startLine":620}}}],"partialFingerprints":{"codehealthFindingId/v1":"bacc574c18bb971ab3a5fa64a4dd0081e21d13258021791c7590705b157f58aa"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(joshualitt): Clean this up alongside removal of the legacy config. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/config/config.ts"},"region":{"startLine":942}}}],"partialFingerprints":{"codehealthFindingId/v1":"d27c3f927d71086716e362f2b67f64803692708b3ba734a67badb2a82802f205"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: loading of hooks based on workspace trust \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/config/config.ts"},"region":{"startLine":1110}}}],"partialFingerprints":{"codehealthFindingId/v1":"cab7927d93c5ae644227c76cb1251d18a76ed5d4b8287f41374e4c790602b1bc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(richieforeman): Consider moving this to test setup globally. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/config/config.integration.test.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"01c1135c23c87a45b496111949944ea6060c21dc0bf957c42f0e86230df120eb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(richieforeman): Consider moving this to test setup globally. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/telemetry/clearcut-logger/clearcut-logger.test.ts"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"029b52764b7707e342291b22e6cb5bde66e4ca26dd5f4904d4a0fe9782d3403d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Consider handling other auth types that should also skip the blocking screen \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/AppContainer.tsx"},"region":{"startLine":769}}}],"partialFingerprints":{"codehealthFindingId/v1":"241aece0a4a5e6a18c438e88777b8ad2a078570ebb571ec52c3ef03553683f27"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(abhipatel12): Ensure that config is never null. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/commands/types.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"a90f0766a3ddaf5841cc5e125586e6b49f0d7be6fda266cf769883318e94b738"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Remove args. CommandContext now contains the complete invocation. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/commands/types.ts"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8d45e666ef89fa1552114a3b3d32357c3646fd9e6ede1e8a59b5ea8a1adec6d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Check pty service actually scrolls (request)[https://github.com/google-gemini/gemini-cli/pull/17438/changes/c9fdaf8967da0036bfef43592fcab5a69537df35#r2776479023]."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/ShellInputPrompt.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfe8386ab36e6d8ed08ae6d01ff788f3a7a2371e3e7dff0ee9758f7fbdf9014a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(jacobr): we should return true for all messages that are not \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/MainContent.tsx"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d8e7fbe28f25fb982c17bbb44eeb916a98cea6e1f66510d8c482a05759c682e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(jacobr): consider adding stableScrollback={!config.getUseAlternateBuffer()} \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/MainContent.tsx"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a1a565b2af2200960eac0acc7754de554fa699803beaef2ec1ff0682ecb6841"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(jacobr): this special case is likely not needed anymore. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/InputPrompt.tsx"},"region":{"startLine":736}}}],"partialFingerprints":{"codehealthFindingId/v1":"df50f385fd14e84c3ee763685114c478399490cf7f284072a3541754cd8acc63"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(24053): Usage of type guards makes this class too aware of internals \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/messages/ToolGroupMessage.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"2998be14f98a96f7033214474bb7560efa3b98bba20220238854c7e2af4c9751"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(#23009): Remove this hack once we migrate to the new renderer."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"f197b0f16c885be3ad17f50abdd463bfd5339f3210296e68a1717b0e281f565b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(#22883): This lookahead logic is a tactical UI fix to prevent parallel agents"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/hooks/useGeminiStream.ts"},"region":{"startLine":463}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba5a0af60d13bf8ac9020a913ae39d1364e645144f7493a128b80cfa2a027b72"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement dynamic shell-related state derivation from trackedTools or dedicated refs. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/hooks/useAgentStream.ts"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"e17f63a4569e903c1395705d88c8c4580094fd16911c14c99e9d583fe19858d6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Support LoopDetection confirmation requests \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/hooks/useAgentStream.ts"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"c77bc92b92f134ce2d1b429fd18c700ee117fa0deaa6bc5f9cb5165c7de9325f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Support native handleApprovalModeChange for Plan Mode \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/hooks/useAgentStream.ts"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"206a043db29d7ae0e4946e9303e3b86fb15bc28dea05db9ee564a9ddbd3106c2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Ideally this would happen more directly inside the ExtensionLoader, \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/hooks/slashCommandProcessor.ts"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"9685a79ba91e774ddd7e1be95990e3979ac60978af206a53ba0da4b1a266c254"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: For better performance and architectural clarity, this two-pass \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/utils/commands.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d19bdbba06cd8ff700652c79fad24e63f0964b2558a47702ab388a6da2817da"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Interactive may eventually allow selected in-stream sends such as \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/agent/legacy-agent-session.ts"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff11f382d544328da1a44baa5831df5abad394659ce7d29914a0971b4c1aee06"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // We assume the user has provided an access token via some mechanism (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":"packages/core/src/agents/remote-invocation.ts"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8302c65ae69655e4ef5ec287ab87aceb1d1d82c831d0557fb679680a745a2c9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Add this test once we actually have a built-in agent configured. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/agents/registry.test.ts"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d6331704f656e62dd643c052749373dbfcb2f05452ace94daf2cc47987dbe6f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Remove normalizeAgentCard once @a2a-js/sdk handles \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/agents/a2a-client-manager.ts"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f8e9229e2eb7a73f6b53987f3472c2cea5d34d1983a75f3ed876c4f2ccbd038"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Add \u0027query\u0027 and \u0027cookie\u0027 location support if needed. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/agents/auth-provider/types.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"00b752b20b32315f0da4727bee51db8fb5790dc7e74a90378b8946a09569dcc7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/agents/auth-provider/factory.ts"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"21ff6c54453fdf73ccc33dc9743f500a867b51ce8a836f654f380f6f51c29cdb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: change to \u0027desktop\u0027 when G1 service fix is rolled out \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/billing/billing.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"325b139ebe343e28873171b316c5821d8c517cb445e924a07a43814f600156f5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: deprecate once backend stops sending this field \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/code_assist/types.ts"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"52daeb4439172a357a0f243f87964af670a7c9ecbca0a11ea3e8744ffcf64a9d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: set to none and const once the experiment for 3_5 flash rollut can be \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/config/models.ts"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"b17dd1cc47d3b95811fe5a7419f6ba14a2042e21920688c54b5d53ff71558d96"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Set to const and update to \u0027gemini-3.5-flash\u0027 once the experiment for \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/config/models.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"1719e9c3030af84ea845c1d39547dad4e553334dc5a97481790af03e73802f18"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Cleanup once the experiment for 3_5 flash rollut can be cleaned up. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/config/models.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0fcb61f43c6ba0baf0d4658ce74f8a8e059fbc9a16222bf431b6e1d6afa3b57"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(joshualitt): Introduce internal base configs for the various models, \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/config/defaultModelConfigs.ts"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"799a60a14f0ae443307e9788ecefc43a9c4e92e6df0a19485634079d6f3d2768"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(joshualitt): During cleanup, make modelConfig optional. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/config/defaultModelConfigs.ts"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"8877587a5c65374268e12adb377c7eb48d0702cff2924b60bee11ad4d04097eb"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: // HACK: The settings loading logic doesn\u0027t currently merge the default \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":"packages/core/src/config/config.ts"},"region":{"startLine":1149}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2e3105289935aa12ca243b861316009283748c120d888d8130ef422f3d86b71"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(12593): Fix the settings loading logic to properly merge defaults and \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/config/config.ts"},"region":{"startLine":1154}}}],"partialFingerprints":{"codehealthFindingId/v1":"92abe9dca09af6bc4dcaeeb4249d65186b33f24da3bc93c53caf883ab3e5b692"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Remove once the experiment for 3_5 flash rollut can be cleaned up. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/config/config.ts"},"region":{"startLine":3589}}}],"partialFingerprints":{"codehealthFindingId/v1":"597b0794a4b702c3cb9a45c1cd10f7da61a2b2fd36fa0fa1f04ee7b8b8018f0d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(joshualitt): wire up a sensible abort signal, \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/context/chatCompressionService.ts"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1449259839cd096acffe0e961c15265cfad1d5e0e8ef7305c5b2d630c822ddc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(joshualitt): just pass the BaseLlmClient instead of the whole Config. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/context/agentHistoryProvider.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"56b20aa32b5f58c3aff833c8fde4fbd35128a1ae81d689d7fbf77af859031dc3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(12622): Ensure we don\u0027t overrwrite these when they are \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/core/geminiChat.ts"},"region":{"startLine":957}}}],"partialFingerprints":{"codehealthFindingId/v1":"151e227439dc69cdc05240ea75d118140b2840ca347b0fa085270dd719549112"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: add logging expect statement \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/fallback/handler.test.ts"},"region":{"startLine":395}}}],"partialFingerprints":{"codehealthFindingId/v1":"e156001df7b1190bb163a070e3d8dd0a23f67dbfe74cdf52d24af0705244c801"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: add logging expect statement \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/fallback/handler.test.ts"},"region":{"startLine":409}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd912eba7ff50810206733a135b43ce10049e3c62ee89f1ceb71ccdeb78cbca8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(mcp): Decouple mcpName rules from FQN string parsing \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/policy/toml-loader.ts"},"region":{"startLine":475}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d15ad6c95a27947af7e8563cddb7d1165555e8d00ecce184147e6f427b6063f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO - Consider using function req/res if they help accuracy. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/routing/strategies/gemmaClassifierStrategy.ts"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"af277cf1600a4f4ab14cfb855293258178b9c4f243f37a52045974c3eea12022"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO - Consider using function req/res if they help accuracy. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/routing/strategies/classifierStrategy.ts"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"00ef5fa6e0fe0e90238d4a66fb8a9f6321445f2975e7ee8ab837b163f0349651"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Phase 5 - Add support for custom external checkers \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/safety/registry.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"01af3de452b7a8372b8c295b13eda0819437fa58f85e6fa6b6462b9c12fa7efe"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Make required after migration. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/scheduler/types.ts"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4f1e7f2b5678dd1f6bb5c17093cf275fda60949912c5bf79d7f28073c1ea8c7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Remove legacy callback shape once event-driven migration is complete \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/scheduler/state-manager.ts"},"region":{"startLine":412}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f2d4257ef188ba39437b667423b7f87e2a04f1cbd5e910df6f3f3fc5e74a120"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Refactor this tool-specific logic into the confirmation details payload. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/scheduler/state-manager.ts"},"region":{"startLine":464}}}],"partialFingerprints":{"codehealthFindingId/v1":"fec5979ff72326ea31f6b87fe744f277ad6a87a2ebcef809ebcd62150a083a90"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Optimize policy checks. Currently, tools check policy via \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/scheduler/scheduler.ts"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4f7d4292ced147d523f832ba49acff224c4b89e24a8aff614c74a0d2e4641b8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This is a temporary fix to enable AUTO_EDIT mode for specific \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/scheduler/policy.ts"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"f828c08779fdccfd5cae5253b053774c20c1330c4b26ee6f7033d2dc4c96e1fa"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Remove legacy confirmed boolean fallback once migration complete \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/scheduler/confirmation.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed8a3cac880afd650e2030efb3ab058d4c2d17915052c225e2cf1700487325e6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(12597): Process config to build a typed alias hierarchy. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/services/modelConfigService.ts"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e93b8a64d7f9d514f7d9f26372e80ea35c80e8d2366747babf7a4c5a4ff90ad"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(joshualitt): Consider knobs here, i.e. opt-in to deep merging \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/services/modelConfigService.ts"},"region":{"startLine":638}}}],"partialFingerprints":{"codehealthFindingId/v1":"234ef4b3b6381ac80a0a259d60e399d0c623f27b35a707c04454362f74eb410d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Add specific performance monitoring settings to config \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/telemetry/metrics.ts"},"region":{"startLine":1305}}}],"partialFingerprints":{"codehealthFindingId/v1":"35893fcb3e9f03b86f4a94f34df8a87ca8e6f637c41e0788326ca7cdf3a5e3a2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Add support for terminal display type (AnsiOutput) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/shell.ts"},"region":{"startLine":1140}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fbe35f08486d62da68725b8c8dd7cf8d36c5d445220cb0575093ec667c33864"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(chrstn): See https://github.com/google-gemini/gemini-cli/pull/5618#discussion_r2255413084"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/edit.ts"},"region":{"startLine":865}}}],"partialFingerprints":{"codehealthFindingId/v1":"159553b6d2a75c71bde970badff812ae868c884256648bd967353c93f69060a5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Integrate with a more robust server-side logger if available/appropriate. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/memoryDiscovery.ts"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"80ca55663a8e8e1a675382c5131f2f79b43d221ca462e33579821344c27b16a1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: getCustomExcludes method needs to be implemented in Config interface \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/ignorePatterns.ts"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"38004205f4a745a85a8693affedb41da819c64b9cac7e75cf61c3e749a435450"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: getCustomExcludes method needs to be implemented in Config interface \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/ignorePatterns.ts"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"4992a57407d09559ceb1c6f1e410e7019f9d6de59f36f4a18d48e20cc34d221c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Update custom command updating away from the event based system \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/extensionLoader.ts"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf6f668e39eaa6a22a1fc527a9378e59e816052c92058805e3fbbd013a1bca29"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Update custom command updating away from the event based system \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/extensionLoader.ts"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"26a430faa7f1b456660b78ba536d75884fac50e77a14ce05c3521b200349f0ae"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Integrate with a more robust server-side logger. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/bfsFileSearch.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7690cde570859113528a0230614012a356d1ca726a0a8baa8c85250d950001a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Revisit this default when we have a mechanism for wiring up approvals \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/sdk/src/session.ts"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef220208f1c872a171ae5b83a99c4ba8fa22a6cf063a3ea8fa8cad2b90a80056"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: refactor this to use a proper logger interface \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/sdk/src/session.ts"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"17dc3137f6eb3107b550fe8af36b9791028fc568e9baebde645efbee0e9841fa"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(#24999): Mock uses getGeminiClient() method but session.ts expects geminiClient property."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/sdk/src/session.test.ts"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"21b377008c4334d3434c4b1707d1691b9c7248a1065346e722ad6b9157b783e4"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: // Hack: Intercept require(\u0027vscode\u0027) globally in this process \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":"packages/vscode-ide-companion/src/integration-tests/run-test.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea494339892f2f12bc16f9653de1da4520b2e5d21cf3cbc751a5b8b52930daa5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Add logic to fetch and checkout the existing branch if responding to user feedback \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tools/caretaker-agent/cloudrun/pr-generator/workflow/orchestrator.py"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f3c00d03ed67ddc6af1dd013e35f64c08bdd173b5ea62eae7acb37f99a02aaf"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: defensive programming for when PR revision is implemented \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tools/caretaker-agent/cloudrun/pr-generator/workflow/db/db_interface.py"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c4001492a28efd11e212d69a9bc34f7daf9b17f6041bb2ad22ef091550c02fa"}},{"ruleId":"D19","level":"note","message":{"text":"Documentation: no installation or build instructions: The README installs via npx but there is no build or setup section for developers who need to install the CLI globally with npm, Homebrew/macPorts/Anaconda, or create a new environment. Add an Install Globally section covering each supported package manager and environment setup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"README.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fa6bfcd5c6ae231d1b8ee99bced50b832d1f61cde9da6cbb533467b879a57db"}},{"ruleId":"D19","level":"note","message":{"text":"Documentation: no usage examples: The README describes npx usage but there are no runnable examples showing how to run the CLI from the command line or interactively in the editor. Add a short Usage section with an example of running Gemini CLI and a quick interactive demo (e.g. \u0060gemini\u0060 \u002B \u0060/theme\u0060)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"README.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1355eb4e127a4bc9236772ce1c46f09510aa9286e7a06d1e47f308229df19049"}},{"ruleId":"D19","level":"note","message":{"text":"Documentation: no project overview: The README gives a high-level overview of what Gemini CLI does but lacks an explicit project description or purpose that explains why it matters to users. Add a one-line \u0027What is Gemini CLI?\u0027 section in the README summarizing its role as a model-integrated terminal tool for code understanding, automation, and workflows."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/index.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2160f68869d7eb2dac3080ab69d172a291b52a3d503122f7c84cc8451c376c8"}},{"ruleId":"D19","level":"note","message":{"text":"Documentation: no installation or build instructions: The install section only shows the global install command (\u0060npm install -g @google/gemini-cli\u0060) without any setup or prerequisites. Expand the Install guide to add prerequisites (node/npm version, required dependencies), a quick start, and links to authentication, CLI cheatsheet, and tutorials."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/index.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"882b7fae2ff9fe802a787a39ed48fa9a5c1d8f3988e729311c7544b4c46cc282"}},{"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":"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":"fc242ca3da5de80d55b7983f877c7eff5135c8ff6d693438885192820784d677"},"properties":{"commitSha":"d79dafc57715a014e71884f3ba4e7d82b0bb228c"}},{"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":"0020ded1adccfd898872478a52dda5e4b6c80651b6f43fbc40397bb66f942341"},"taxa":[{"id":"CWE-214","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-532","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":"cd77522eeecf6fd22dafafe7ffb86bb3c170e5964cd4c7335c89ec68d8086369"},"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":"6759466a9b1a69cd07fadb9cd030bcb276f7602c2b61a28c20105b04bca1b6f5"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4cb1613ec2e5a2debbbcff4e5943ec7e17f68a04d1742c4c55875fee7596dc78"},"taxa":[{"id":"CWE-94","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":"fca8bd882d06700303190d1f59df4ef545201bdee75f9f719428c97191cc3e21"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"921e1169c63a7d905f763aa8b2afb155fb18c6c8147df18aff09481efa646307"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4e658e90fa6338f932b2d96e83e9c3527bdf631476e85efc9016b5b4420de91b"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c9f5b7f1c59049593e16b88ed4ef5c4c7c5f1e9474408ea32198439699dce39c"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"030321f923cc75e3f2223ca313eca3e8e14d8175fce47131f11ac8110aad0afe"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-668","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":"8956a6fe1f0a12bd964720bd3335348957156521a132c8e28a5e6ffeed68330d"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8af93b54d7b6d09176d9c9016e65470b9e3497c2e30cd6af0b8b0a89230292a4"},"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":"d7ea6fc66c102ea5a0e325293d3e4a1964de533513b520ad12f46eabf1c41ddb"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"632443efb6c8bc239b80be142f7df14cc83865d261b371d92fb4a85a1a0c425c"},"taxa":[{"id":"CWE-78","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":"40b9d87cb5a2d98a291fea2fd86b41da7e0e8813982d00f72507de6aab28722d"},"taxa":[{"id":"CWE-1104","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-1352","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"04cd11852c2b23686cf2eff0cb029318fa597482212b4a5bb4e441608f36470f"},"taxa":[{"id":"CWE-1104","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-1352","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"99416691cc1dec9d2e1a1f644fb9f7f8b52eb4380d8cabf36afe860311315162"},"taxa":[{"id":"CWE-1104","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-1352","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"d50ee03451abe55e37285d86d54d2ec37283fcfcc147a32945b08bdce546019e"},"taxa":[{"id":"CWE-1104","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-1352","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"37b992bbb55194958cc72979992d6f7ab9caf82c096ba8e94668749248dc5718"},"taxa":[{"id":"CWE-1104","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-1352","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"81ee4d34810d68e49cb26e652c4ef8dbb17152718ed9e1fdf86bfaa594836904"},"taxa":[{"id":"CWE-1104","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-1352","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"2dcc09071d22c0bb56e9d5ff6bcaf37c9e84f022225821de4ffb8438ca29325d"},"taxa":[{"id":"CWE-1104","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-1352","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"ac12f54075b32b3d8d86537859b9684630d7aa9f863954bfae9e4e020b21692d"},"taxa":[{"id":"CWE-79","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":"fb7d223fefe4232f31a523cbdcb8d96b2080ef3033a4bea0a74e4daf0fb77150"},"taxa":[{"id":"CWE-79","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":"271015fc35f4148a8428d539f51f86dbb0b0075c40722a6034f5dea0ea1624ae"},"taxa":[{"id":"CWE-79","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":"88a4776810ed19e8ac2de2bc1077f3084d7261b0312594cb66fd6185aa88ee9e"},"taxa":[{"id":"CWE-798","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":"1b422d7d2acf4ec86c8855b185b5bb8a76f746739db2b625b71467e001072cde"}},{"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":"f27633136aee1eaa7628eda52ade7797fa096d9d0be86b75f355aabf094afb39"}},{"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":"a38cc934c6e23196cd52b922abd3a8416d5fc1fd002b108d672ab30a99f78f5d"}},{"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":"a9e0874efd851e9513671649d46d150ca0b12889d2874203deac188af3cd47fa"}},{"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":"a281bb26d3fd984732b3d7f2fc02b3638c3730d405ca2c03039e9b86c7027ad4"}},{"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":"f11879fd6377b26a848d9834f400705c117fc78b91b8609b3c023999218517d4"}},{"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":"a21c04bb1ead42825a9567ad9f27a55307a285d3f81e0aa4d5ac84c5a5d5a6e4"}},{"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":"0ac3da403c920646ffbe1891e1024009a323d2e3af372a657fe7ae06c024e8b5"}},{"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":"a2e781aeeb54d3ae845ae518d9f9b4fabc9ce4afb31ec2d5eceab2c30473e850"}},{"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":"5f50d173e5f5ee675c425a27c1e518637563b8907c258d437ee35c0a79b7ae04"}},{"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":"068c460e6e6a21f82537aa3cbfa5d223de242a966c31fccfbc46c08c1a340e0c"}},{"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":"6e7035ec75a9ef6b3ff2f97c3eba8376d8e869703a3ea7dd2977737206e36e2c"}},{"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":"2a9d2cf366c6831d4476891bb80c951d4de176c298ac0ef2f013bb5535a50b61"}},{"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":"37e2093a6ae9484f0664be71e27762de50c296addb73ed2d110f2a99ae8d7f00"}},{"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":"5f5c48034b71446630165b343684b12db6c9e90c79920515af3dce6813a96364"}},{"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":"3fc3322fd226b5bf7531f50e29da436b3b85144e230a0204c4a90e1641fe16cb"}},{"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":"0090672a186746a47a164e7080f3714891262907124652a979fd0fe8f58b2e72"}},{"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":"2567ea2f56ae79977dadd3bf380bcb8e0d5204997d0db598b3e49e1891ff5525"}},{"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":"52aa5225845802c8073476df6adefe103d76f700d31216519df5bb10b06bd432"}},{"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":"5a605466b23896b41773c8423e24cd1bbf7e582d5f4b0cf3fed112ddd59b8ae3"}},{"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":"5d3033e9fec29d3a04ae5123d095a1f5d681afb3a6b24d22c6898fc791ac1f21"}},{"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":"444da3eb434796582ca7a5ba8ecb73a2164ff3fc2079159f395d631df07d7a18"}},{"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":"dd5b5bb5ff8737ef29043af986439961876b394145dd0284a62660211f33da4a"}},{"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":"5b406f2c49b284fe1398e42d6e313fe3578e449bfd8b0860d6b23795174503ab"}},{"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":"b7ff922f30733979d5bd9457f5afcdf736741e802a1b07f9b4c0d6715424e506"}},{"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":"3e02f053898a35c81dd3976f70f76fbfb4f273ee92432eacacd848db60698976"}},{"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":"6938b174663ea9622818abd4e2c439d5ee9201adfe9f888506c6daf0e8ecae62"}},{"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":"7e194db4196877b364a1bda275718e49568f0019b20d4ddbd42c6ea1fda29402"}},{"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":"9425f591f94b1cfc3a6dca54abe41842cb58be9bc4ab85afb67b80d6ce1cdf6e"}},{"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":"59e28f0fc3ceb219b9638eae73d38b2bcb54c3283507449da6396114e6cfcf26"}},{"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":"02f809db19946ff68dac97234c12abfc27eedc356a81cfd3ee9e444a4053df19"}},{"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":"a123c7a8538ef5659aefc6b6b9bf5ef92557f2acc40c94c7874d873c9193a516"}},{"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":"afd3d02c0ab748829a7139110509ea488be905a72d15db2540a7f8ad7b7ae99d"}},{"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":"55388ce4e0eaf7e14d8ccde9cf7416a7a853f29d5d2d9854b0177752ce6cd831"}},{"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":"7a6c8aec811a2d7ca01dc30175c7ce3e9ebf8b9d90e6e0e2ae64d2e9773685b6"}},{"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":"98645b36f3d8a19e1462b10ae8d23a6853b810993981c4fc4065e762fff2771b"}},{"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":"c3fe61da4df3e404a42e9ada50a7211d1ea05f99e6ab6ca3261e43ac05010ad9"}},{"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":"57c74b479d2a84153ccf6949f5dbc6b0d8b6768e29c70ab915a85f3bea3ee83f"}},{"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":"6acd69e2921ca5fbd6b2a8cf756b68890011a418178f166e10ba935e03acd5f1"}},{"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":"54a7518dbb20b02dd3a84ff20105f51646ee31252fa7103fe1e7376188970b7f"}},{"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":"337614fcc997d3e2a077e4b2490d4851c54c3ab65f20d00797a3dc8dc3d7b0cc"}},{"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":"f2631a9bd617b719e9c52e0e9e450a6d15b5db5b527b340dd419a28dcdd305b2"}},{"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":"aa571a47ecd9af55f36a3364edd0ddcf29c643ee1a3b19589e5f86cf9b2dd947"}},{"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":"223db634cfbb04b77dc4a610858f41e77cde27e5d4b1d850b2baa47fcf9f8495"}},{"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":"dffb86581da7866bf29d6caccafe6da5a32841aba32d84c81585c0ba1c231384"}},{"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":"cea968b5cf2c686e8a09b8faa5a4f7545a8a6eea23d59b59253975a0d66e22db"}},{"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":"e99dada07a6d03c9e83b4dc003d002c5ce43166512e8c0664b7a2b8f2b64b89a"}},{"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":"ec96cd6f92fee2e0caef04697adc21b1573811e7234d37c39360d8d058a79732"}},{"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":"d3f262a97fee2d343cacea4e840e0c57cbfc030e7643a81e33094352a151267c"},"taxa":[{"id":"CWE-787","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-823","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"c1337f2b946ac08829fbe2d2e1faf50ba224cec2f83eaf1873d9cca17b7cb636"}},{"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":"fd1365616bddf8fffb473f7cdb59ea0354a5239fdd81524a61b87eabfa8703d0"}},{"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":"38aa0104dd8f66fde754d9244efb6660c12a74ee879c0a717963caf42d01f6ed"}},{"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":"3681e0b0dced2dca00be692922bda4012adb5a0234c1d22c53a13969ab5dd823"}},{"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":"b8c7f36637f89e2f53f39674af571b1a9c1849997c4c4634ecfcde202e8cab85"},"taxa":[{"id":"CWE-494","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":"dae5cffa0b4f561b00b43ac38f1247a165b25eca71af76fe2fa47f626df8fc2e"}},{"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":"d1401bba0c4429c66932294284b5cc6bc6c28ecbec91c78f92bbe494e7f27660"},"taxa":[{"id":"CWE-345","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-494","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":"6ef12d5d539f96aeabf983841c809af5b9b817ed44f2dbee62971f9119ee38df"},"taxa":[{"id":"CWE-494","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":"db8b958063443a1bb5686ae6491f6cd185b1123f35a42410fcaac53f4de9cb58"},"taxa":[{"id":"CWE-494","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":"e1dcfc03b133c00c24a110957a91c842f267d305aff3961adac07f42cc9d783f"}},{"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":"c1d2d7284b53c391ce0e80ec18fa139839231c85b5e41142b36970b8ec3f3a75"},"taxa":[{"id":"CWE-345","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-494","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":"7321fbc08bba0f2efc63810057d2f2bb16ef53427735700bdeb2672db09bc4a6"}},{"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":"86abd4bcf514751541a4c7c0206e287f8e1669b62b3a6d81d242c0c94f768b24"}},{"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":"fbd65a07039ff5e405bb92bc6cdedb1d6a0b1f14c83e2e99f489a4077b48ad7d"}},{"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":"2ea651fbaa724ea3e240dc24c1e4756630176bc99d47a4958af567127ca8a08a"}},{"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":"57102b8773d1321eb22e78ca537d07be26e52d3af8c78eb6fa73234ebe4764c5"}},{"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":"1755d2eb0cc818eecc8c0ef7c6056df500a4891f37043eadfd1591e69fb03098"}},{"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":"d3b4855664ba59ae3441b5e26c3ada163c18de518e8a72d549891e9ce602843a"}},{"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":"d0e4e8c4fff70a2850def739e8c7e72fd5f70c9be7d0b5192cbf8d4495489876"},"taxa":[{"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":"4bf3bcb802a6cf5a2873eee00190a242e167f9c7c102e2d2692830e08b62f2aa"},"taxa":[{"id":"CWE-1357","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":"36ac58ba9e6e291702feadf78d9cd3ca2b16d52c032b5227df708f5913426b56"},"taxa":[{"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":"c81c7c5e6f2068dbb2b7da6cd586023feca3567c3b5105b4227e993a306e9a5c"},"taxa":[{"id":"CWE-1357","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":"5cfed0ee4e80785ce23c7083cffdead9acc6c64f9dce56a00ca7178bd3d7bee5"},"taxa":[{"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":"d15df5171d54d9a3cfe919193b940b95eb1db599610449c8b68164e072da6651"},"taxa":[{"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":"46be4adc22a213ce5a6e7c28cc5725c0259ff8f8aabbda12651b36cc9549e39d"},"taxa":[{"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":"125ca03094994e63fa86b689348aa438934295eda464a50a4d78309e6bf0a876"},"taxa":[{"id":"CWE-1357","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":"ef8a2dacf0e1d32ebd87eb9f502f3e1e5c93ef98a0299f8b73f1b13b391c9359"},"taxa":[{"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":"3bcfb0e1f7a5be8fe1050698188530b2f55998ec5b678fe3d0d34c5250793980"},"taxa":[{"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":"e39b553a91cba5f1fa90274bccd04586252cd0c12d5a4fe6aaf62d2a1253193d"},"taxa":[{"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":"2754f2058d23871d8b37c76c92cdefc06e9327d354be8e273461246717e772db"},"taxa":[{"id":"CWE-1357","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":"8b9e6dca93f5ee032fb1d3bf4be2015875ac91899a6686f83ae8bd45617b6577"}},{"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":"847a952c3ecde1d50b2c7882e639a33d61b52bd89f54f08af722a2d0ca5e39ad"}},{"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":"95e9c867def364d520b0e3c08589c0820233b7eeb6b5cb267344496d87df7e3e"}},{"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":"1299fda6b64b6941a5ca00f06070265bc7b7cc92c634c2f37ecab3414eb95067"}},{"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":"65edd9d88e38050336da3033527c7a5497b3b19bf845356344b9aafed3275adb"}},{"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":"29fcf503c99a01e5f2f5a8785dfbb99dc0f7b2cdcba5e291128b408128b0f460"},"taxa":[{"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":"d6eacaa8dd56dd13e39b71e471f4e671e88d319c20075ffd2eb651972fc8f8e4"},"taxa":[{"id":"CWE-1357","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":"68ee3d4461b9cd594647ff0bb0fc85a60630a89ab091357613e6d351fd2b1067"}},{"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":"4c7303d7aa1fff7f42e091d8326677711843a048a0feded80b89f6e68a510105"}},{"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":"20a8089fd98b9b6dd6f1bb20bb93303d4efe4e5107d2c36444b36b3d3d073b71"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned files with no living knowledge: 84 of 770 analysed file(s) have no living knowledge left \u2014 their last meaningful change has decayed away, so if one breaks, no one currently understands it (counted over production source files of roughly 2,400 bytes or more, excluding vendored, generated and example/demo trees and test files identified by path convention, largest first; 770 of the 1202 production source files in this repository met that bar). None is large enough to earn a read-through of its own, so this row stands in for the per-file rows rather than raising one each \u2014 most significant first: packages/core/src/context/contextCompressionService.ts, packages/cli/src/commands/gemma/setup.ts, packages/core/src/context/toolDistillationService.ts, packages/cli/src/ui/components/ColorsDisplay.tsx, packages/core/src/tools/shellBackgroundTools.ts, packages/cli/src/commands/gemma/platform.ts, packages/core/src/telemetry/billingEvents.ts, packages/cli/src/ui/components/messages/ToolGroupDisplay.tsx (and 76 more). Attach the read to the next change that touches one of them: have a second person review that change, and leave behind a short comment or test recording what the file is for, so the knowledge comes back at the cost of a change you were making anyway."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ce861fd78f6935114d3a342cb90ad25870f984e1042954fcbbe27c0e23be3658"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: default-legacy.ts \u2194 gemini-3.ts: \u0060packages/core/src/tools/definitions/model-family-sets/default-legacy.ts\u0060 and \u0060packages/core/src/tools/definitions/model-family-sets/gemini-3.ts\u0060 change together 100% of the time (15 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 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 15 shared commits counted here, the most recent 3 are \u0060120dfc72\u0060 fix(core): update read_file schema for v1 compatibility (#22183) (#26\u2026; \u0060f16f1cce\u0060 feat(core): add tools to list and read MCP resources (#25395); \u0060e7f8d9cf\u0060 Revert \u0022feat: Introduce an AI-driven interactive shell mode with new\u0022 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/definitions/model-family-sets/default-legacy.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f3635f0546774b16f2eac0727a63d8675377a94e7c1144b27b1b478f2a8d0b3"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: AboutBox.tsx \u2194 types.ts: \u0060packages/cli/src/ui/components/AboutBox.tsx\u0060 and \u0060packages/cli/src/ui/types.ts\u0060 change together 80% of the time (8 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 8 shared commits counted here, the most recent 3 are \u0060bee1267e\u0060 feat(cli): add user identity info to stats command (#17612); \u00605c649d8d\u0060 feat(ui): display user tier in about command (#17400); \u006043d6dc36\u0060 Add User email detail to about box (#13459) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/AboutBox.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"98d5fa23865b13212f71330bf6666f913a69dfba94359b3fc39757f55c0bf454"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: AppContainer.tsx \u2192 render.tsx, Composer.tsx, DialogManager.tsx, nonInteractiveUi.ts: \u0060packages/cli/src/ui/AppContainer.tsx\u0060 changes together with 4 other files \u2014 \u0060packages/cli/src/test-utils/render.tsx\u0060, \u0060packages/cli/src/ui/components/Composer.tsx\u0060, \u0060packages/cli/src/ui/components/DialogManager.tsx\u0060, \u0060packages/cli/src/ui/noninteractive/nonInteractiveUi.ts\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":"packages/cli/src/ui/AppContainer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"46ecd90f9895d53cf71d0cd73618308517fc3c1a9c84847193f4d672de2c55ef"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: event-metadata-key.ts \u2194 types.ts: \u0060packages/core/src/telemetry/clearcut-logger/event-metadata-key.ts\u0060 and \u0060packages/core/src/telemetry/types.ts\u0060 change together 72% of the time (49 of the 68 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 49 shared commits counted here, the most recent 3 are \u0060397ff84b\u0060 Refine onboarding metrics to log the duration explicitly and use the \u2026; \u0060244a6081\u0060 feat(core): set up onboarding telemetry (#23118); \u0060b459e1a1\u0060 feat(telemetry): track if session is running in a Git worktree (#23265) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/telemetry/clearcut-logger/event-metadata-key.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"86db0de3180a2261b1109d8426b19236edc94d70e5aa43585bf9668cb5b9937a"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: useGeminiStream.ts \u2194 useLoadingIndicator.ts: \u0060packages/cli/src/ui/hooks/useGeminiStream.ts\u0060 and \u0060packages/cli/src/ui/hooks/useLoadingIndicator.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) 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 8 shared commits counted here, the most recent 3 are \u006077027dff\u0060 fix(cli): clear stale retry/loading state after cancellation (#21096)\u2026; \u00608303edbb\u0060 Code review fixes as a pr (#20612); \u00607f8ce865\u0060 Add low/full CLI error verbosity mode for cleaner UI (#20399) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/hooks/useGeminiStream.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5502b2b9f3b447eaf09c092c09c08baaf402c84f913263a5fd231c2ee0414556"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: snippets.ts \u2194 dynamic-declaration-helpers.ts: \u0060packages/core/src/prompts/snippets.ts\u0060 and \u0060packages/core/src/tools/definitions/dynamic-declaration-helpers.ts\u0060 change together 64% of the time (7 of the 11 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 7 shared commits counted here, the most recent 3 are \u0060e7f8d9cf\u0060 Revert \u0022feat: Introduce an AI-driven interactive shell mode with new\u0022; \u0060651ad63e\u0060 feat: Introduce an AI-driven interactive shell mode with new \u0060read-sh\u2026; \u0060ca43f8c2\u0060 feat(core): prioritize discussion before formal plan approval (#24423) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/prompts/snippets.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc67a9f910f33a164895fc3c4db2c86952b3d1b000061413a589f8ec82a08948"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: constants.ts \u2194 types.ts: \u0060packages/core/src/telemetry/constants.ts\u0060 and \u0060packages/core/src/telemetry/types.ts\u0060 change together 63% of the time (19 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 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 19 shared commits counted here, the most recent 3 are \u006083075b28\u0060 refactor: make log/event structure clear (#10467); \u006070610c74\u0060 feat(telemetry): Add telemetry for web_fetch fallback attempts (#10749); \u0060c0552ceb\u0060 feat(core): add telemetry for subagent execution (#10456) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/telemetry/constants.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"31ddd57624449ef85d342d0543455a1c329ed63fae1e8fca77ef2888e3589d0d"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: shell.ts \u2194 tool-utils.ts: \u0060packages/core/src/tools/shell.ts\u0060 and \u0060packages/core/src/utils/tool-utils.ts\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 \u0060f3bbe6e7\u0060 fix(core): send shell output to model on cancel (#20501); \u00607ca3a33f\u0060 Subagent activity UX. (#17570); \u00602e6d69c9\u0060 Fix --allowed-tools in non-interactive mode to do substring matching \u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/tools/shell.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"45e74c2558f4f928b46499385fdc351d03802039710924fbf06ccd7005a6483a"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: auth.ts \u2194 AuthDialog.tsx: \u0060packages/cli/src/config/auth.ts\u0060 and \u0060packages/cli/src/ui/auth/AuthDialog.tsx\u0060 change together 59% of the time (10 of the 17 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 10 shared commits counted here, the most recent 3 are \u00601e7063bb\u0060 fix(cli): allow keychain auth for --list-sessions and non-interactive\u2026; \u00609d74b7c0\u0060 feat(auth): Add option for metadata server application default creden\u2026; \u006006035d5d\u0060 feat(auth): improve API key authentication flow (#11760) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/config/auth.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"75fd3e40f2d3d55fb390b4e055ae33e4c870ed38ec5015ecd589fc90b185dfab"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: errorParsing.ts \u2194 retry.ts: \u0060packages/core/src/utils/errorParsing.ts\u0060 and \u0060packages/core/src/utils/retry.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) 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 \u0060ee92db75\u0060 fix: handle request retries and model fallback correctly (#11624); \u0060996c9f59\u0060 Revert \u0022fix: handle request retries and model fallback correctly\u0022 (#1\u2026; \u0060319f43fa\u0060 fix: handle request retries and model fallback correctly (#9407) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/errorParsing.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ebb98ae64a1983308ca4dd3d37e9c2eb9c63e3afbd23abda5c805a05cf960cd"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: event-metadata-key.ts \u2194 loggers.ts: \u0060packages/core/src/telemetry/clearcut-logger/event-metadata-key.ts\u0060 and \u0060packages/core/src/telemetry/loggers.ts\u0060 change together 56% of the time (38 of the 68 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 38 shared commits counted here, the most recent 3 are \u00604c5e8877\u0060 feat(telemetry): add browser agent clearcut metrics (#24688); \u0060397ff84b\u0060 Refine onboarding metrics to log the duration explicitly and use the \u2026; \u0060244a6081\u0060 feat(core): set up onboarding telemetry (#23118) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/telemetry/clearcut-logger/event-metadata-key.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b804dd6779655daf70d76af41f84a042efc0ec4bfe659808b6ac9b65ff1a7ef"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: App.tsx \u2194 ContextSummaryDisplay.tsx: \u0060packages/cli/src/ui/App.tsx\u0060 and \u0060packages/cli/src/ui/components/ContextSummaryDisplay.tsx\u0060 change together 56% of the time (10 of the 18 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 10 shared commits counted here, the most recent 3 are \u00604f2974db\u0060 feat(ui): Improve UI layout adaptation for narrow terminals (#5651); \u0060e2754416\u0060 Updates schema, UX and prompt for IDE context (#5046); \u00601d3ad9d0\u0060 Add drawer for active files in IDE mode (#4682) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/App.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2e7c94fc56efff440ac77ae54df50d588d622c58bc291a0e643877082c4f69d"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: config.ts \u2194 dynamic-declaration-helpers.ts: \u0060packages/core/src/config/config.ts\u0060 and \u0060packages/core/src/tools/definitions/dynamic-declaration-helpers.ts\u0060 change together 55% of the time (6 of the 11 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \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 \u0060e7f8d9cf\u0060 Revert \u0022feat: Introduce an AI-driven interactive shell mode with new\u0022; \u0060651ad63e\u0060 feat: Introduce an AI-driven interactive shell mode with new \u0060read-sh\u2026; \u0060f5103947\u0060 Implement background process monitoring and inspection tools (#23799) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/config/config.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"64aeb28b620c81afda94554b021f069cccfa08b8332c1b21b72aaad53240d8ff"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: config.ts \u2194 memoryCommand.ts: \u0060packages/cli/src/config/config.ts\u0060 and \u0060packages/cli/src/ui/commands/memoryCommand.ts\u0060 change together 53% of the time (9 of the 17 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 9 shared commits counted here, the most recent 3 are \u006085736502\u0060 feat(config): split memoryManager flag into autoMemory (#25601); \u00602e229d3b\u0060 feat(core): Implement JIT context memory loading and UI sync (#14469); \u006047603ef8\u0060 Reload gemini memory on extension load/unload \u002B memory refresh refact\u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/config/config.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0603cf0d396851be8a7f4c31602df05c6becd6bb2663bf0ef5452abb1246a3d3"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: policy-engine.ts \u2194 toml-loader.ts: \u0060packages/core/src/policy/policy-engine.ts\u0060 and \u0060packages/core/src/policy/toml-loader.ts\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 \u0060b35c12d8\u0060 fix(core)!: Force policy config to specify toolName (#23330); \u00601725ec34\u0060 feat(plan): support plan mode in non-interactive mode (#22670); \u0060527074b5\u0060 feat(policy): support subagent-specific policies in TOML (#21431) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/policy/policy-engine.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"052d538e9ab31de6b7088fa5e1830df9cb8ae220cb4a285ac84f487df2d3f65a"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: registry.ts \u2194 remote-invocation.ts: \u0060packages/core/src/agents/registry.ts\u0060 and \u0060packages/core/src/agents/remote-invocation.ts\u0060 change together 50% of the time (7 of the 14 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \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 \u00600c919857\u0060 feat(core): support inline agentCardJson for remote agents (#23743); \u00607ae39fd6\u0060 feat(a2a): add agent acknowledgment command and enhance registry disc\u2026; \u00604b76fe00\u0060 feat(core): add google credentials provider for remote agents (#21024) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/agents/registry.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"195b78f772c00f1b78a98e72237c4b58cd20b8738d322a7147e509b0fa729c8e"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: extensions.tsx \u2194 extension.ts: \u0060packages/cli/src/commands/extensions.tsx\u0060 and \u0060packages/cli/src/config/extension.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 \u00606a581a69\u0060 Add \u0060gemini extensions link\u0060 command (#7241); \u006051bb624d\u0060 Add extensions enable command (#7042); \u0060f32a54fe\u0060 [extensions] Add extensions update command (#6878) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/commands/extensions.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5247fc7cb536f59d0bc666dd781e828068e5e6ae000452d6e9f7a1689596cd14"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: GeminiMessage.tsx \u2194 ToolMessage.tsx: \u0060packages/cli/src/ui/components/messages/GeminiMessage.tsx\u0060 and \u0060packages/cli/src/ui/components/messages/ToolMessage.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 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 \u00606ded45e5\u0060 feat: Add markdown toggle (alt\u002Bm) to switch between rendered and raw\u2026\u2026; \u0060fe5bb669\u0060 Screen reader updates (#7307); \u0060b0bc7c3d\u0060 Fix flicker issues by ensuring all actively changing content fits in \u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/messages/GeminiMessage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b1a70287e72fdb515b878809a54e48a72763d35a37f74e5e15f63d7634e0635"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: aboutCommand.ts \u2194 AboutBox.tsx: \u0060packages/cli/src/ui/commands/aboutCommand.ts\u0060 and \u0060packages/cli/src/ui/components/AboutBox.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 \u00605c649d8d\u0060 feat(ui): display user tier in about command (#17400); \u006043d6dc36\u0060 Add User email detail to about box (#13459); \u0060925d747b\u0060 Revert \u0022feat: add explicit license selection and status visibility (#\u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/commands/aboutCommand.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd5d04278b46ecf623e392c9e31878be900d70353450c6e6906be323c2de21bd"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: ProQuotaDialog.tsx \u2194 useQuotaAndFallback.ts: \u0060packages/cli/src/ui/components/ProQuotaDialog.tsx\u0060 and \u0060packages/cli/src/ui/hooks/useQuotaAndFallback.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) 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 \u0060188e255b\u0060 fix(core,cli): resolve false model capacity exhaustion and fix core q\u2026; \u0060edb1fdea\u0060 fix(cli): support quota error fallbacks for all authentication types \u2026; \u0060d8a3d08f\u0060 fallback to flash for TerminalQuota errors (#13791) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/ProQuotaDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8c9603dea097688c31fcdeb352aed5e0c11531021da939992eba66fb5fc11ba"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: UIStateContext.tsx \u2194 nonInteractiveUi.ts: \u0060packages/cli/src/ui/contexts/UIStateContext.tsx\u0060 and \u0060packages/cli/src/ui/noninteractive/nonInteractiveUi.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) 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 \u00601f1cf756\u0060 Add shortcuts hint and panel for discoverability (#18035); \u0060902e5d6d\u0060 feat(cli): Add state management and plumbing for agent configuration \u2026; \u00609786c4dc\u0060 Check folder trust before allowing add directory (#12652) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/contexts/UIStateContext.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b53ca1680e40ad28e2cc53415dc677f09e1891998e6a7a1441309a079923af26"}},{"ruleId":"D36","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1b213f6eedd4b140d0bc37bdf1496f72811a643f34064f12518b32e9e83bcfc7"}},{"ruleId":"D36","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"eb00976a698a5d68999b7ee6d27206fd374e916853e7ff1ead5eed42386f043f"}},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0752d0df7434000fcabf1048e2de30a7a1a8b982b3db9a19898c4dec199856b4"}},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d068c977b62d9a977df1bb6f53e8b00b586c3abee955f91d715f92b8e019d624"}},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d657599f6f99da1927d3377533dfc0888b34c4d84aa7d5579841fd72d0e39bce"}},{"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":"01617c8618e3c4e3878dbf35ba9ff053ccec9d7cd1ea559a8db623472c13a49c"}},{"ruleId":"D36","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4f1e7684f8281bd255ddef97105c7055c2ebae06964c8745716b83e174debe83"}},{"ruleId":"D44","level":"warning","message":{"text":"End-of-life runtime: Node.js 20: .nvmrc declares Node.js 20 as this project\u0027s version file, and Node.js 20, support ended 2026-04-30. An unsupported runtime receives no security patches, so every vulnerability disclosed in it since 2026-04-30 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":"ba2fac88ecce9222fb97ec1899fb451aa389ee46ee33b9240eab4a62105362ec"}},{"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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"37a2b212b3d5a9652dc0cbbb3f4caa2a9db3134e0e3b71cb903e2fc42de042e4"}},{"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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":1047}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a2d6f000932d5f64287904c70501bd41c7603d782973e8cf87208428ca85573"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. This document\u0027s body is only the mount point \u003Cdiv id=\u0022root\u0022\u003E, so there is no content here to wrap \u2014 render the \u003Cmain\u003E from the component mounted into it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/devtools/client/index.html"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b56909511ab41fa759445c963f602f3a2ff864c259a82531de191f0e51914e2"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":584}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd18022a25ba7530f7492c1d9818bd53a3b21a4079888953d22da5c7b0177a8c"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":706}}}],"partialFingerprints":{"codehealthFindingId/v1":"4965b4c5ff093acc30e8277defef3e8e6af1a0ace8c9e429d96cecc3c8d1c511"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":953}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c40c367b0e0563ef887e6304933c217b561fe77b89ec8ab704b177cc3ab435c"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":1083}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a2429ceedf978427aaea7adfe90fd45db037099e9ff87557c055bccc01ded71"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":1266}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fa0f58340984a3f4bff3312b47a74e46059fe4b4f5091ff07558de29b25d004"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":1345}}}],"partialFingerprints":{"codehealthFindingId/v1":"bce2a6caef311c5e9e6202103080e4e49409a50a5103ac75cd3cb0d25a403600"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cspan\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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":1809}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab42b5f850a36915ab9ac7860a32b8122601a7190148c6f19d260dd824aa5c02"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\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":"packages/devtools/client/src/App.tsx"},"region":{"startLine":1922}}}],"partialFingerprints":{"codehealthFindingId/v1":"739c8c13f515e0f094813a761807308f84ec0bf7b1c36a175a4a0b07c6f84df4"}},{"ruleId":"AC7","level":"warning","message":{"text":"Accessibility enforcement below the top rung: No accessibility enforcement found \u2014 no a11y linter (eslint-plugin-jsx-a11y) and no axe/pa11y/Lighthouse in tests or CI. Start with the linter to catch issues at author time. What was searched, so you can tell an absence from a miss: the 20 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":"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":"R10","level":"warning","message":{"text":"Duplication concentrated across 4 sibling directories (27 clone groups): 27 duplicated blocks under packages/ have copies in at least two of the sibling directories a2a-server, cli, core, devtools \u2014 20 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 27 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 27 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 27 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":"packages/a2a-server/src/commands/restore.ts"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"88618a84540f3fe5c309662f185e2813c92debb5a3d68e5461b19bab63cb9b54"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 18 sibling directories (22 clone groups): 22 duplicated blocks under packages/core/src/ have copies in at least two of the sibling directories agent, agents, code_assist, commands, config, context (\u002B12 more sibling(s) not listed) \u2014 11 of them are reported below, and 11 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 22 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 22 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 22 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":"packages/core/src/agent/legacy-agent-session.ts"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"83b8186deec1ccbe548f844e503f89c0dcaeade947cc390102a057cf147c5cf4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 7 sibling directories (16 clone groups): 16 duplicated blocks under packages/cli/src/ have copies in at least two of the sibling directories acp, commands, config, core, services, ui (\u002B1 more sibling(s) not listed) \u2014 10 of them are reported below, and 6 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 16 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 16 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 16 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":"packages/cli/src/ui/hooks/useExtensionUpdates.ts"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"3967d6424024365ba1a40a845edbe0e2851156df52161317411b7adb55a03e63"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 5 sibling directories (15 clone groups): 15 duplicated blocks under packages/cli/src/ui/ have copies in at least two of the sibling directories auth, commands, components, hooks, privacy \u2014 5 of them are reported below, and 10 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 15 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 15 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 15 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":"packages/cli/src/ui/auth/ApiAuthDialog.tsx"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8101fef5b76662ca3f11bda52d2753017a52129889cd151e6118b66d0e020b9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 3 sibling directories (6 clone groups): 6 duplicated blocks under the repository root have copies in at least two of the sibling directories evals, packages, scripts \u2014 1 of them are reported below, and 5 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":"packages/core/src/code_assist/experiments/client_metadata.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b654e38da6bdfa434ae0855a47c1b79eeb1b0ae5ce5ac16f3220a7079fe5b55"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (285 identical lines \u00D7 2 files): packages/core/src/tools/definitions/model-family-sets/default-legacy.ts:12 \u00B7 packages/core/src/tools/definitions/model-family-sets/gemini-3.ts:12 \u2014 these 2 files are line-for-line copies of one another \u2014 285 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":"packages/core/src/tools/definitions/model-family-sets/default-legacy.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3aacddef2207e3c6378146a3834b614f913398c3a1bb156b3703b2420b486ff"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (248 matched lines \u00D7 2 locations): packages/core/src/tools/grep.ts:153 \u00B7 packages/core/src/tools/ripGrep.ts:189 \u2014 the two spans are one implementation copied and then locally edited \u2014 1149 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":"packages/core/src/tools/grep.ts"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"cccb168970dd49d98a4326b7236bec469826616fb45cea63eb7642e76c92ac90"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (228 matched lines \u00D7 2 locations): packages/core/src/agents/local-invocation.ts:71 \u00B7 packages/core/src/agents/local-session-invocation.ts:82 \u2014 the two spans are one implementation copied and then locally edited \u2014 1241 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":"packages/core/src/agents/local-invocation.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"c239951d20b5983d290fab5cc628917f20b0756bcb13e26bdd824c3615fb1e6f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (199 matched lines \u00D7 2 locations): packages/core/src/prompts/snippets.legacy.ts:32 \u00B7 packages/core/src/prompts/snippets.ts:43 \u2014 the two spans are one implementation copied and then locally edited \u2014 995 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":"packages/core/src/prompts/snippets.legacy.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"00dafb72a0ef21857159a6c46e957ecd545c4699270fcd58737e7f7866c979d8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (130 matched lines \u00D7 2 locations): packages/cli/src/ui/components/triage/TriageDuplicates.tsx:25 \u00B7 packages/cli/src/ui/components/triage/TriageIssues.tsx:25 \u2014 the two spans are one implementation copied and then locally edited \u2014 710 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":"packages/cli/src/ui/components/triage/TriageDuplicates.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"77c125806d81de511367bf63562bbdfceec59019acbd45231f87eefb5ae0be2a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (110 lines \u00D7 2 locations): evals/tool_output_masking.eval.ts:36 \u00B7 evals/tool_output_masking.eval.ts:174 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"evals/tool_output_masking.eval.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"b14ac2d6841d0be192e35d7bda70731a7fda1aff40209b573a080ae09eac5e94"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (101 lines \u00D7 2 locations): packages/cli/src/nonInteractiveCli.ts:85 \u00B7 packages/cli/src/nonInteractiveCliAgentSession.ts:82 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/nonInteractiveCli.ts"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"89426642cf000d61b48259e4186c0d3c14f83139b28ad3ec98ca5f1c187fb7c5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (71 lines \u00D7 2 locations): packages/cli/src/ui/components/shared/text-buffer.ts:3731 \u00B7 packages/cli/src/ui/components/shared/text-buffer.ts:3837 \u2014 all 2 copies are in the same file, and what repeats is a LIST OF ENTRIES rather than behaviour \u2014 the same entries written out more than once. Extract them into one shared, exported constant and spread that constant into each site, rather than into a function the sites call: a list like this often lives in declarative metadata (a decorator\u0027s options object, a static configuration table) that a build step must be able to read statically, where a function call is not allowed. Adding an entry to one copy and not the other is the failure this prevents."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/shared/text-buffer.ts"},"region":{"startLine":3731}}}],"partialFingerprints":{"codehealthFindingId/v1":"4213e7b1dcba25f773aadda3bab1912e233bf18ced10c865f0b9c61b2aeb4087"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (70 matched lines \u00D7 2 locations): scripts/aggregate_evals.js:18 \u00B7 scripts/eval_utils.js:15 \u2014 the two spans are one implementation copied and then locally edited \u2014 478 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/aggregate_evals.js"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"86906d159c5e87d0c4af981bd47eaa00a4132a761b87cab1de0da37ff3a641e8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (67 matched lines \u00D7 2 locations): packages/core/src/context/processors/rollingSummaryProcessor.ts:24 \u00B7 packages/core/src/context/processors/stateSnapshotProcessor.ts:25 \u2014 the two spans are one implementation copied and then locally edited \u2014 338 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":"packages/core/src/context/processors/rollingSummaryProcessor.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"04f8789f9ba9d766f3a45260a1cf27f07c8e110a5750bc609e550709777b8d46"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (66 matched lines \u00D7 2 locations): packages/cli/src/ui/components/shared/vim-buffer-actions.ts:194 \u00B7 packages/cli/src/ui/components/shared/vim-buffer-actions.ts:377 \u2014 the two spans are one implementation copied and then locally edited \u2014 245 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":"packages/cli/src/ui/components/shared/vim-buffer-actions.ts"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc77aee503f1df840524d13fb070fd49c69820f6ef08c93887de6d6ba8f288b6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (57 matched lines \u00D7 2 locations): packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts:1515 \u00B7 packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts:1656 \u2014 the two spans are one implementation copied and then locally edited \u2014 272 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":"packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts"},"region":{"startLine":1515}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c5aedd11d4efc64eff353b220d88515a9d0689f109b7ce12030107c1b73a079"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (56 matched lines \u00D7 2 locations): packages/cli/src/commands/extensions/disable.ts:23 \u00B7 packages/cli/src/commands/extensions/enable.ts:28 \u2014 the two spans are one implementation copied and then locally edited \u2014 271 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":"packages/cli/src/commands/extensions/disable.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"52d3796242ccde4c9bc76549f4f0c7bdfb04ba7607cd39dfd9ecd33ab367b3d8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (56 matched lines \u00D7 2 locations): packages/core/src/routing/strategies/classifierStrategy.ts:130 \u00B7 packages/core/src/routing/strategies/numericalClassifierStrategy.ts:102 \u2014 the two spans are one implementation copied and then locally edited \u2014 292 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":"packages/core/src/routing/strategies/classifierStrategy.ts"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"33bf9d449abbc92edf839219f87d5e4fbfb4ad1f86758bcc95f956d3a0a1ecc5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (55 lines \u00D7 2 locations): packages/cli/src/ui/components/shared/text-buffer.ts:420 \u00B7 packages/cli/src/ui/components/shared/text-buffer.ts:521 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/shared/text-buffer.ts"},"region":{"startLine":420}}}],"partialFingerprints":{"codehealthFindingId/v1":"c82ffd0ae3ac81a0e5e2fb14c94046766a5499e73c0959fb41d14f3cd4bf15b4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (53 matched lines \u00D7 2 locations): packages/core/src/tools/list-mcp-resources.ts:25 \u00B7 packages/core/src/tools/read-mcp-resource.ts:26 \u2014 the two spans are one implementation copied and then locally edited \u2014 184 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":"packages/core/src/tools/list-mcp-resources.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc5fb3de5adf7daddd0e66a300049ca295bb26df470e894df6ad23a2f22e1bb0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (52 lines \u00D7 2 locations): packages/core/src/agents/local-subagent-protocol.ts:143 \u00B7 packages/core/src/agents/remote-subagent-protocol.ts:129 \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":"packages/core/src/agents/local-subagent-protocol.ts"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a24f1afa15643c3c730419f8bb945cd4b2cc1f38b30acc94aadb7eda3165794"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (51 matched lines \u00D7 2 locations): packages/cli/src/utils/agentSettings.ts:15 \u00B7 packages/cli/src/utils/skillSettings.ts:18 \u2014 the two spans are one implementation copied and then locally edited \u2014 222 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":"packages/cli/src/utils/agentSettings.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"5461d3dbea3b7df177dd61fb69b977f57d6eae3f68373a5cd762b55aeaed6167"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (50 matched lines \u00D7 2 locations): packages/a2a-server/src/commands/restore.ts:66 \u00B7 packages/cli/src/acp/commands/restore.ts:62 \u2014 the two spans are one implementation copied and then locally edited \u2014 280 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":"packages/a2a-server/src/commands/restore.ts"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"e70db367a6d330c6524f85826627268cfc624e63cbee9208d17fe51a92202134"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (50 matched lines \u00D7 2 locations): packages/core/src/agents/remote-invocation.ts:63 \u00B7 packages/core/src/agents/remote-session-invocation.ts:74 \u2014 the two spans are one implementation copied and then locally edited \u2014 240 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":"packages/core/src/agents/remote-invocation.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"d006421271ec816ef11fa75483da5f951b37d6cacaa04a4199bc2c77dcbbcaf5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (50 matched lines \u00D7 2 locations): packages/core/src/tools/web-fetch.ts:835 \u00B7 packages/core/src/tools/web-search.ts:130 \u2014 the two spans are one implementation copied and then locally edited \u2014 227 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":"packages/core/src/tools/web-fetch.ts"},"region":{"startLine":835}}}],"partialFingerprints":{"codehealthFindingId/v1":"3878116c347e17072f1d265a35211f493d3bb9b6345790bfe00255533004593b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (49 lines \u00D7 2 locations): packages/core/src/context/config/profiles.ts:82 \u00B7 packages/core/src/context/config/profiles.ts:224 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/context/config/profiles.ts"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"70b9a2433b207fbe39576d53bfcef081a43949acc0e4ebc4fed31b56b7ab7761"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (46 matched lines \u00D7 2 locations): packages/a2a-server/src/commands/memory.ts:18 \u00B7 packages/cli/src/acp/commands/memory.ts:21 \u2014 the two spans are one implementation copied and then locally edited \u2014 247 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":"packages/a2a-server/src/commands/memory.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"80ce9594907b7ae7acf0fb399177b80eb8b9fa17c25dc11ea448b9e6919cf22b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (46 matched lines \u00D7 2 locations): packages/cli/src/utils/featureToggleUtils.ts:83 \u00B7 packages/cli/src/utils/hookSettings.ts:36 \u2014 the two spans are one implementation copied and then locally edited \u2014 257 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":"packages/cli/src/utils/featureToggleUtils.ts"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f4129659420fefcf36b22b162766cef941bebeff8fc4be71ee4c25e5d9d11a0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (45 matched lines \u00D7 2 locations): packages/core/src/mcp/google-auth-provider.ts:60 \u00B7 packages/core/src/mcp/sa-impersonation-provider.ts:65 \u2014 the two spans are one implementation copied and then locally edited \u2014 192 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":"packages/core/src/mcp/google-auth-provider.ts"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"63a685c97110a333c5dd8841bcdb38e2d7c6e01de373518aee0fc62722f1027a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (45 matched lines \u00D7 2 locations): packages/core/src/services/sandboxedFileSystemService.ts:50 \u00B7 packages/core/src/services/sandboxedFileSystemService.ts:114 \u2014 the two spans are one implementation copied and then locally edited \u2014 234 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":"packages/core/src/services/sandboxedFileSystemService.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3f62617e763932947e60366253a3f2dfc241d857efb4209dc573764ddef1d4f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (43 lines \u00D7 2 locations): packages/core/src/commands/memory.ts:839 \u00B7 packages/core/src/commands/memory.ts:1256 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/commands/memory.ts"},"region":{"startLine":839}}}],"partialFingerprints":{"codehealthFindingId/v1":"00e9f495b158ee05f98679e8fccc6faa1868864521d1824e1bd06d0d01ef709f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (42 matched lines \u00D7 2 locations): packages/core/src/agents/browser/browserAgentInvocation.ts:166 \u00B7 packages/core/src/agents/local-invocation.ts:121 \u2014 the two spans are one implementation copied and then locally edited \u2014 254 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":"packages/core/src/agents/browser/browserAgentInvocation.ts"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b79cae29bddde600ce443a31d24bf0ef04c82bcea5ae750a91c6dc8e052db77"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (41 matched lines \u00D7 2 locations): packages/core/src/utils/extensionLoader.ts:51 \u00B7 packages/core/src/utils/extensionLoader.ts:159 \u2014 the two spans are one implementation copied and then locally edited \u2014 221 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":"packages/core/src/utils/extensionLoader.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2b1b9d0413fb6b748360a1fbf17c894257bb00b034b9ac209a85005258514bf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (40 matched lines \u00D7 2 locations): evals/plan_mode.eval.ts:227 \u00B7 evals/plan_mode.eval.ts:308 \u2014 the two spans are one implementation copied and then locally edited \u2014 194 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":"evals/plan_mode.eval.ts"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"a897dee562626295ac4c6380bfeebc76bea577d4af19b5602d24d7d2b308d671"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (40 lines \u00D7 2 locations): packages/cli/src/utils/agentUtils.ts:18 \u00B7 packages/cli/src/utils/skillUtils.ts:29 \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":"packages/cli/src/utils/agentUtils.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3c02e28c6faa74bfb196081478592b6af981f92cd09d174a5ac4aa60710f1b2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (40 lines \u00D7 2 locations): packages/core/src/agents/local-subagent-protocol.ts:384 \u00B7 packages/core/src/agents/remote-subagent-protocol.ts:375 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/agents/local-subagent-protocol.ts"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"f837443a33a702241ba627e7f788ec31cd9d44cd240cefac605432bdc324dda3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (39 lines \u00D7 2 locations): packages/cli/src/ui/components/shared/vim-buffer-actions.ts:640 \u00B7 packages/cli/src/ui/components/shared/vim-buffer-actions.ts:688 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/shared/vim-buffer-actions.ts"},"region":{"startLine":640}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6bffb73884691158083edbc3f4c00d5383d7b839da48ef91efee1f855f06f12"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (39 lines \u00D7 2 locations): packages/cli/src/ui/components/triage/TriageDuplicates.tsx:872 \u00B7 packages/cli/src/ui/components/triage/TriageIssues.tsx:564 \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":"packages/cli/src/ui/components/triage/TriageDuplicates.tsx"},"region":{"startLine":872}}}],"partialFingerprints":{"codehealthFindingId/v1":"598346c67ed3f41d80c809f8123fdbaf71f85f3edec77793d29a3c67e5725b4d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (39 matched lines \u00D7 2 locations): packages/cli/src/ui/hooks/shell-completions/gitProvider.ts:29 \u00B7 packages/cli/src/ui/hooks/shell-completions/npmProvider.ts:24 \u2014 the two spans are one implementation copied and then locally edited \u2014 202 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":"packages/cli/src/ui/hooks/shell-completions/gitProvider.ts"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bbb6292fe3b62c239b220ac3b22e59abebad9216682b7f1f151bfcdea726edd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:relative-cross-package]: evals/app-test-helper.ts:7 reaches into another package with a relative path (../packages/cli/src/test-utils/AppRig.js) \u2014 import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"evals/app-test-helper.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dc4e45ebcd1c780ab2f0f6cea2f78a8d6615c7ce9c6a2ef78aeade00adb2f65"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:test-suite-dependency]: evals/app-test-helper.ts:7 imports packages/cli/src/test-utils/AppRig.tsx, a module inside the test suite \u2014 test helpers carry no compatibility contract and are maintained for the suite, not as an API, so production code that depends on one is coupled to a module nobody keeps stable. Move the shared helper into a source directory both layers may depend on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"evals/app-test-helper.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"925f1504bad1eca9975c6ca2ec4a101c3041c86c2f241170254841233841b15e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:relative-cross-package]: evals/auto_memory_modes.eval.ts:12 reaches into another package with a relative path (../packages/core/src/services/chatRecordingService.js) \u2014 import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"evals/auto_memory_modes.eval.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4f8d1a2865a0c9cee6fd04c0ca056d8e23bdf836e574fd5df1303c08d45c2f1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:relative-cross-package]: evals/auto_memory_modes.eval.ts:332 reaches into another package with a relative path (../packages/core/src/services/memoryService.js) \u2014 import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"evals/auto_memory_modes.eval.ts"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d0dca8d140faa437b9ea32efb0c161b78bb4878c694259c4fa5a0381fa25c67"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:relative-cross-package]: evals/auto_memory_modes.eval.ts:389 reaches into another package with a relative path (../packages/core/src/services/memoryService.js) \u2014 import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"evals/auto_memory_modes.eval.ts"},"region":{"startLine":389}}}],"partialFingerprints":{"codehealthFindingId/v1":"6675440c0ad2ddfee784e460e7bfd2078c6667488d94a03ef84548f7dfeebe08"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:relative-cross-package]: evals/component-test-helper.ts:31 reaches into another package with a relative path (../packages/cli/src/test-utils/settings.js) \u2014 import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"evals/component-test-helper.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"05ac0c7fbce663216fa5fb47582c8697f15e3bd8fc452ad7228d7f7486e68aa6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:test-suite-dependency]: evals/component-test-helper.ts:31 imports packages/cli/src/test-utils/settings.ts, a module inside the test suite \u2014 test helpers carry no compatibility contract and are maintained for the suite, not as an API, so production code that depends on one is coupled to a module nobody keeps stable. Move the shared helper into a source directory both layers may depend on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"evals/component-test-helper.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdb9abab3e3e7478fbd339fbd33c3794ae68a5ed459fc5a5ef7fd736d09bfee0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:test-cross-package-internals]: integration-tests/globalSetup.ts:15 reaches past another workspace package\u0027s public entry into its internals with a relative path (../packages/core/src/tools/ripGrep.js) \u2014 the test is coupled to a file layout that package makes no promise about, so a refactor behind its entry point breaks the suite. Import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"integration-tests/globalSetup.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f917c528ece112100b25a160a0dd909f59633761c4ec78c1e1b4eda0aefdb94"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:test-cross-package-internals]: integration-tests/google_web_search.test.ts:7 reaches past another workspace package\u0027s public entry into its internals with a relative path (../packages/core/src/tools/tool-names.js) \u2014 the test is coupled to a file layout that package makes no promise about, so a refactor behind its entry point breaks the suite. Import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"integration-tests/google_web_search.test.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"32a12b6e2031307a6d4a7d01538ef0c60e4f26a654afaa1b8b50fa3ca19c68d4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:test-cross-package-internals]: integration-tests/ripgrep-real.test.ts:11 reaches past another workspace package\u0027s public entry into its internals with a relative path (../packages/core/src/tools/ripGrep.js) \u2014 the test is coupled to a file layout that package makes no promise about, so a refactor behind its entry point breaks the suite. Import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"integration-tests/ripgrep-real.test.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7226188e1a2403d254ca6b2a27a7cb59e2710411046fdc683cab44412524286"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:test-cross-package-internals]: integration-tests/ripgrep-real.test.ts:15 reaches past another workspace package\u0027s public entry into its internals with a relative path (../packages/core/src/config/config.js) \u2014 the test is coupled to a file layout that package makes no promise about, so a refactor behind its entry point breaks the suite. Import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"integration-tests/ripgrep-real.test.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"6943cf0cc05a35627385433b691aeb9459db7fa45bb855cd65aa40a21a6e1dcf"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:test-cross-package-internals]: integration-tests/ripgrep-real.test.ts:16 reaches past another workspace package\u0027s public entry into its internals with a relative path (../packages/core/src/utils/workspaceContext.js) \u2014 the test is coupled to a file layout that package makes no promise about, so a refactor behind its entry point breaks the suite. Import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"integration-tests/ripgrep-real.test.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f8acd19ea71f1df0556ccbe5ef07f3bebd5ce161c0ecdf713c1d77751896e3f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:test-cross-package-internals]: integration-tests/run_shell_command.test.ts:14 reaches past another workspace package\u0027s public entry into its internals with a relative path (../packages/core/src/utils/shell-utils.js) \u2014 the test is coupled to a file layout that package makes no promise about, so a refactor behind its entry point breaks the suite. Import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"integration-tests/run_shell_command.test.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e061043d1b801b263daf5bfa90dbd15fa516653c12c426dc981bf46ddf88b87"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:test-cross-package-internals]: memory-tests/globalSetup.ts:10 reaches past another workspace package\u0027s public entry into its internals with a relative path (../packages/core/src/tools/ripGrep.js) \u2014 the test is coupled to a file layout that package makes no promise about, so a refactor behind its entry point breaks the suite. Import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"memory-tests/globalSetup.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"e179fa5b763dd437006be388441e9c0a694f2e453ce164b9af599cc61ccc658c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:undeclared-workspace-dep]: packages/cli/src/utils/devtoolsService.ts:63 imports @google/gemini-cli-devtools, a package this repository publishes, but this package\u0027s own package.json does not list it in dependencies (or peer/optional dependencies) \u2014 it resolves only through the workspace link, so an installed copy of this package is missing it. Add it to this package\u0027s dependencies."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/utils/devtoolsService.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1754feb05d55650d6ce2a913749c8469f053b143075feaa8e24f81d25f440c8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: packages/core/src/utils/schemaValidator.ts:10 imports ajv/dist/2020.js, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/schemaValidator.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"aac87f400ea937515b79dc9c4e503e649d6e5e0f30ea1067a11df2b22b3106d6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:undeclared-workspace-dep]: packages/vscode-ide-companion/src/diff-manager.ts:7 imports @google/gemini-cli-core/src/ide/types.js, a package this repository publishes, but this package\u0027s own package.json does not list it in dependencies (or peer/optional dependencies) \u2014 it resolves only through the workspace link, so an installed copy of this package is missing it. Add it to this package\u0027s dependencies."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/vscode-ide-companion/src/diff-manager.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cd49248864fdec25365a4523118439ed714e0948ef0c1dffb358256ff3d457e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:undeclared-workspace-dep]: packages/vscode-ide-companion/src/extension.ts:12 imports @google/gemini-cli-core/src/ide/detect-ide.js, a package this repository publishes, but this package\u0027s own package.json does not list it in dependencies (or peer/optional dependencies) \u2014 it resolves only through the workspace link, so an installed copy of this package is missing it. Add it to this package\u0027s dependencies."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/vscode-ide-companion/src/extension.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1d1401e09b9cde47b329dfd2b7f72824b81db8453ab15e5edbcb672c5977033"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:undeclared-workspace-dep]: packages/vscode-ide-companion/src/ide-server.ts:8 imports @google/gemini-cli-core/src/ide/types.js, a package this repository publishes, but this package\u0027s own package.json does not list it in dependencies (or peer/optional dependencies) \u2014 it resolves only through the workspace link, so an installed copy of this package is missing it. Add it to this package\u0027s dependencies."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/vscode-ide-companion/src/ide-server.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e091384c393c5a2aa008f3a40af5d0cf90f3e1f70b13f03f9abfd01882c70e2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:undeclared-workspace-dep]: packages/vscode-ide-companion/src/ide-server.ts:26 imports @google/gemini-cli-core, a package this repository publishes, but this package\u0027s own package.json does not list it in dependencies (or peer/optional dependencies) \u2014 it resolves only through the workspace link, so an installed copy of this package is missing it. Add it to this package\u0027s dependencies."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/vscode-ide-companion/src/ide-server.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"12095babc712d7d61675da2ef227b7745ba44980f8c7846f5ad4ec6006a99e42"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:test-cross-package-internals]: perf-tests/globalSetup.ts:10 reaches past another workspace package\u0027s public entry into its internals with a relative path (../packages/core/src/tools/ripGrep.js) \u2014 the test is coupled to a file layout that package makes no promise about, so a refactor behind its entry point breaks the suite. Import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"perf-tests/globalSetup.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2fdac2b28008646be8ca2cd9b739bb558c0be0941425bb23184ddb97c0f6876"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:relative-cross-package]: scripts/build_sandbox.js:32 reaches into another package with a relative path (../packages/cli/package.json) \u2014 import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/build_sandbox.js"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"644e3e206035652c16a55cd804af02ed20156d3d907b72327e7368f3939037eb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:relative-cross-package]: scripts/generate-keybindings-doc.ts:12 reaches into another package with a relative path (../packages/cli/src/ui/key/keyBindings.js) \u2014 import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/generate-keybindings-doc.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c381862be7eafb1f4e82b63abf043006beabcbf6649660fbd2968280386471a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:relative-cross-package]: scripts/generate-keybindings-doc.ts:30 reaches into another package with a relative path (../packages/cli/src/ui/key/keybindingUtils.js) \u2014 import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/generate-keybindings-doc.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"167ec5e9b77f054cb28a89eb55e99bac943a22dd274688fb518d27c2ee951b3a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:relative-cross-package]: scripts/generate-settings-schema.ts:11 reaches into another package with a relative path (../packages/cli/src/config/settingsSchema.js) \u2014 import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/generate-settings-schema.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"85a46b3831067f8dee5d234a69236842a84adb1c0b4031551270665aafd016eb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:test-cross-package-internals]: scripts/tests/generate-keybindings-doc.test.ts:13 reaches past another workspace package\u0027s public entry into its internals with a relative path (../../packages/cli/src/ui/key/keyBindings.js) \u2014 the test is coupled to a file layout that package makes no promise about, so a refactor behind its entry point breaks the suite. Import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/tests/generate-keybindings-doc.test.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"7eee9a82785d37c8105f193c7498585ed9570cf9e55c66837b66858ad959de81"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function handleVimAction (cyclomatic 246, cognitive 407): handleVimAction has cyclomatic complexity 246 and cognitive complexity 407; 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":"packages/cli/src/ui/components/shared/vim-buffer-actions.ts"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"1108ee1de202dbd2297c3cf7d2116f5819a5bc7fc9a631990a49329705d899c7"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 204, cognitive 312): (anonymous) has cyclomatic complexity 204 and cognitive complexity 312; 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":"packages/cli/src/ui/components/InputPrompt.tsx"},"region":{"startLine":686}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6796f92c7f867bf6ee28801e5492a87f61f415b0a867cd0d9dc36f95257fa86"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function textBufferReducerLogic (cyclomatic 194, cognitive 212): textBufferReducerLogic has cyclomatic complexity 194 and cognitive complexity 212; 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":"packages/cli/src/ui/components/shared/text-buffer.ts"},"region":{"startLine":1787}}}],"partialFingerprints":{"codehealthFindingId/v1":"a15ff015f2fd3be96203de7c4311f4a604e1e22e5ad7a1694f51d889de4ee020"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function constructor (cyclomatic 150, cognitive 146): constructor has cyclomatic complexity 150 and cognitive complexity 146; 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":"packages/core/src/config/config.ts"},"region":{"startLine":993}}}],"partialFingerprints":{"codehealthFindingId/v1":"8108e586ffcb576770437f86c90bfac656f36d8f0de103408094cab6d5557cb4"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 136, cognitive 274): (anonymous) has cyclomatic complexity 136 and cognitive complexity 274; 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":"packages/cli/src/ui/hooks/vim.ts"},"region":{"startLine":660}}}],"partialFingerprints":{"codehealthFindingId/v1":"c625e4455ae30168c95d4ead6ace605210eb5f9c4b6b341e1d48cbff9c5495f0"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function start_sandbox (cyclomatic 131, cognitive 225): start_sandbox has cyclomatic complexity 131 and cognitive complexity 225; 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":"packages/cli/src/utils/sandbox.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e835c6792c2533592eb3202d11aa478dd2e2a07ee059a6c7da241b1e38f8088"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function loadCliConfig (cyclomatic 125, cognitive 132): loadCliConfig has cyclomatic complexity 125 and cognitive complexity 132; 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":"packages/cli/src/config/config.ts"},"region":{"startLine":583}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e87d90668a01ea757f8b168d45a6cbc4174218197dec0dcb399e3405affe565"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function emitKeys (cyclomatic 95, cognitive 197): emitKeys has cyclomatic complexity 95 and cognitive complexity 197; 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":"packages/cli/src/ui/contexts/KeypressContext.tsx"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"1400b2b627fc74ce21761b778ef6ef8c4def68c670070491dd9aeb6e33188ed8"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function isSafeToCallWithExec (cyclomatic 91, cognitive 284): isSafeToCallWithExec has cyclomatic complexity 91 and cognitive complexity 284; 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":"packages/core/src/sandbox/utils/commandSafety.ts"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"46b6a8036f672957d108e7c6c344e702cc53fc588966776f7681a85a8b8e0a15"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 87, cognitive 169): (anonymous) has cyclomatic complexity 87 and cognitive complexity 169; 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":"packages/cli/src/nonInteractiveCliAgentSession.ts"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2f5c8d6f8e6f5cc7a35ff940c3601d27df63f39ac426543f6e9087c82270a04"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function #resolvePrompt (cyclomatic 84, cognitive 199): #resolvePrompt has cyclomatic complexity 84 and cognitive complexity 199; 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":"packages/cli/src/acp/acpSession.ts"},"region":{"startLine":969}}}],"partialFingerprints":{"codehealthFindingId/v1":"f788c34bea39d1da167d9d372d60961ad53d2239de14d0c9b4b3616c71abf29b"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 80, cognitive 173): (anonymous) has cyclomatic complexity 80 and cognitive complexity 173; 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":"packages/cli/src/nonInteractiveCli.ts"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"cae4989467a315daebe41e36a3b7da1b92abd5ec10b2b8684b69691926874697"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function loadConversationRecord (cyclomatic 74, cognitive 178): loadConversationRecord has cyclomatic complexity 74 and cognitive complexity 178; 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":"packages/core/src/services/chatRecordingService.ts"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d0e52575be0e809954a3b55285aa9932b41881958eb6bdabe685164bad21474"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function installOrUpdateExtension (cyclomatic 72, cognitive 93): installOrUpdateExtension has cyclomatic complexity 72 and cognitive complexity 93; 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":"packages/cli/src/config/extension-manager.ts"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"3666f907faa09a01cb7c1983313d842e7313e2781832c35e8828f875872414c7"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function AppContainer (cyclomatic 70, cognitive 27): AppContainer has cyclomatic complexity 70 and cognitive complexity 27; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive 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":"packages/cli/src/ui/AppContainer.tsx"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"d431a30378b0f7cc541955f689c739279763ba4c8dd442add1417f37c4010d33"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function main (cyclomatic 69, cognitive 100): main has cyclomatic complexity 69 and cognitive complexity 100; 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":"packages/cli/src/gemini.tsx"},"region":{"startLine":466}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf871c617481f2e7aafd75f2b7caecf44b5f6c22172335d4130e87747fd82654"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function processStreamResponse (cyclomatic 67, cognitive 155): processStreamResponse has cyclomatic complexity 67 and cognitive complexity 155; 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":"packages/core/src/core/geminiChat.ts"},"region":{"startLine":1354}}}],"partialFingerprints":{"codehealthFindingId/v1":"05e4e1db64eca254dd95a6e38c49be5bdb48964258e9b2ed9bd42dbaafe0b295"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function classifyGoogleError (cyclomatic 66, cognitive 98): classifyGoogleError has cyclomatic complexity 66 and cognitive complexity 98; 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":"packages/core/src/utils/googleQuotaErrors.ts"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"54c5f275b30f0977e8b7533c7fda48dc4fb62332d3298ebe761d745070319bd3"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function createCustomTheme (cyclomatic 63, cognitive 39): createCustomTheme has cyclomatic complexity 63 and cognitive complexity 39; 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":"packages/cli/src/ui/themes/theme.ts"},"region":{"startLine":394}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fa90234cec75a06588d51fcbebfe9d0200a77855fe814c21e67cafb88bee8cc"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function check (cyclomatic 59, cognitive 109): check has cyclomatic complexity 59 and cognitive complexity 109; 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":"packages/core/src/policy/policy-engine.ts"},"region":{"startLine":600}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1ce15c344df3b549741f748bc3f48bd8864a22f6c51ef2e530ea75f60992253"}},{"ruleId":"R3","level":"warning","message":{"text":"Large Files: 155 file(s) over 400 lines (counted as significant lines \u2014 blank lines excluded \u2014 over production source only, tests excluded), largest first: packages/cli/src/ui/components/shared/text-buffer.ts (3821), packages/core/src/config/config.ts (3737), packages/cli/src/config/settingsSchema.ts (3573), packages/cli/src/ui/AppContainer.tsx (2641), packages/core/src/tools/mcp-client.ts (2237), packages/core/src/telemetry/types.ts (2233) (\u002B149 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":"scripts/lint.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d16002bbd246edb752499504264354832f901866edb454ef76414a12155052fd"}},{"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/build_binary.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"db91d56cc152fd992508b70332a80fefedc930a821b9ea7c1d5af96d40fb06de"}},{"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/releasing/patch-trigger.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f12e420466abbe2f0ce6090862f2719d2e11104f3aa293b4463b94b8204b5ad7"}},{"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/run_regression_check.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"306a57823458d4aac27da7ca5cc98ad5a2749aef9ede7ddb872871f49e84aa18"}},{"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/releasing/create-patch-pr.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"56fcab1440765e15ea454ed4160cbc121afaa29cffab36a379bc19e1cd745fef"}},{"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/aggregate_evals.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"37cef6ca556ca46f17410394d6f4e3eaea2da80ffd540f562ecd77f4967ba2ab"}},{"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/sync_project_dry_run.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"89f65e3b9097b3762493461c44f445163289c66ddfd969e4731ae719c90c61b4"}},{"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/seed-test-inbox.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"90bba5b2a9c162feb81aabdbab74913c258ae3b1875f36a4b566ab57a639fe66"}},{"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/releasing/patch-comment.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"367bcc324f3f91cba2c5bbf46aba6f149e36aa5871da7e48cb8969149aa5ed6e"}},{"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/local_telemetry.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"013079d411a9be2c1bbf772c4a223a104d614672eb79595b83369204b0f6d956"}},{"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/build_sandbox.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3557f186ec018a723c02be92bf51a653846ff19f83a78fbfedacb4bb39407893"}},{"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":"packages/vscode-ide-companion/scripts/generate-notices.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8e88fe6b25ef8b1e27cf7eb4f64bc81e76e9e0a75cad902f5b1e3877a81db35"}},{"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/cleanup-branches.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1384b0f9630ee211683a2cfe0e935fc1de6a2dde81d64defca384d472a1f866a"}},{"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":"tools/gemini-cli-bot/metrics/index.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1922ddc68f24ada97cc38e72b80dcc81950cfd1c9212d9f5ac51d839630e5530"}},{"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/close_duplicate_issues.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cadcaf57e9e137dcfada1d7db0bf30b041d6d0d04492b7734807ed692901aae"}},{"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-build-status.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"044aea5856035a0861aaee4a4b6aecb16f23d5abd1d4b873265127c65886bdc9"}},{"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":"tools/gemini-cli-bot/metrics/scripts/domain_expertise.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b43eb33b984f2418f8be99222c7c58da182d4fa413e7401122f534244f9cd64"}},{"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/download-ripgrep-binaries.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"06fcd25e5ec7c9018851728052f47e6e7ec54e28e37d31df275a07617566c5db"}},{"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":"packages/core/scripts/bundle-browser-mcp.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"90cdee3e773fd2c511cc299020c53f7d8e6d4c764ac5864189dc14aa3cb988f0"}},{"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/compare_evals.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1200c5b856402136f8f15d2bbaab0f6445c92b08124e8a6f41e11e92248f409b"}},{"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":"tools/gemini-cli-bot/metrics/scripts/time_to_first_response.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"de9665d372a6b3a1e212b314f01ce4372883611798d866e2dcbf7c74e48b26c3"}},{"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/eval_utils.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d20c23b60d9e606b25c0b86dac5f3345ee1e5485f72a27bbf6416f35d203eef"}},{"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/deflake.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b910ea7bfa443a4aead3877247188c4627177bd4680ca74f08fa0d143d15854d"}},{"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/sandbox_command.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9c2a32f9b605d346d5c115e027e55a6c5772a17c3d8e374e872206b68a9cb78"}},{"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/get_trustworthy_evals.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b641a05c8a90a77dadd62cd55a43dc14098f92d5e9f04d8bc98923622a802cde"}},{"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":"tools/gemini-cli-bot/metrics/scripts/actions_spend.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ff69032333c6954633a476cd79157c84d6541ebc507c4ad8b5705bdd5500ebc"}},{"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":"packages/core/scripts/compile-windows-sandbox.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1c5df19f8c1b9bb37f47a9ad27c10f9571df74aa72f2923b29b3941a0f3a530"}},{"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":"tools/gemini-cli-bot/history/sync.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7985782284a3e321596d7c29134877df8e2b6790c5fcf986ec67deda0fb48859"}},{"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":"tools/gemini-cli-bot/metrics/scripts/latency.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d91f5688475ed924dd10cd29f32eb1be404150f760579a64865da3c4892f8ec"}},{"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":"tools/gemini-cli-bot/metrics/scripts/throughput.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c844d5a548643aeb2edab2d8ca6d17745228c83aa8c2a72597a5bd69abc909e0"}},{"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/copy_bundle_assets.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f2b3df131f670b28c0fc97c02ce7ca8c42db1ec5a0da634f6c0b68d72a38e22"}},{"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-lockfile.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"61f2c243ead75206a3daa1965f3f0ed45ee621efdcb1bcbd6a7294ad1d6717c2"}},{"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/version.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2498e6d2c4f7b6fcd0bd444777a75b87fe7342aeba90de7b155854d868f36d9a"}},{"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/run_eval_regression.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"841d407890086d3ceab072ac318b03d0ec4d5a33c2a9c6b41ee6ac21c1a28e0d"}},{"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/changed_prompt.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"729c10422acf79b5986d726e6aa64fd83f463277625c86a61330a6246cdbae1a"}},{"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":"packages/vscode-ide-companion/scripts/check-vscode-release.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fea6a22e83199cc2f6a200222c941296bfea31ba54e2190492848c6afb09cfc6"}},{"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/start.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d925656a6f615260502a91cd8dab4344d77ce498bcf7434164acd4a2519b072"}},{"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/telemetry.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b02be707f619817a715fc9bf0eb7b636f7135c1f19209dd337efb6753137375d"}},{"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":"packages/vscode-ide-companion/esbuild.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"49f0fa00bf9c5b52a21e276643965f7fb7c16b9f453e9f40e6675049805adf67"}},{"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/copy_files.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"55de130bc43c068c1043b52aa17d099a61bed5c0e10c50488b7ec774af577796"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~251 LoC): no import path from any entry point (226 application, 49 tooling, 1064 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":"scripts/sync_project_dry_run.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c2e42a3f448401f43e3e00fb356824d1dbc123a9d1938e4605781243f3c7102"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~180 LoC): no import path from any entry point (226 application, 49 tooling, 1064 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":"scripts/cleanup-branches.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b963c601ab4a7ff0d75b07e4a66b535b4ebe83433f532f326e7eee927cb25203"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~151 LoC): no import path from any entry point (226 application, 49 tooling, 1064 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":"scripts/close_duplicate_issues.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f138509124a1e513c75912c8180d2b1a728dce0742290981651bd7248e1b82d"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~148 LoC): no import path from any entry point (226 application, 49 tooling, 1064 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":"tools/gemini-cli-bot/metrics/scripts/domain_expertise.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d1ae3282a8f19cded7b13ae5a1ab02c93bf801be344ebf7997348baa0308e9a"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~141 LoC): no import path from any entry point (226 application, 49 tooling, 1064 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":"tools/gemini-cli-bot/metrics/scripts/time_to_first_response.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1666fe32056c5af0373edd55e8f780c1e1e001b5cc9e9d6921a14f69aee0c915"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~125 LoC): no import path from any entry point (226 application, 49 tooling, 1064 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":"tools/gemini-cli-bot/metrics/scripts/actions_spend.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8edf0018073d9a1b96336440e27d98acb919d2f1fa948ac97af3de50d9b23dc3"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~121 LoC): no import path from any entry point (226 application, 49 tooling, 1064 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":"packages/core/scripts/compile-windows-sandbox.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cefd5cc1cc2d65a0dc70c8b0a9886e8786bc21f60ebb8e9d7e40efd3a8b94a8"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~120 LoC): no import path from any entry point (226 application, 49 tooling, 1064 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":"tools/gemini-cli-bot/history/sync.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"95f5f7dab009c7fe59cc60b468e6bdc6d5e0e409e31e787c91571bad62dfcc94"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~120 LoC): no import path from any entry point (226 application, 49 tooling, 1064 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":"tools/gemini-cli-bot/metrics/scripts/latency.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"89cbcc4cae9340bc0bf58fd7a6f2eb5aef31ef8312a2561d4eed175168114cf6"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~120 LoC): no import path from any entry point (226 application, 49 tooling, 1064 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":"tools/gemini-cli-bot/metrics/scripts/throughput.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb005a55e5df2d4896773d143c3cd87843c5c55d6ca10a58df80947cb27c3dd4"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~99 LoC): no import path from any entry point (226 application, 49 tooling, 1064 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":"packages/vscode-ide-companion/scripts/check-vscode-release.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e06310ba94a764242ccca7f57a67336c528ac16a08d9ee9cf801cd61ee1857d"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~86 LoC): no import path from any entry point (226 application, 49 tooling, 1064 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":"tools/gemini-cli-bot/metrics/scripts/user_touches.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1596440b12b7af5f6a491e41a46750fffba77f692b29035463b8cccf0032365"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~77 LoC): no import path from any entry point (226 application, 49 tooling, 1064 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":"tools/gemini-cli-bot/metrics/scripts/review_distribution.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"23d42ce83d3d1d32f9d5dbc528077dab1e20c1bc8c793435bfad3d4b3ed598d1"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~68 LoC): no import path from any entry point (226 application, 49 tooling, 1064 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":"scripts/prepare-github-release.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"98bf88b974b97c29a3d8caaf9614c9736b1af9b0c9f286b4fa708ac1ba34ece3"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~67 LoC): no import path from any entry point (226 application, 49 tooling, 1064 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":"scripts/prepare-npm-release.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9f0d912e82dc8d5babec0fea613acb2240cf9c5282fb66169dc9ca5994a1822"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~62 LoC): no import path from any entry point (226 application, 49 tooling, 1064 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":"packages/a2a-server/src/utils/path_utils.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd3dc0c97c27db0c32483b3f1c2cdb83871c74781241b1fd2df5b637b8c0e44d"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~59 LoC): no import path from any entry point (226 application, 49 tooling, 1064 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":"tools/gemini-cli-bot/metrics/scripts/backlog_age.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c023794e516fd17cd6d19a83d7eea47e2cef024210cb56c0e443020c5420d6d5"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~51 LoC): no import path from any entry point (226 application, 49 tooling, 1064 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":"scripts/test-windows-paths.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b880d0071ac17c9d3b51577a201fa821be2d9834fe687635181079ec0ed4b73"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~45 LoC): no import path from any entry point (226 application, 49 tooling, 1064 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":"packages/cli/src/ui/utils/terminalUtils.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3baa2418ce44b91aea44d7017646f5a2292f54dbf3a3334b7e85788cf491f363"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~32 LoC): no import path from any entry point (226 application, 49 tooling, 1064 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":"tools/gemini-cli-bot/metrics/scripts/open_issues.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c30a5e1b8e402947158d9047b5a4cdbff6a4c2406f9443dbaa44e5f51a41c51"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~32 LoC): no import path from any entry point (226 application, 49 tooling, 1064 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":"tools/gemini-cli-bot/metrics/scripts/open_prs.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f9143b2fb6aabdcc094437495e5e3dfc796789da73c49534651906bcfb4521f"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~14 LoC): no import path from any entry point (226 application, 49 tooling, 1064 test roots considered), but 9 in-repo import(s) from 9 other file(s) do name it (tools/gemini-cli-bot/metrics/scripts/backlog_age.ts, tools/gemini-cli-bot/metrics/scripts/domain_expertise.ts, tools/gemini-cli-bot/metrics/scripts/latency.ts and 6 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":"tools/gemini-cli-bot/metrics/types.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3bd1830b9d69b0cc0845f2557d6e46fa99cbc40791e7fa34f73d00fa77987ba"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~10 LoC): no import path from any entry point (226 application, 49 tooling, 1064 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":"packages/core/src/policy/index.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5db2385372936c260a894d38d05ee10e7e6fd6bbedf8b2d2a22d78460f256a7c"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~8 LoC): no import path from any entry point (226 application, 49 tooling, 1064 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":"packages/core/src/confirmation-bus/index.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b67fa4e53bd485dd6e7a0f7c28b76b9d2500558d59125295ee759e70fa44f51"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027shortAsciiLogoCompactText\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/AsciiArt.ts"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"f24ec8369045217f84c5ff3daee7329ecacc5314002eb5e187c01662c249a5c4"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027tinyAsciiLogoCompactText\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/AsciiArt.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f9ea3b91b6dda5c508452c1550b2efad2e7553990cc5055d560ec813a84efff"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027useAskUserActions\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/contexts/AskUserActionsContext.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"39ca526ec64a617e58f6d88dacbf14c0f313cbbb07f23ae55c46e4f2fd632250"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027REDIRECTION_WARNING_NOTE_LABEL\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/textConstants.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"52bae8678f48df507c6fe54a2ea6097c22ea3eae07c3993eb87f2af254700677"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027REDIRECTION_WARNING_NOTE_TEXT\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/textConstants.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7280089068b75f887ececd1c0f980a42de89fea2eb6e9deff64b03be4a6dede"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027REDIRECTION_WARNING_TIP_LABEL\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/textConstants.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0171f09dbe3c07553f3d30713f845ae1dc3d25d6fb26175f40caebdcd096d57"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027getRedirectionWarningTipText\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/textConstants.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"66a41bdd9a26b1a9bbb6654ad6b875121e9311641fc36799d84fa709663c2ba8"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027getSafeLowColorBackground\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/themes/color-utils.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6f21822e554bf7c54937f267548b39da717f09f789aa80d06647571a6cc1cdb"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027LIGHT_THEME_LUMINANCE_THRESHOLD\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/themes/color-utils.ts"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9fde617fb1835c7574a44c14231729670ed3f7322f1f543abf466d2f3b6a711"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027DARK_THEME_LUMINANCE_THRESHOLD\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/themes/color-utils.ts"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ce7dece6a1c0564417435f5f12a53332edb3b82b3f6267e66b63d593d52b499"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027ansiTheme\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/themes/theme.ts"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"d84669a648d6e89e9f261bdfa5c8ef1d0f591c8bf5ae152066f3954a8cd6ba3c"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027GeminiEventType\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/types.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf60419e6748e653c22e6be9360aaa5fa1b4fbb8a9dbc984e51607a6bd8b5c6f"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027isAnsiOutput\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/types.ts"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"47833b652dbe239bec9599ea368040454f4daeb2972d1e04e76277692d9422e7"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027QUOTA_THRESHOLD_HIGH\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/utils/displayUtils.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c552cbdd1ef1e5e7a2e31c4b50e240ac427335bb9e2deb43b4f5e4f61e5c157"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027QUOTA_THRESHOLD_MEDIUM\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/utils/displayUtils.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"39414856671fd99406a7147078116d653682598acff3fe3c924963110f1e6b0d"}},{"ruleId":"R8","level":"error","message":{"text":"Unlisted import \u0027execa\u0027: Imported but not declared in any reachable package.json \u2014 installs work only by hoisting accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/config/config.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"f92dfd9c8203264df090316648e83bd71f1f30e30d5af5b4e6afa3e9b40b405a"}},{"ruleId":"R8","level":"error","message":{"text":"Unlisted import \u0027tinycolor2\u0027: Imported but not declared in any reachable package.json \u2014 installs work only by hoisting accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/themes/theme.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b428f35536724f29efec5632772f4e60a37fd4b27676a31c388aeb42813c0bf"}},{"ruleId":"R8","level":"error","message":{"text":"Unlisted import \u0027ws\u0027: Imported but not declared in any reachable package.json \u2014 installs work only by hoisting accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/voice/geminiLiveTranscriptionProvider.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4f376b7f8112d5e484c492d4558d377da89cc890d00cc85e1c5c7d5d099c07e"}},{"ruleId":"R8","level":"warning","message":{"text":"Unused dependency \u0027depcheck\u0027: Declared in the root 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":"8d022682afcf787d5bd4d414ceaf0ce2cc242a8e1123fcdc36fec9091991639a"}},{"ruleId":"R8","level":"warning","message":{"text":"Unused dependency \u0027domexception\u0027: Declared in the root 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":"78e0395309456255c5b5cb6add49d943c3ca31f24ae476096fc2283d55032046"}},{"ruleId":"R8","level":"warning","message":{"text":"Unused dependency \u0027node-fetch-native\u0027: Declared in the root 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":"269fd23f5afb37789b97b04b7c1c93cf826501652e46582eaa056f34beab638a"}},{"ruleId":"R8","level":"note","message":{"text":"Test-only dependency \u0027marked\u0027 in production deps: Only test files import it \u2014 move it to devDependencies."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/utils/memoryImportProcessor.test.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b170ce72ad2208302cd8aa42d2c54ae3bd9837a89d3eb049fb686d7aec2f701"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (6 files): packages/cli/src/acp/acpRpcDispatcher.ts \u2192 packages/cli/src/acp/acpSessionManager.ts \u2192 packages/cli/src/config/config.ts \u2192 packages/cli/src/commands/extensions.tsx \u2192 packages/cli/src/gemini.tsx \u2192 packages/cli/src/acp/acpStdioTransport.ts \u2192 packages/cli/src/acp/acpRpcDispatcher.ts (one verified cycle inside a mutually-dependent group of 11 files)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/acp/acpRpcDispatcher.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"875b8bf218a2b65d46efd0e2fcacf419ab6ea74c40efa1dad579623320515261"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (2 files): packages/cli/src/commands/extensions/utils.ts \u2192 packages/cli/src/config/extension-manager.ts \u2192 packages/cli/src/commands/extensions/utils.ts"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/commands/extensions/utils.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"48ca9f4bfd757404c9402d036f504cb0ddd325b9f42ad9dab38f1fa1de997564"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (2 files): packages/cli/src/ui/components/shared/text-buffer.ts \u2192 packages/cli/src/ui/components/shared/vim-buffer-actions.ts \u2192 packages/cli/src/ui/components/shared/text-buffer.ts"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/components/shared/text-buffer.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c963c4a913387637dbeb08706371ec432f398f00b57f89968012487ad5f48133"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (3 files): packages/cli/src/ui/contexts/KeypressContext.tsx \u2192 packages/cli/src/ui/hooks/useFocus.ts \u2192 packages/cli/src/ui/hooks/useKeypress.ts \u2192 packages/cli/src/ui/contexts/KeypressContext.tsx"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/contexts/KeypressContext.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"951996eb08a27ccefb1101de91ab15d564d033c0eebf4f093dfcc2fbe92b6ad1"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (3 files): packages/cli/src/ui/hooks/shell-completions/gitProvider.ts \u2192 packages/cli/src/ui/hooks/useShellCompletion.ts \u2192 packages/cli/src/ui/hooks/shell-completions/index.ts \u2192 packages/cli/src/ui/hooks/shell-completions/gitProvider.ts (one verified cycle inside a mutually-dependent group of 4 files)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/cli/src/ui/hooks/shell-completions/gitProvider.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"682d86b57a2e836f18b1bf6c78789c3cafa033177e81b2cf555a200ed767a1d4"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (9 files): packages/core/index.ts \u2192 packages/core/src/code_assist/codeAssist.ts \u2192 packages/core/src/code_assist/oauth2.ts \u2192 packages/core/src/code_assist/oauth-credential-storage.ts \u2192 packages/core/src/mcp/token-storage/hybrid-token-storage.ts \u2192 packages/core/src/mcp/token-storage/keychain-token-storage.ts \u2192 packages/core/src/services/keychainService.ts \u2192 packages/core/src/telemetry/types.ts \u2192 packages/core/src/core/contentGenerator.ts \u2192 packages/core/index.ts (one verified cycle inside a mutually-dependent group of 97 files)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/index.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4798abfabddede10a7dacccc9725b087b7923a7b8a517eca5b2da94bf8a4abd2"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (3 files): packages/core/src/services/sandboxManager.ts \u2192 packages/core/src/sandbox/utils/commandSafety.ts \u2192 packages/core/src/utils/shell-utils.ts \u2192 packages/core/src/services/sandboxManager.ts (one verified cycle inside a mutually-dependent group of 14 files)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/services/sandboxManager.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd9832dd736ad8b38f336b699331a549392ef1d056c936d23ea13d374b2bb440"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (2 files): packages/core/src/services/chatRecordingService.ts \u2192 packages/core/src/utils/sessionUtils.ts \u2192 packages/core/src/services/chatRecordingService.ts"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/core/src/services/chatRecordingService.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c6e2e5c4e8b49819791839b757eb631b1066d3514aaf78be4f2469f6973feec"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (2 files): packages/vscode-ide-companion/src/diff-manager.ts \u2192 packages/vscode-ide-companion/src/extension.ts \u2192 packages/vscode-ide-companion/src/diff-manager.ts"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/vscode-ide-companion/src/diff-manager.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3135525441a5ff62a59611458a314794ba515e4f1ab6100d2de2aeb5edde137"}}],"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-1104","guid":"4c918cb5-b2a6-6c55-9963-a44ee464305e","name":"CWE-1104","shortDescription":{"text":"CWE-1104"},"helpUri":"https://cwe.mitre.org/data/definitions/1104.html"},{"id":"CWE-1352","guid":"5257f322-5cfc-6b52-bedd-0b9a526b4c7d","name":"CWE-1352","shortDescription":{"text":"CWE-1352"},"helpUri":"https://cwe.mitre.org/data/definitions/1352.html"},{"id":"CWE-1357","guid":"e4d2e772-757e-0a5c-bd7d-77052949d866","name":"Reliance on Insufficiently Trustworthy Component","shortDescription":{"text":"Reliance on Insufficiently Trustworthy Component"},"helpUri":"https://cwe.mitre.org/data/definitions/1357.html"},{"id":"CWE-1395","guid":"800e09e7-c11a-8654-9fa6-86f398995fed","name":"Dependency on Vulnerable Third-Party Component","shortDescription":{"text":"Dependency on Vulnerable Third-Party Component"},"helpUri":"https://cwe.mitre.org/data/definitions/1395.html"},{"id":"CWE-16","guid":"659db3ea-affc-8453-8add-c1218fbfcb92","name":"Configuration","shortDescription":{"text":"Configuration"},"helpUri":"https://cwe.mitre.org/data/definitions/16.html"},{"id":"CWE-214","guid":"b10ad120-fb22-1351-9348-aa23b453e815","name":"CWE-214","shortDescription":{"text":"CWE-214"},"helpUri":"https://cwe.mitre.org/data/definitions/214.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-345","guid":"d80d4b65-bbbe-b65d-958e-7ac466af18f9","name":"CWE-345","shortDescription":{"text":"CWE-345"},"helpUri":"https://cwe.mitre.org/data/definitions/345.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-532","guid":"1cd8877a-76e8-ce54-b40b-779af23364a0","name":"CWE-532","shortDescription":{"text":"CWE-532"},"helpUri":"https://cwe.mitre.org/data/definitions/532.html"},{"id":"CWE-668","guid":"e2cb99db-6d24-b056-b0d0-885a733ec403","name":"CWE-668","shortDescription":{"text":"CWE-668"},"helpUri":"https://cwe.mitre.org/data/definitions/668.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-787","guid":"8db42c17-be38-9957-afe3-9de34680c2b5","name":"CWE-787","shortDescription":{"text":"CWE-787"},"helpUri":"https://cwe.mitre.org/data/definitions/787.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-823","guid":"971daa90-fe83-3956-970a-053292798b9e","name":"CWE-823","shortDescription":{"text":"CWE-823"},"helpUri":"https://cwe.mitre.org/data/definitions/823.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-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":123,"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."]}]}