{"$schema":"https://json.schemastore.org/sarif-2.1.0.json","version":"2.1.0","runs":[{"tool":{"driver":{"name":"codehealth","informationUri":"https://codehealth.canine.dev","rules":[{"id":"D1","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D1"},{"id":"D2","name":"Cognitive Complexity","shortDescription":{"text":"Cognitive Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D2"},{"id":"D3","name":"God Classes","shortDescription":{"text":"God Classes"},"helpUri":"https://codehealth.canine.dev/dimensions/D3"},{"id":"D4","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/D4"},{"id":"D5","name":"Coupling","shortDescription":{"text":"Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D5"},{"id":"D6","name":"Cohesion (LCOM4)","shortDescription":{"text":"Cohesion (LCOM4)"},"helpUri":"https://codehealth.canine.dev/dimensions/D6"},{"id":"D9","name":"Test Distribution","shortDescription":{"text":"Test Distribution"},"helpUri":"https://codehealth.canine.dev/dimensions/D9"},{"id":"D10","name":"Test Quality","shortDescription":{"text":"Test Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D10"},{"id":"D12","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/D12"},{"id":"D13","name":"Secret Scanning","shortDescription":{"text":"Secret Scanning"},"helpUri":"https://codehealth.canine.dev/dimensions/D13","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"],"owasp":"A07:2025"}},{"id":"D14","name":"License Compliance","shortDescription":{"text":"License Compliance"},"helpUri":"https://codehealth.canine.dev/dimensions/D14"},{"id":"D15","name":"Churn \u00D7 Complexity Hotspots","shortDescription":{"text":"Churn \u00D7 Complexity Hotspots"},"helpUri":"https://codehealth.canine.dev/dimensions/D15"},{"id":"D16","name":"Bus Factor","shortDescription":{"text":"Bus Factor"},"helpUri":"https://codehealth.canine.dev/dimensions/D16"},{"id":"D17","name":"Explicit Debt","shortDescription":{"text":"Explicit Debt"},"helpUri":"https://codehealth.canine.dev/dimensions/D17"},{"id":"D19","name":"Documentation Quality","shortDescription":{"text":"Documentation Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D19"},{"id":"D20","name":"ADR Quality","shortDescription":{"text":"ADR Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D20"},{"id":"D21","name":"Naming Consistency","shortDescription":{"text":"Naming Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D21"},{"id":"D22","name":"Internal API Consistency","shortDescription":{"text":"Internal API Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D22"},{"id":"D26","name":"Project Cohesion","shortDescription":{"text":"Project Cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/D26"},{"id":"D28","name":"Secrets (history)","shortDescription":{"text":"Secrets (history)"},"helpUri":"https://codehealth.canine.dev/dimensions/D28","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"],"owasp":"A07:2025"}},{"id":"D29","name":"Static Analysis (SAST)","shortDescription":{"text":"Static Analysis (SAST)"},"helpUri":"https://codehealth.canine.dev/dimensions/D29","relationships":[{"target":{"id":"CWE-79","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-77","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-79","CWE-89","CWE-78","CWE-94","CWE-77"],"owasp":"A05:2025"}},{"id":"D30","name":"Dependency Vulnerabilities","shortDescription":{"text":"Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D30","relationships":[{"target":{"id":"CWE-1395","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-937","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1395","CWE-937"],"owasp":"A03:2025"}},{"id":"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"]},{"target":{"id":"A02:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1032","CWE-732","CWE-16"],"owasp":"A02:2025"}},{"id":"D34","name":"Knowledge Freshness","shortDescription":{"text":"Knowledge Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/D34"},{"id":"D35","name":"Change Coupling","shortDescription":{"text":"Change Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D35"},{"id":"D36","name":"Supply-chain Provenance \u0026 Signing","shortDescription":{"text":"Supply-chain Provenance \u0026 Signing"},"helpUri":"https://codehealth.canine.dev/dimensions/D36","relationships":[{"target":{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1357","CWE-494"],"owasp":"A03:2025"}},{"id":"D43","name":"Malicious Dependencies","shortDescription":{"text":"Malicious Dependencies"},"helpUri":"https://codehealth.canine.dev/dimensions/D43","relationships":[{"target":{"id":"CWE-506","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A08:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-506"],"owasp":"A08:2025"}},{"id":"D44","name":"Platform End-of-Life","shortDescription":{"text":"Platform End-of-Life"},"helpUri":"https://codehealth.canine.dev/dimensions/D44"},{"id":"AX10","name":"Code composition","shortDescription":{"text":"Code composition"},"helpUri":"https://codehealth.canine.dev/dimensions/AX10"},{"id":"AX3","name":"Project dependency cycles","shortDescription":{"text":"Project dependency cycles"},"helpUri":"https://codehealth.canine.dev/dimensions/AX3"},{"id":"AX4","name":"Dependency direction","shortDescription":{"text":"Dependency direction"},"helpUri":"https://codehealth.canine.dev/dimensions/AX4"},{"id":"AXB2","name":"Runtime readiness","shortDescription":{"text":"Runtime readiness"},"helpUri":"https://codehealth.canine.dev/dimensions/AXB2"},{"id":"C2","name":"Access Controls","shortDescription":{"text":"Access Controls"},"helpUri":"https://codehealth.canine.dev/dimensions/C2"},{"id":"ED5","name":"Idempotency","shortDescription":{"text":"Idempotency"},"helpUri":"https://codehealth.canine.dev/dimensions/ED5"},{"id":"M1","name":"Documentation (README)","shortDescription":{"text":"Documentation (README)"},"helpUri":"https://codehealth.canine.dev/dimensions/M1"},{"id":"M2","name":"Architecture documentation","shortDescription":{"text":"Architecture documentation"},"helpUri":"https://codehealth.canine.dev/dimensions/M2"},{"id":"M3","name":"Folder \u0026 project structure","shortDescription":{"text":"Folder \u0026 project structure"},"helpUri":"https://codehealth.canine.dev/dimensions/M3"},{"id":"M4","name":"Documentation accuracy","shortDescription":{"text":"Documentation accuracy"},"helpUri":"https://codehealth.canine.dev/dimensions/M4"},{"id":"P1","name":"CI/CD gates","shortDescription":{"text":"CI/CD gates"},"helpUri":"https://codehealth.canine.dev/dimensions/P1"},{"id":"P10","name":"Library API \u0026 versioning","shortDescription":{"text":"Library API \u0026 versioning"},"helpUri":"https://codehealth.canine.dev/dimensions/P10"},{"id":"P12","name":"CI test-gate honesty","shortDescription":{"text":"CI test-gate honesty"},"helpUri":"https://codehealth.canine.dev/dimensions/P12"},{"id":"P2","name":"Observability","shortDescription":{"text":"Observability"},"helpUri":"https://codehealth.canine.dev/dimensions/P2"},{"id":"P3","name":"Security \u0026 performance tooling","shortDescription":{"text":"Security \u0026 performance tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/P3"},{"id":"P4","name":"Deployment \u0026 Rollback","shortDescription":{"text":"Deployment \u0026 Rollback"},"helpUri":"https://codehealth.canine.dev/dimensions/P4"},{"id":"P6","name":"Release Hygiene","shortDescription":{"text":"Release Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/P6"},{"id":"P7","name":"Outbound HTTP resilience","shortDescription":{"text":"Outbound HTTP resilience"},"helpUri":"https://codehealth.canine.dev/dimensions/P7"},{"id":"PF1","name":"Benchmark discipline","shortDescription":{"text":"Benchmark discipline"},"helpUri":"https://codehealth.canine.dev/dimensions/PF1"},{"id":"PF3","name":"Async \u0026 latency hygiene","shortDescription":{"text":"Async \u0026 latency hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/PF3"},{"id":"SC1","name":"Supply-chain hygiene","shortDescription":{"text":"Supply-chain hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/SC1"},{"id":"X1","name":"Async correctness","shortDescription":{"text":"Async correctness"},"helpUri":"https://codehealth.canine.dev/dimensions/X1"},{"id":"X10","name":"Duplicated predicate","shortDescription":{"text":"Duplicated predicate"},"helpUri":"https://codehealth.canine.dev/dimensions/X10"},{"id":"X12","name":"Unreachable branch","shortDescription":{"text":"Unreachable branch"},"helpUri":"https://codehealth.canine.dev/dimensions/X12"},{"id":"X13","name":"Undrained process stream","shortDescription":{"text":"Undrained process stream"},"helpUri":"https://codehealth.canine.dev/dimensions/X13"},{"id":"X14","name":"Bypassable address classification","shortDescription":{"text":"Bypassable address classification"},"helpUri":"https://codehealth.canine.dev/dimensions/X14"},{"id":"X15","name":"Unvalidated length from an untrusted reader","shortDescription":{"text":"Unvalidated length from an untrusted reader"},"helpUri":"https://codehealth.canine.dev/dimensions/X15"},{"id":"X16","name":"Unfloored truncation loop","shortDescription":{"text":"Unfloored truncation loop"},"helpUri":"https://codehealth.canine.dev/dimensions/X16"},{"id":"X17","name":"Uncapped recursion over a caller-supplied document","shortDescription":{"text":"Uncapped recursion over a caller-supplied document"},"helpUri":"https://codehealth.canine.dev/dimensions/X17"},{"id":"X18","name":"Disposal-pattern correctness","shortDescription":{"text":"Disposal-pattern correctness"},"helpUri":"https://codehealth.canine.dev/dimensions/X18"},{"id":"X19","name":"Unrestored process-global state","shortDescription":{"text":"Unrestored process-global state"},"helpUri":"https://codehealth.canine.dev/dimensions/X19"},{"id":"X20","name":"Mistyped argument guard","shortDescription":{"text":"Mistyped argument guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X20"},{"id":"X21","name":"Side-effecting pattern guard","shortDescription":{"text":"Side-effecting pattern guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X21"},{"id":"X22","name":"Contradicted release guard","shortDescription":{"text":"Contradicted release guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X22"},{"id":"X23","name":"Unguarded diagnostic materialisation","shortDescription":{"text":"Unguarded diagnostic materialisation"},"helpUri":"https://codehealth.canine.dev/dimensions/X23"},{"id":"X24","name":"Document value interpolated into markup unescaped","shortDescription":{"text":"Document value interpolated into markup unescaped"},"helpUri":"https://codehealth.canine.dev/dimensions/X24"},{"id":"X25","name":"Inert configuration knob","shortDescription":{"text":"Inert configuration knob"},"helpUri":"https://codehealth.canine.dev/dimensions/X25"},{"id":"X26","name":"Unsynchronised callback handoff","shortDescription":{"text":"Unsynchronised callback handoff"},"helpUri":"https://codehealth.canine.dev/dimensions/X26"},{"id":"X27","name":"Collection changed while being enumerated","shortDescription":{"text":"Collection changed while being enumerated"},"helpUri":"https://codehealth.canine.dev/dimensions/X27"},{"id":"X28","name":"Index access outside its own emptiness guard","shortDescription":{"text":"Index access outside its own emptiness guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X28"},{"id":"X29","name":"Per-element action decided by a fixed element","shortDescription":{"text":"Per-element action decided by a fixed element"},"helpUri":"https://codehealth.canine.dev/dimensions/X29"},{"id":"X3","name":"Exception handling","shortDescription":{"text":"Exception handling"},"helpUri":"https://codehealth.canine.dev/dimensions/X3"},{"id":"X30","name":"Support guard that admits what it rejects","shortDescription":{"text":"Support guard that admits what it rejects"},"helpUri":"https://codehealth.canine.dev/dimensions/X30"},{"id":"X32","name":"Type resolved by simple name across every loaded assembly","shortDescription":{"text":"Type resolved by simple name across every loaded assembly"},"helpUri":"https://codehealth.canine.dev/dimensions/X32"},{"id":"X4","name":"Structured logging","shortDescription":{"text":"Structured logging"},"helpUri":"https://codehealth.canine.dev/dimensions/X4"},{"id":"X6","name":"Hand-rolled structured-format parsing","shortDescription":{"text":"Hand-rolled structured-format parsing"},"helpUri":"https://codehealth.canine.dev/dimensions/X6"},{"id":"X7","name":"Silent fallback defaults","shortDescription":{"text":"Silent fallback defaults"},"helpUri":"https://codehealth.canine.dev/dimensions/X7"},{"id":"X9","name":"Subsumed condition operand","shortDescription":{"text":"Subsumed condition operand"},"helpUri":"https://codehealth.canine.dev/dimensions/X9"}]}},"results":[{"ruleId":"D1","level":"warning","message":{"text":"textual_adapter.execute_task_textual (cyclomatic 380): textual_adapter.execute_task_textual has cyclomatic complexity 380 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/textual_adapter.py"},"region":{"startLine":1797}}}],"partialFingerprints":{"codehealthFindingId/v1":"f51429bf35825798368dbde4cc9752cef1465411dc6f483b049f63aefc9f99df"}},{"ruleId":"D1","level":"warning","message":{"text":"main.cli_main (cyclomatic 194): main.cli_main has cyclomatic complexity 194 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":5335}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bc380509e78795010362e6f9b09b13c3fa989427196ba711f33b63fccd73181"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._handle_command (cyclomatic 124): DeepAgentsApp._handle_command has cyclomatic complexity 124 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":17494}}}],"partialFingerprints":{"codehealthFindingId/v1":"00f74b06fe8ee699623200701175beaa4676b7ec86b6490511660b96c7ca9a5d"}},{"ruleId":"D1","level":"warning","message":{"text":"agent.create_cli_agent (cyclomatic 113): agent.create_cli_agent has cyclomatic complexity 113 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/agent.py"},"region":{"startLine":2524}}}],"partialFingerprints":{"codehealthFindingId/v1":"960e8b2950b3d7910202e3b948f2c6266c5c461b9668b294bfcefdfbc42ba358"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._run_agent_task (cyclomatic 61): DeepAgentsApp._run_agent_task has cyclomatic complexity 61 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":19801}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ad7dacc55fe6cf798b6fc14528f5aac17a783c300e0fa84bea6b9b7f1261d7a"}},{"ruleId":"D1","level":"warning","message":{"text":"graph.create_deep_agent (cyclomatic 59): graph.create_deep_agent has cyclomatic complexity 59 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/graph.py"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"75a927a268a8700ec8cdb86b827f349d69ba91b832260e9ab9369a301e1522b1"}},{"ruleId":"D1","level":"warning","message":{"text":"config.create_model (cyclomatic 55): config.create_model has cyclomatic complexity 55 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/config.py"},"region":{"startLine":6767}}}],"partialFingerprints":{"codehealthFindingId/v1":"01db9dacce589396e515ff39eca09992a0300942a7c4e4143b1750abcd30ea03"}},{"ruleId":"D1","level":"warning","message":{"text":"non_interactive._run_agent_loop (cyclomatic 53): non_interactive._run_agent_loop has cyclomatic complexity 53 (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":"libs/code/deepagents_code/client/non_interactive.py"},"region":{"startLine":2121}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddca73e4a22414b7e7250d4e04c350c8f39155c39d86f8372eab3404afa742bf"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._restart_server_for_owned_agent_swap (cyclomatic 52): DeepAgentsApp._restart_server_for_owned_agent_swap has cyclomatic complexity 52 (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":"libs/code/deepagents_code/app.py"},"region":{"startLine":25897}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8d7c06fa23d017d7add3b93555761d9cb2514811b7773664ce83529795e34c9"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp.__init__ (cyclomatic 49): DeepAgentsApp.__init__ has cyclomatic complexity 49 (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":"libs/code/deepagents_code/app.py"},"region":{"startLine":3390}}}],"partialFingerprints":{"codehealthFindingId/v1":"433b732429ef3a44931e8a58dc49d85167d7f1679720bca90d56a43cff20067a"}},{"ruleId":"D1","level":"warning","message":{"text":"AutoModeHITLMiddleware.awrap_model_call (cyclomatic 48): AutoModeHITLMiddleware.awrap_model_call has cyclomatic complexity 48 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/auto_mode.py"},"region":{"startLine":3215}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cdbe1ee24b5bfc35564169d90ba781673b1651a6d4c357f144b6a3d31b100c8"}},{"ruleId":"D1","level":"warning","message":{"text":"AutoModeHITLMiddleware.aafter_model (cyclomatic 47): AutoModeHITLMiddleware.aafter_model has cyclomatic complexity 47 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/auto_mode.py"},"region":{"startLine":4096}}}],"partialFingerprints":{"codehealthFindingId/v1":"107c0aa954514029810f118847a8efeca7a128622b2b1c98191f5492cf084836"}},{"ruleId":"D1","level":"warning","message":{"text":"providers.coerce_toml_value (cyclomatic 47): providers.coerce_toml_value has cyclomatic complexity 47 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/configuration/providers.py"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"23309e8f0045cc2f9823cb00698fe3cd0aba31e450a84c2e2c1e32c40f76d332"}},{"ruleId":"D1","level":"warning","message":{"text":"bridge.handle (cyclomatic 47): bridge.handle has cyclomatic 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, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/channels/whatsapp_bridge/bridge.js"},"region":{"startLine":581}}}],"partialFingerprints":{"codehealthFindingId/v1":"40d9ef064254f90b977237997692d8a2bfc51d4c7b8657eb8c4c9e7910511fb1"}},{"ruleId":"D1","level":"warning","message":{"text":"mcp_tools.resolve_and_load_mcp_tools (cyclomatic 46): mcp_tools.resolve_and_load_mcp_tools 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":"libs/code/deepagents_code/mcp_tools.py"},"region":{"startLine":2565}}}],"partialFingerprints":{"codehealthFindingId/v1":"d86f54a8d8f3920d885579e3569df726a9555592760f19f77e1adee6d5c53849"}},{"ruleId":"D1","level":"warning","message":{"text":"bridge.enqueueMessage (cyclomatic 46): bridge.enqueueMessage has cyclomatic complexity 46 (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":"libs/talon/deepagents_talon/channels/whatsapp_bridge/bridge.js"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"678deb4c2e2d315709d13e013d359be6088bb0d3ca7aad5b84e34b19a8ea8c25"}},{"ruleId":"D1","level":"warning","message":{"text":"app._format_mcp_server_changes (cyclomatic 45): app._format_mcp_server_changes has cyclomatic complexity 45 (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":"libs/code/deepagents_code/app.py"},"region":{"startLine":859}}}],"partialFingerprints":{"codehealthFindingId/v1":"23c8bab73472607e3123036dfd9d0a447325c788adcf1b1dbce3c737ab79cffb"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._run_reload_unlocked (cyclomatic 42): DeepAgentsApp._run_reload_unlocked has cyclomatic complexity 42 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":18236}}}],"partialFingerprints":{"codehealthFindingId/v1":"0111ebbf6fa9386894b213e30ff3da48e559db9855bac40f0046732b8be4d4fc"}},{"ruleId":"D1","level":"warning","message":{"text":"AgentServerACP.prompt (cyclomatic 41): AgentServerACP.prompt has cyclomatic complexity 41 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/acp/deepagents_acp/server.py"},"region":{"startLine":948}}}],"partialFingerprints":{"codehealthFindingId/v1":"f89002cf59922f81194c26fb0d462e8cee1797cf2a31a122876d0f4dba542095"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelSelectorScreen._update_display (cyclomatic 41): ModelSelectorScreen._update_display has cyclomatic complexity 41 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/model_selector.py"},"region":{"startLine":1310}}}],"partialFingerprints":{"codehealthFindingId/v1":"37d6162fdd4d3408101ea83c71f599dd6f58f1b2f1a45b4dac6efb524d92fa27"}},{"ruleId":"D1","level":"warning","message":{"text":"non_interactive._process_stream_chunk (cyclomatic 40): non_interactive._process_stream_chunk 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":"libs/code/deepagents_code/client/non_interactive.py"},"region":{"startLine":1551}}}],"partialFingerprints":{"codehealthFindingId/v1":"19bdbf86b4a8d5194e135dc01635899366d1be2f8ebde308eb199c6507b6dc51"}},{"ruleId":"D1","level":"warning","message":{"text":"non_interactive.run_non_interactive (cyclomatic 40): non_interactive.run_non_interactive 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":"libs/code/deepagents_code/client/non_interactive.py"},"region":{"startLine":2795}}}],"partialFingerprints":{"codehealthFindingId/v1":"af86952a981e0b45492d36e4e45d835135e545e63ed391f2c7758f9d4de24fa4"}},{"ruleId":"D1","level":"warning","message":{"text":"CostTrackingMiddleware._charge (cyclomatic 40): CostTrackingMiddleware._charge 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":"libs/code/deepagents_code/cost_tracking.py"},"region":{"startLine":3054}}}],"partialFingerprints":{"codehealthFindingId/v1":"8583e8f530ecb2d02faa07b5a2423bccf3586f3f60dfd29510306c5b36f0a607"}},{"ruleId":"D1","level":"warning","message":{"text":"AgentServerACP._handle_interrupts (cyclomatic 38): AgentServerACP._handle_interrupts 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":"libs/acp/deepagents_acp/server.py"},"region":{"startLine":1165}}}],"partialFingerprints":{"codehealthFindingId/v1":"158b244bdf81ecef5ed4984b1e7c5687fcda4a2611c69f21a5d1fc04de702853"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._convert_messages_to_data (cyclomatic 38): DeepAgentsApp._convert_messages_to_data 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":20452}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd642fbb29f48ae1a649446cfaf7a7f0c6b0c605d367af34c03615ed83b11ded"}},{"ruleId":"D1","level":"warning","message":{"text":"tool_display.format_tool_display (cyclomatic 38): tool_display.format_tool_display 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":"libs/code/deepagents_code/tool_display.py"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f558021ddb02f2b0c1a8ccd4c228b9cfa23f071f000f598ab228262a4bca6da"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._sync_goal_rubric_state_from_thread (cyclomatic 37): DeepAgentsApp._sync_goal_rubric_state_from_thread has cyclomatic complexity 37 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":15520}}}],"partialFingerprints":{"codehealthFindingId/v1":"eec5978061d01a77e70d31a1edfac51c35ddf320874eb503eebbb88185c16ef3"}},{"ruleId":"D1","level":"warning","message":{"text":"sessions.list_threads_command (cyclomatic 36): sessions.list_threads_command 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":"libs/code/deepagents_code/sessions.py"},"region":{"startLine":2180}}}],"partialFingerprints":{"codehealthFindingId/v1":"df17cbffa044b928d2928d70206f18533886fe31f6b44f9939543fb2450eac35"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._format_cost_summary (cyclomatic 35): DeepAgentsApp._format_cost_summary has cyclomatic complexity 35 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":9260}}}],"partialFingerprints":{"codehealthFindingId/v1":"414ed42ce0c96e3f068017859088eeced804852e5ce15d32fa2ceb004e5047b6"}},{"ruleId":"D1","level":"warning","message":{"text":"AutoModeHITLMiddleware._validated_plan (cyclomatic 35): AutoModeHITLMiddleware._validated_plan has cyclomatic complexity 35 (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":"libs/code/deepagents_code/auto_mode.py"},"region":{"startLine":3992}}}],"partialFingerprints":{"codehealthFindingId/v1":"8863c55ea344859b2c3990454d20faad19085a450c6caca78f6ddcd729378ac7"}},{"ruleId":"D1","level":"warning","message":{"text":"cost_tracking._estimate_cost (cyclomatic 35): cost_tracking._estimate_cost has cyclomatic complexity 35 (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":"libs/code/deepagents_code/cost_tracking.py"},"region":{"startLine":1687}}}],"partialFingerprints":{"codehealthFindingId/v1":"eaace1c496aac7cbf49c7d8da87c95969333acadbd62fd7e0fb2c9df0944afc2"}},{"ruleId":"D1","level":"warning","message":{"text":"model_config._discover_available_models (cyclomatic 35): model_config._discover_available_models has cyclomatic complexity 35 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":1562}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d8c85b7e525d917ce030617fc75140605d90aaacbf634fba02060e42f2bf605"}},{"ruleId":"D1","level":"warning","message":{"text":"aggregate_unified.read_leaf (cyclomatic 35): aggregate_unified.read_leaf has cyclomatic complexity 35 (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":".github/scripts/evals/aggregate_unified.py"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"52e8232144ff54424c416de6a2f77bfab2443484c21df329a4e22fc5bcd8fc97"}},{"ruleId":"D1","level":"warning","message":{"text":"build_release_notes.collect_contributors (cyclomatic 35): build_release_notes.collect_contributors has cyclomatic complexity 35 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/release/build_release_notes.py"},"region":{"startLine":981}}}],"partialFingerprints":{"codehealthFindingId/v1":"758ec467a73d3277f8538aebc3a600a8d33cc008ddaf938940c82b917feb3399"}},{"ruleId":"D1","level":"warning","message":{"text":"analyze.print_summary (cyclomatic 34): analyze.print_summary 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":"libs/evals/scripts/analyze.py"},"region":{"startLine":385}}}],"partialFingerprints":{"codehealthFindingId/v1":"2185792e604c06f27bcad33f65af0ad3b22576f9907c71feb12c3e8456dc5d9c"}},{"ruleId":"D1","level":"warning","message":{"text":"main._run_startup_auto_update (cyclomatic 33): main._run_startup_auto_update has cyclomatic complexity 33 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":564}}}],"partialFingerprints":{"codehealthFindingId/v1":"4291e0c3ed6be9be3ca4ffd13e97504adbc58689acf34dc4e1c851dde3fb147a"}},{"ruleId":"D1","level":"warning","message":{"text":"ChatTextArea._on_key (cyclomatic 33): ChatTextArea._on_key has cyclomatic complexity 33 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/chat_input.py"},"region":{"startLine":1239}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ef87af022bce4aefdfb3feaa729003e93009378c3562b116ff0451548738d10"}},{"ruleId":"D1","level":"warning","message":{"text":"WelcomeBanner._build_banner (cyclomatic 33): WelcomeBanner._build_banner has cyclomatic complexity 33 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/welcome.py"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"31aed6e1cae50ca370afc4aee0fcb782212b747601fa48499a2d5f13c7ebb69c"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._load_thread_history (cyclomatic 32): DeepAgentsApp._load_thread_history has cyclomatic complexity 32 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":21041}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb99981f47255876c5872dabae42d647133d18ab30a1db2330b1162d4b55bf2e"}},{"ruleId":"D1","level":"warning","message":{"text":"providers.coerce_environment_value (cyclomatic 32): providers.coerce_environment_value 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":"libs/code/deepagents_code/configuration/providers.py"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8b6eee6df4ce8d428880c7eec881c84b06597d11d9ad18dda303920838d43c2"}},{"ruleId":"D1","level":"warning","message":{"text":"FileOpTracker.complete_with_message (cyclomatic 32): FileOpTracker.complete_with_message 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":"libs/code/deepagents_code/file_ops.py"},"region":{"startLine":805}}}],"partialFingerprints":{"codehealthFindingId/v1":"03b5fa419de12949bcb04f0ed9ca95e23868d05bfe9c2009e01b08ef636a237e"}},{"ruleId":"D1","level":"warning","message":{"text":"main._check_mcp_project_trust (cyclomatic 32): main._check_mcp_project_trust has cyclomatic complexity 32 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":4651}}}],"partialFingerprints":{"codehealthFindingId/v1":"da8ebc2433962e946cbe7dddf359b896e75fbdd58fb0d1619ea32c0c0b2273be"}},{"ruleId":"D1","level":"warning","message":{"text":"PluginManagerScreen._refresh_view (cyclomatic 31): PluginManagerScreen._refresh_view 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":"libs/code/deepagents_code/tui/modals/plugin_manager/__init__.py"},"region":{"startLine":451}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc07ede967ccc0572f8faf8755ea68f534b85ed6398468121799c804003fc74d"}},{"ruleId":"D1","level":"warning","message":{"text":"AuthPromptScreen.compose (cyclomatic 31): AuthPromptScreen.compose has cyclomatic complexity 31 (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":"libs/code/deepagents_code/tui/widgets/auth.py"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"74522f58b07c7cec14855cf3c7ce584888deebaf264800836645595b4e9da00c"}},{"ruleId":"D1","level":"warning","message":{"text":"mcp_login_service.resolve_mcp_config (cyclomatic 30): mcp_login_service.resolve_mcp_config 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":"libs/code/deepagents_code/mcp_login_service.py"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab9a030ecc20da4478118fa3e665a1ac35566c4ed4972f53a4df8d7cd11bebd8"}},{"ruleId":"D1","level":"warning","message":{"text":"model_config.get_model_profiles (cyclomatic 30): model_config.get_model_profiles 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":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":1794}}}],"partialFingerprints":{"codehealthFindingId/v1":"450538b3d7d5d8f16ffb358053be7ce60fd5402d41316380c7a73d8ec16bcfcf"}},{"ruleId":"D1","level":"warning","message":{"text":"unified_prep.main (cyclomatic 30): unified_prep.main 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":".github/scripts/evals/unified_prep.py"},"region":{"startLine":527}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a636556f37e3719d17b4011ac459b5c21ccbaf8a7059a3fcbf9da4abb7a442a"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp.exit (cyclomatic 29): DeepAgentsApp.exit has cyclomatic complexity 29 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":23093}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd9be05b7780878d229a9566a08d2ea25de77c33fea8a34b25dcdfb81da6e141"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelConfig.load (cyclomatic 29): ModelConfig.load has cyclomatic complexity 29 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":3364}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cd355afa9f171968f0d5e187ce700cd966f27be7023fc6228dd84c517c39c8d"}},{"ruleId":"D1","level":"warning","message":{"text":"non_interactive._process_ai_message (cyclomatic 28): non_interactive._process_ai_message 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":"libs/code/deepagents_code/client/non_interactive.py"},"region":{"startLine":781}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ee2f699494b867878e5971742a43967e6a0527c14da536275d8bd23d03de501"}},{"ruleId":"D1","level":"warning","message":{"text":"generate_radar.main (cyclomatic 28): generate_radar.main 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":"libs/evals/scripts/generate_radar.py"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"465fbb58337268e89c0987671defdaba8434a905895d22c9ee13ee9c7fbca4fe"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._resolve_resume_thread (cyclomatic 27): DeepAgentsApp._resolve_resume_thread 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":6110}}}],"partialFingerprints":{"codehealthFindingId/v1":"46dcaff6d5b7753cc8c455cec9a962f9e9c3f5f5f141f632f2b9441f0bdb7e26"}},{"ruleId":"D1","level":"warning","message":{"text":"quick_validate.validate_skill (cyclomatic 27): quick_validate.validate_skill 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":"libs/code/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"84ef049c469f09207b62f5ce7965820817bc1424e1d8e10637f96857d298341c"}},{"ruleId":"D1","level":"warning","message":{"text":"non_interactive._process_rubric_event (cyclomatic 27): non_interactive._process_rubric_event 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":"libs/code/deepagents_code/client/non_interactive.py"},"region":{"startLine":1064}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5d80c6b620df8e4ccf377a59f58e114033a928499ab19255e6267d52e1b1681"}},{"ruleId":"D1","level":"warning","message":{"text":"commands._list (cyclomatic 27): commands._list 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":"libs/code/deepagents_code/skills/commands.py"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea1ea1b83a6f905f3c3bf2e604b430d3a8c9467239a449627d36bf924f88276d"}},{"ruleId":"D1","level":"warning","message":{"text":"commands._delete (cyclomatic 27): commands._delete 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":"libs/code/deepagents_code/skills/commands.py"},"region":{"startLine":671}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8c6ef0aa2ce5cc0eab5f19e31dabdaf0ad60cccb10bea70cc3f0993e7537820"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentRuntime._create_graph (cyclomatic 27): DeepAgentRuntime._create_graph 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":"libs/talon/deepagents_talon/runtime.py"},"region":{"startLine":433}}}],"partialFingerprints":{"codehealthFindingId/v1":"740290c7ebbe934eb56c60dc5ed3ee2f6c8c50af03be51be38d97a08aaa6186e"}},{"ruleId":"D1","level":"warning","message":{"text":"aggregate_unified.combine (cyclomatic 27): aggregate_unified.combine 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":".github/scripts/evals/aggregate_unified.py"},"region":{"startLine":379}}}],"partialFingerprints":{"codehealthFindingId/v1":"e668b9d9652cc727aae8fddf8603de47849035628284a5b5837265b36ec2467a"}},{"ruleId":"D1","level":"warning","message":{"text":"_session_stats.record_message_usage (cyclomatic 26): _session_stats.record_message_usage 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":"libs/code/deepagents_code/_session_stats.py"},"region":{"startLine":934}}}],"partialFingerprints":{"codehealthFindingId/v1":"08d1712890dcdc314c958d4d2034f37c35133d0b4358b2dc14fef5eb991d8ba0"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._offer_thread_cwd_switch (cyclomatic 26): DeepAgentsApp._offer_thread_cwd_switch 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":31114}}}],"partialFingerprints":{"codehealthFindingId/v1":"14c7e9a3532193257ded59452ee41a0021d21955cf8867f0a684764210adb106"}},{"ruleId":"D1","level":"warning","message":{"text":"theme._load_user_themes (cyclomatic 26): theme._load_user_themes 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":"libs/code/deepagents_code/theme.py"},"region":{"startLine":517}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd77c549c00dfc9c4e9e819b3698f8ea10ab89fd1143326e7ee5a711673e641f"}},{"ruleId":"D1","level":"warning","message":{"text":"main.run_textual_cli_async (cyclomatic 25): main.run_textual_cli_async 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":"libs/code/deepagents_code/main.py"},"region":{"startLine":3167}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cc46d44a721a44d71e0d20fb5dfcf0276224e7c74fc659d2e306961b3cfad8f"}},{"ruleId":"D1","level":"warning","message":{"text":"update_check.perform_upgrade (cyclomatic 25): update_check.perform_upgrade 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":"libs/code/deepagents_code/update_check.py"},"region":{"startLine":2495}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9c10f355874eee37e298a836da101cc303b652cd8ca670f4ce086144f3f3c83"}},{"ruleId":"D1","level":"warning","message":{"text":"FilesystemBackend._python_search (cyclomatic 25): FilesystemBackend._python_search 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":"libs/deepagents/deepagents/backends/filesystem.py"},"region":{"startLine":1167}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a519988a89b8d7aaea8efcd1e09c1ca85c3d4892bcb47bb81414e49d988fe88"}},{"ruleId":"D1","level":"warning","message":{"text":"FilesystemBackend.glob (cyclomatic 25): FilesystemBackend.glob has cyclomatic complexity 25 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/filesystem.py"},"region":{"startLine":1320}}}],"partialFingerprints":{"codehealthFindingId/v1":"3da3731c4c42bf79171dcd7ca9fb7c60651f7cfff62113723a5f035d6704ef7e"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._set_rubric_model (cyclomatic 24): DeepAgentsApp._set_rubric_model has cyclomatic complexity 24 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":17367}}}],"partialFingerprints":{"codehealthFindingId/v1":"931d133eea785ee99652377016fcbb84dc2f85ac2ee07c67b24311119d6a3603"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp.action_toggle_tool_output (cyclomatic 24): DeepAgentsApp.action_toggle_tool_output 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":24399}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3feb136131b5d50f789f3e461049b4bc9eb85ca4b2914851e1b42c14e70de02"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._resume_owned_thread (cyclomatic 24): DeepAgentsApp._resume_owned_thread 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":31312}}}],"partialFingerprints":{"codehealthFindingId/v1":"0affc16a758d2c4e7ebeae7d1db72000ba5651b61ae27ee32ca9fb749060febb"}},{"ruleId":"D1","level":"warning","message":{"text":"non_interactive._process_message_chunk (cyclomatic 24): non_interactive._process_message_chunk 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":"libs/code/deepagents_code/client/non_interactive.py"},"region":{"startLine":912}}}],"partialFingerprints":{"codehealthFindingId/v1":"bedcea08cfc2039cd8ac781d5ee87db11fd29a43333378689c59add3bdedddc5"}},{"ruleId":"D1","level":"warning","message":{"text":"service.managed_policy_violations (cyclomatic 24): service.managed_policy_violations 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":"libs/code/deepagents_code/configuration/service.py"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"0570e628493d3926a3c750b33e0330d8a490b3717e39fb0e3af26b014eda0340"}},{"ruleId":"D1","level":"warning","message":{"text":"model_config.load_mcp_server_trust_lists (cyclomatic 24): model_config.load_mcp_server_trust_lists has cyclomatic complexity 24 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":5676}}}],"partialFingerprints":{"codehealthFindingId/v1":"17ee90781010b79568a09c44ee22602e28a2c0889a51733a37e9f5e6efdfbfc9"}},{"ruleId":"D1","level":"warning","message":{"text":"PluginManagerScreen.on_option_list_option_selected (cyclomatic 24): PluginManagerScreen.on_option_list_option_selected 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":"libs/code/deepagents_code/tui/modals/plugin_manager/__init__.py"},"region":{"startLine":1030}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4f49f464c03f87f29b98beddac5e17aea0273f3eca511c54dc0be6c56e3d74f"}},{"ruleId":"D1","level":"warning","message":{"text":"MessageData.to_widget (cyclomatic 24): MessageData.to_widget has cyclomatic complexity 24 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/message_store.py"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8f7b5c26125a766e7f74e146b4d3f46bb130da6486689d613a0f01e49aae47e"}},{"ruleId":"D1","level":"warning","message":{"text":"FilesystemBackend.ls (cyclomatic 24): FilesystemBackend.ls has cyclomatic complexity 24 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/filesystem.py"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"06eb8d965b85bdd106ce46bc1051bff3fbb4c7de36396adf5471849ef2a3190e"}},{"ruleId":"D1","level":"warning","message":{"text":"analyze.analyze_trial (cyclomatic 24): analyze.analyze_trial has cyclomatic complexity 24 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/evals/scripts/analyze.py"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"549d8f252205a25ed071d505422917500232efb0eaafe62c5085171f829a5502"}},{"ruleId":"D1","level":"warning","message":{"text":"_session_stats._record_message_usage (cyclomatic 23): _session_stats._record_message_usage 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":"libs/code/deepagents_code/_session_stats.py"},"region":{"startLine":1062}}}],"partialFingerprints":{"codehealthFindingId/v1":"7458228613b0d460b302c7dcc23e58b512b1e5031b2c7708d27a120dab0f021a"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._run_session_start_sequence (cyclomatic 23): DeepAgentsApp._run_session_start_sequence has cyclomatic complexity 23 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":11872}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c470ac84a79e082849c490b437b7be6eeb3d97fa740dcee402b43f825a3fa30"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._apply_goal_application (cyclomatic 23): DeepAgentsApp._apply_goal_application has cyclomatic complexity 23 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":16632}}}],"partialFingerprints":{"codehealthFindingId/v1":"edf2ae9d7178b23f9d088342ca39b4f0da6c707c4a6e7ddaa1bd7be3812088f4"}},{"ruleId":"D1","level":"warning","message":{"text":"AutoModeHITLMiddleware._human_review (cyclomatic 23): AutoModeHITLMiddleware._human_review 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":"libs/code/deepagents_code/auto_mode.py"},"region":{"startLine":3849}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc5fb6ac99d7d19f87ace4a81009ea6060c40e5a7e848d159fa7170cb427f41a"}},{"ruleId":"D1","level":"warning","message":{"text":"auto_mode._user_answer_evidence (cyclomatic 23): auto_mode._user_answer_evidence 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":"libs/code/deepagents_code/auto_mode.py"},"region":{"startLine":1533}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fa84b219cce4ae443a965cc805480d6f8922f1d732497b2fb2051bd3b72ac5f"}},{"ruleId":"D1","level":"warning","message":{"text":"mcp_tools._validate_server_config (cyclomatic 23): mcp_tools._validate_server_config 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":"libs/code/deepagents_code/mcp_tools.py"},"region":{"startLine":415}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1a7acb8abea93ad7affbbcbedc58d33540a72556467aacbefee9b278d3f5367"}},{"ruleId":"D1","level":"warning","message":{"text":"textual_adapter._format_rubric_details (cyclomatic 23): textual_adapter._format_rubric_details 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":"libs/code/deepagents_code/tui/textual_adapter.py"},"region":{"startLine":739}}}],"partialFingerprints":{"codehealthFindingId/v1":"037fb8abc056a297005db7c4a3b109683e4cede2a1daba83e4dbe96bde24ca91"}},{"ruleId":"D1","level":"warning","message":{"text":"agent._resolve_ptc_option (cyclomatic 22): agent._resolve_ptc_option 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":"libs/code/deepagents_code/agent.py"},"region":{"startLine":987}}}],"partialFingerprints":{"codehealthFindingId/v1":"f92a56e36a35ce696da8b6a20c009f17adcffab4d4c87c43c71f461abe3a6ff4"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._cleanup_agent_task (cyclomatic 22): DeepAgentsApp._cleanup_agent_task 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":20288}}}],"partialFingerprints":{"codehealthFindingId/v1":"e59cbf78b237e84a8ddeabf27987dead5ab1a7445f4c12fe3099b3279cd0ea4f"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._mount_message_unlocked (cyclomatic 22): DeepAgentsApp._mount_message_unlocked 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":21561}}}],"partialFingerprints":{"codehealthFindingId/v1":"087990755b2a9b0363551de3f5869edb29ec5903984bf5fd67fc84ea6294556c"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp.action_interrupt (cyclomatic 22): DeepAgentsApp.action_interrupt 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":22848}}}],"partialFingerprints":{"codehealthFindingId/v1":"40029467d2301744fea559993bdf7d234c403a70edc18f290df55f5d69e61d6e"}},{"ruleId":"D1","level":"warning","message":{"text":"Credentials._reload_values (cyclomatic 22): Credentials._reload_values 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":"libs/code/deepagents_code/config.py"},"region":{"startLine":3796}}}],"partialFingerprints":{"codehealthFindingId/v1":"0648f40ab0c8f7402e9281b735c95a59ec54c37256ff2a0f5a20dae83444f9bc"}},{"ruleId":"D1","level":"warning","message":{"text":"ConfigOption.__post_init__ (cyclomatic 22): ConfigOption.__post_init__ 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":"libs/code/deepagents_code/config_manifest.py"},"region":{"startLine":716}}}],"partialFingerprints":{"codehealthFindingId/v1":"2562e5e1b77961d1abf2387aee5a518ca7daac7d9e64d36bf128682451b95b99"}},{"ruleId":"D1","level":"warning","message":{"text":"managed_tools.ensure_ripgrep (cyclomatic 22): managed_tools.ensure_ripgrep 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":"libs/code/deepagents_code/managed_tools.py"},"region":{"startLine":739}}}],"partialFingerprints":{"codehealthFindingId/v1":"37f3e9c926156232915b8cfd64ed66116a1d23ae5ec5805715cb99198c2f2984"}},{"ruleId":"D1","level":"warning","message":{"text":"commands_cli.execute_plugin_command (cyclomatic 22): commands_cli.execute_plugin_command 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":"libs/code/deepagents_code/plugins/commands_cli.py"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea40608838831f4a313cd9be55c13f8bfd533e839845b747f4c50627ca07b5c7"}},{"ruleId":"D1","level":"warning","message":{"text":"update_check.get_latest_version (cyclomatic 22): update_check.get_latest_version 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":"libs/code/deepagents_code/update_check.py"},"region":{"startLine":682}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2bdcd21f399e6b27a203f13d8015441f733e484c91d6a1e3ffcbdbcd3b45a03"}},{"ruleId":"D1","level":"warning","message":{"text":"aggregate_evals.main (cyclomatic 22): aggregate_evals.main 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":".github/scripts/evals/aggregate_evals.py"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"64a1dd7e0ff776a45f3e0f0832d865f0ce5afdc4ed7dfd410a71089270b61bac"}},{"ruleId":"D1","level":"warning","message":{"text":"aggregate_unified_compare.compare (cyclomatic 22): aggregate_unified_compare.compare 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":".github/scripts/evals/aggregate_unified_compare.py"},"region":{"startLine":518}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec4a27fa2df545dc8d805ab9c25ab2bc2fd1212ab33228e410a5326cd43fc72b"}},{"ruleId":"D1","level":"warning","message":{"text":"ToolCallBuffer.parse_args (cyclomatic 21): ToolCallBuffer.parse_args 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":"libs/code/deepagents_code/_tool_stream.py"},"region":{"startLine":622}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc61f85bac497b1338b4811b601522307f3ddf173a7ffc0860ec847c22a28e63"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._handle_server_offload (cyclomatic 21): DeepAgentsApp._handle_server_offload 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":18617}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d5b0d3c335e6b2d102615bb9b0236089cdc9258e2453bc543ef0d315bcd4d41"}},{"ruleId":"D1","level":"warning","message":{"text":"ServerHooksMiddleware._after_model (cyclomatic 21): ServerHooksMiddleware._after_model 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":"libs/code/deepagents_code/hooks/server_middleware.py"},"region":{"startLine":601}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b729dfb4dde05a231be0c8aa24641a45481b08917120b66698ee7f986d85926"}},{"ruleId":"D1","level":"warning","message":{"text":"ChatInput.on_text_area_changed (cyclomatic 21): ChatInput.on_text_area_changed 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":"libs/code/deepagents_code/tui/widgets/chat_input.py"},"region":{"startLine":2752}}}],"partialFingerprints":{"codehealthFindingId/v1":"a963b134bea3ff2d95eb9d009ed181f3246ccb98c6064c391950c137fcc32ec5"}},{"ruleId":"D1","level":"warning","message":{"text":"_ContextUsage.render (cyclomatic 21): _ContextUsage.render 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":"libs/code/deepagents_code/tui/widgets/context_usage.py"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"330792aea17a4932c8fbc9253ffc8c1663fae2f4fc040d2b833f9ee544b0b46b"}},{"ruleId":"D1","level":"warning","message":{"text":"FilesystemMiddleware.__init__ (cyclomatic 21): FilesystemMiddleware.__init__ 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":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":1891}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5fa32aa44cad13d8bcfa0fd18e338784775402de31b0dfb592edc745935dead"}},{"ruleId":"D1","level":"warning","message":{"text":"cli._cmd_trials (cyclomatic 21): cli._cmd_trials 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":"libs/evals/deepagents_evals/cli.py"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"614831994ce96242207aca13fa73b43014b987be0cd326a790a0703b47e7d34d"}},{"ruleId":"D1","level":"warning","message":{"text":"raise_langchain_minimums._run (cyclomatic 21): raise_langchain_minimums._run 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":".github/scripts/checks/raise_langchain_minimums.py"},"region":{"startLine":628}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfff8d9716129d6bea745e329d937b75a1715740386048b563ffb08828930fb4"}},{"ruleId":"D1","level":"warning","message":{"text":"RepositoryBounds.apreflight (cyclomatic 20): RepositoryBounds.apreflight 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":"libs/code/deepagents_code/_repository_bounds.py"},"region":{"startLine":340}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b7673060a54f30ee6d8512037f145c6f785ba7342c4dc09d40d835f7dec7d08"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._handle_update_command (cyclomatic 20): DeepAgentsApp._handle_update_command 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":7295}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f7fe5e878d6264bfd9dc48f629cedd72ec7f9128d7a80aa2cdd99c0c4fffe34"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._confirm_and_switch_model (cyclomatic 20): DeepAgentsApp._confirm_and_switch_model 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":25195}}}],"partialFingerprints":{"codehealthFindingId/v1":"793b38f65aa2e4dde2b55d234a0d735d58121565e3f55a9ab761bad808e82ac5"}},{"ruleId":"D1","level":"warning","message":{"text":"ask_user._parse_answers (cyclomatic 20): ask_user._parse_answers 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":"libs/code/deepagents_code/ask_user.py"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"712f6f2ad74bbe447a7e204e57e71d3de2452dcd4e95c1ea3f64f1bd8f1da2e5"}},{"ruleId":"D1","level":"warning","message":{"text":"FileOpTracker.start_operation (cyclomatic 20): FileOpTracker.start_operation 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":"libs/code/deepagents_code/file_ops.py"},"region":{"startLine":695}}}],"partialFingerprints":{"codehealthFindingId/v1":"5521ca99cfbeb6e78f0719b8f1904e3902e125395dba391c5b90415e611fe7b7"}},{"ruleId":"D1","level":"warning","message":{"text":"file_ops.build_approval_preview (cyclomatic 20): file_ops.build_approval_preview 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":"libs/code/deepagents_code/file_ops.py"},"region":{"startLine":523}}}],"partialFingerprints":{"codehealthFindingId/v1":"46bfd6bc2056bf6d96728f3c39e09da71e2a7fe9e8bd8d166d2741d435c0d683"}},{"ruleId":"D1","level":"warning","message":{"text":"goal_state_notice.build_goal_state_notice (cyclomatic 20): goal_state_notice.build_goal_state_notice 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":"libs/code/deepagents_code/goal_state_notice.py"},"region":{"startLine":639}}}],"partialFingerprints":{"codehealthFindingId/v1":"b54994ff01a6ccbf20ea70b11b5238b19b19ad561d3a062607b574ad69da74d8"}},{"ruleId":"D1","level":"warning","message":{"text":"runner.run_command_handler (cyclomatic 20): runner.run_command_handler 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":"libs/code/deepagents_code/hooks/runner.py"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"f48788f74f1e1a3d663a0eccbe12bc31568e642aaa4b3164121f951ccde37cc1"}},{"ruleId":"D1","level":"warning","message":{"text":"main.apply_stdin_pipe (cyclomatic 20): main.apply_stdin_pipe 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":"libs/code/deepagents_code/main.py"},"region":{"startLine":3750}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdfcb0727966f324f55f003d376fece92f0d0bd8c81ab6655a5f3489a8f5a3de"}},{"ruleId":"D1","level":"warning","message":{"text":"model_api.model_metadata (cyclomatic 20): model_api.model_metadata 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":"libs/code/deepagents_code/model_api.py"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba02c503bfe9a5673088dc83bb1e53c94c8e6d261c8bb6ed33a6e9aa26bd0a7b"}},{"ruleId":"D1","level":"warning","message":{"text":"offload_api.workspace (cyclomatic 20): offload_api.workspace 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":"libs/code/deepagents_code/offload_api.py"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8dae3cc1e52a7d8f0234f17b96d4ef1c723d6d1c4b2501bbd1376984e8c2cd3"}},{"ruleId":"D1","level":"warning","message":{"text":"discovery.auto_update_plugins (cyclomatic 20): discovery.auto_update_plugins 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":"libs/code/deepagents_code/plugins/discovery.py"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"d26260e1c4ecfa1014110a66d9e95bdb88023994c93d598673460b775b25e146"}},{"ruleId":"D1","level":"warning","message":{"text":"history_profiles._validate_profile (cyclomatic 20): history_profiles._validate_profile 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":"libs/talon/deepagents_talon/history_profiles.py"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"06dcedb1e77399b5552d17b79f8d5c195660b37059667e74d8d34713bda0ecc1"}},{"ruleId":"D1","level":"warning","message":{"text":"aggregate_shards.main (cyclomatic 20): aggregate_shards.main 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":".github/scripts/evals/aggregate_shards.py"},"region":{"startLine":675}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a867be5c401541aeaa214f09f7e212794e2b5b56ce6407086ec40b806368324"}},{"ruleId":"D1","level":"warning","message":{"text":"aggregate_unified.render_markdown (cyclomatic 20): aggregate_unified.render_markdown 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":".github/scripts/evals/aggregate_unified.py"},"region":{"startLine":551}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0021261bd21647f62f2919fb2f524647330185109cb66871fb699e39b0ec473"}},{"ruleId":"D1","level":"warning","message":{"text":"build_release_notes.build_release_notes (cyclomatic 20): build_release_notes.build_release_notes 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":".github/scripts/release/build_release_notes.py"},"region":{"startLine":1673}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ef51aeb8c52454bced89397ddb233a81f9e59f4ca2b69966ee9bcb903816dfb"}},{"ruleId":"D1","level":"warning","message":{"text":"RepositoryBounds.preflight (cyclomatic 19): RepositoryBounds.preflight 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":"libs/code/deepagents_code/_repository_bounds.py"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"d58d6b2a5f93e23695e6f77f083da0479139bad49e2525ac0fe44f4ff1e2fafd"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._install_extra_unlocked (cyclomatic 19): DeepAgentsApp._install_extra_unlocked 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":8037}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd126220ba8d9b7d89baa2aeea1a9619db28d8592bacc807c50f4d9b2606fede"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._run_shell_task (cyclomatic 19): DeepAgentsApp._run_shell_task 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":13719}}}],"partialFingerprints":{"codehealthFindingId/v1":"90ec92095d0ec6c8a4de2b6c6da9e24e6fdd3cd029e958ae920a4e49dd90f926"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._handle_context_doctor_command (cyclomatic 19): DeepAgentsApp._handle_context_doctor_command has cyclomatic complexity 19 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":14433}}}],"partialFingerprints":{"codehealthFindingId/v1":"26362eebbe80449b7afb37853982f59129a5114603d3f702719cfd4a5a81ced0"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._handle_goal_command (cyclomatic 19): DeepAgentsApp._handle_goal_command 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":15834}}}],"partialFingerprints":{"codehealthFindingId/v1":"05052703227487ef019c14cec897538e39bfa4139e5753bcebb01ff450d618e7"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp.action_quit_or_interrupt (cyclomatic 19): DeepAgentsApp.action_quit_or_interrupt 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":22666}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c7aeb1987cd4634895b38f6a29e5fcce39e8eb1b9e21727d5d58e760946a1b4"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._switch_model (cyclomatic 19): DeepAgentsApp._switch_model 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":31887}}}],"partialFingerprints":{"codehealthFindingId/v1":"d07fc83458fb1a84d68ad09b34ff77908b5a1c53354176f82df84c35f5fb905d"}},{"ruleId":"D1","level":"warning","message":{"text":"RemoteAgent.astream (cyclomatic 19): RemoteAgent.astream 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":"libs/code/deepagents_code/client/remote_client.py"},"region":{"startLine":793}}}],"partialFingerprints":{"codehealthFindingId/v1":"a15976020d42ce77533afdb77511c1de473309dcfc1202e1f5e0267b9656fac2"}},{"ruleId":"D1","level":"warning","message":{"text":"configurable_model._build_overrides (cyclomatic 19): configurable_model._build_overrides 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":"libs/code/deepagents_code/configurable_model.py"},"region":{"startLine":379}}}],"partialFingerprints":{"codehealthFindingId/v1":"3465e9b281048c6446183cc434cf56cdb9f420286285de0fcda2f440432d1421"}},{"ruleId":"D1","level":"warning","message":{"text":"resolver._merge (cyclomatic 19): resolver._merge 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":"libs/code/deepagents_code/configuration/resolver.py"},"region":{"startLine":1113}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d9ad670ad5da33e902e9b1463f5ee20c1a56d04a6c478d635b03a8b1f6e63a3"}},{"ruleId":"D1","level":"warning","message":{"text":"_ExpiryAwareOAuthClientProvider.async_auth_flow (cyclomatic 19): _ExpiryAwareOAuthClientProvider.async_auth_flow 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":"libs/code/deepagents_code/mcp_auth.py"},"region":{"startLine":1648}}}],"partialFingerprints":{"codehealthFindingId/v1":"46237adbcdacaf7a1b21aada050bd3680f5fba60a17cbb5fa38f45e3381b6cce"}},{"ruleId":"D1","level":"warning","message":{"text":"marketplace.parse_marketplace_source (cyclomatic 19): marketplace.parse_marketplace_source 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":"libs/code/deepagents_code/plugins/marketplace.py"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"25804960395950681a3aa7fad7de2254d46d498781dd9d41b4414fe4b560d188"}},{"ruleId":"D1","level":"warning","message":{"text":"textual_adapter._handle_interrupt_cleanup (cyclomatic 19): textual_adapter._handle_interrupt_cleanup 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":"libs/code/deepagents_code/tui/textual_adapter.py"},"region":{"startLine":4468}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bb2a809f24afcc1f639882305bbec46fe106bb89ba60268134938a478e10620"}},{"ruleId":"D1","level":"warning","message":{"text":"whatsapp._parse_message (cyclomatic 19): whatsapp._parse_message has cyclomatic complexity 19 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/channels/whatsapp.py"},"region":{"startLine":839}}}],"partialFingerprints":{"codehealthFindingId/v1":"406116101ebad19acd312f5a10a870c6c043dc2c1a57f51a7942efc3604fb03b"}},{"ruleId":"D1","level":"warning","message":{"text":"id_compat.installMessageKeyCompatibility (cyclomatic 19): id_compat.installMessageKeyCompatibility 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":"libs/talon/deepagents_talon/channels/whatsapp_bridge/id_compat.js"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"224110da924197cd3084e53bc3424e6840beb22626fe76261ad7964978ee39e3"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._start_server_background (cyclomatic 18): DeepAgentsApp._start_server_background 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":6305}}}],"partialFingerprints":{"codehealthFindingId/v1":"60b8577ff49c944e9b4ed4741f4b1cac7f9a0ce36236cd585a7c7c822f94d890"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._handle_version_command (cyclomatic 18): DeepAgentsApp._handle_version_command 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":8631}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4db5aa99cf334cd34ba72d32fc849f4e3d4999f7059c4ccdf386ea285756169"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._generate_thread_name (cyclomatic 18): DeepAgentsApp._generate_thread_name 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":19297}}}],"partialFingerprints":{"codehealthFindingId/v1":"d473c258e09f79e1a2b6acdd7dd7e9c1c3f7b10add30af8ded90072f62f027a8"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._confirm_then_resume_owned_cross_agent_thread (cyclomatic 18): DeepAgentsApp._confirm_then_resume_owned_cross_agent_thread 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":30176}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa486296194c0d80f4293be56453077eb4519fc29748a8366e9910db9079678a"}},{"ruleId":"D1","level":"warning","message":{"text":"app._extract_model_params_flag (cyclomatic 18): app._extract_model_params_flag 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":1949}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a2595c41713024d98b08dba2c25c039c82d8bfef220038b621160d5c970885b"}},{"ruleId":"D1","level":"warning","message":{"text":"_SessionCostRecorder._start (cyclomatic 18): _SessionCostRecorder._start 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":"libs/code/deepagents_code/cost_tracking.py"},"region":{"startLine":2209}}}],"partialFingerprints":{"codehealthFindingId/v1":"37e639b024aafe0f516386733574de059b5396a0eb87c88ab12b0bc4b3c3aaf5"}},{"ruleId":"D1","level":"warning","message":{"text":"SandboxConfig.load (cyclomatic 18): SandboxConfig.load 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":"libs/code/deepagents_code/integrations/sandbox_config.py"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cfc2e200895abef2f5ed26b30e7f4a639ae15c6f2a8557a3e19fdafa73cf11a"}},{"ruleId":"D1","level":"warning","message":{"text":"main.build_version_text (cyclomatic 18): main.build_version_text 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":"libs/code/deepagents_code/main.py"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2864f20ccc6df78317b9832ed7a6e35a32827a3b9f6be930d27975daaa527ed"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelConfig._validate (cyclomatic 18): ModelConfig._validate 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":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":3585}}}],"partialFingerprints":{"codehealthFindingId/v1":"f31dbedcd8e19b2397374598df3dc75cdd23cde5c324616a742f3e4608d7487b"}},{"ruleId":"D1","level":"warning","message":{"text":"model_config.get_provider_auth_status (cyclomatic 18): model_config.get_provider_auth_status 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":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":2642}}}],"partialFingerprints":{"codehealthFindingId/v1":"af9771e484b2deb008fbb2449372d8a45ca63282655b4265f3db33ba89e6d160"}},{"ruleId":"D1","level":"warning","message":{"text":"model_config.add_enabled_project_mcp_servers (cyclomatic 18): model_config.add_enabled_project_mcp_servers 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":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":5942}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ecf0e3a066d5e9f4b430c596b3e5d8a2dc91e18423007e0372d365d5d1b7827"}},{"ruleId":"D1","level":"warning","message":{"text":"marketplace._parse_plugin_source (cyclomatic 18): marketplace._parse_plugin_source 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":"libs/code/deepagents_code/plugins/marketplace.py"},"region":{"startLine":686}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1e3053f5d444f5657fe553bca9d527f5f64f9c2267a4ae3a69ff205de603631"}},{"ruleId":"D1","level":"warning","message":{"text":"_Visitor.__init__ (cyclomatic 18): _Visitor.__init__ 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":"libs/code/scripts/check_process_cwd.py"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"262f092f4fd98b108fe1b10aa36d0458267095eb4b2e00f01f52056861616705"}},{"ruleId":"D1","level":"warning","message":{"text":"_messages_reducer._messages_delta_reducer (cyclomatic 18): _messages_reducer._messages_delta_reducer 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":"libs/deepagents/deepagents/_messages_reducer.py"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"9aa99ba5675c158c5d26ab2c82b10312803ca66065fa5829dc3b29d0c23132b4"}},{"ruleId":"D1","level":"warning","message":{"text":"main.main (cyclomatic 18): main.main 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":"libs/evals/harbor_adapters/drbench/main.py"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ab6f8843a79af21b320fa1a318c91ed6f91d240817949e6b23e561cc63551e3"}},{"ruleId":"D1","level":"warning","message":{"text":"extract_text._from_jsonl (cyclomatic 18): extract_text._from_jsonl 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":"libs/evals/harbor_adapters/drbench/templates/extract_text.py"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"375fc45666b189439337760503793f7db0dd3be6dab058f72d9bd12e51df92ad"}},{"ruleId":"D1","level":"warning","message":{"text":"CronJobStore.edit_job (cyclomatic 18): CronJobStore.edit_job 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":"libs/talon/deepagents_talon/cron/jobs.py"},"region":{"startLine":977}}}],"partialFingerprints":{"codehealthFindingId/v1":"60c714168dfd6333fec380a30985dadd63e026926ef128790443d0fbedc03a76"}},{"ruleId":"D1","level":"warning","message":{"text":"StoreConversationArchive.text_entries (cyclomatic 18): StoreConversationArchive.text_entries 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":"libs/talon/deepagents_talon/store_archive.py"},"region":{"startLine":389}}}],"partialFingerprints":{"codehealthFindingId/v1":"1969f16a1ee0fffbfc376096d8cd10a9dad9a93571dd1f7b9a8f91bb377692dc"}},{"ruleId":"D1","level":"warning","message":{"text":"aggregate_shards.render_step_summary (cyclomatic 18): aggregate_shards.render_step_summary 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":".github/scripts/evals/aggregate_shards.py"},"region":{"startLine":549}}}],"partialFingerprints":{"codehealthFindingId/v1":"be09c7a7bbc85b8498e31717535a57a988197cf77f307ade7c49f7aebc6dd6eb"}},{"ruleId":"D1","level":"warning","message":{"text":"agent._rubric_grader_repo_call_count (cyclomatic 17): agent._rubric_grader_repo_call_count 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":"libs/code/deepagents_code/agent.py"},"region":{"startLine":459}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f482bb5dd9dfc815b4dc4ca4b47b97cfa18d4acc90b131cd6dc6ecda5bf57ea"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._finish_pending_goal_rubric_review (cyclomatic 17): DeepAgentsApp._finish_pending_goal_rubric_review 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":16403}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7e6c87974acb82564e8344c4744928eff5c90a494deeb29fc148c24737f398c"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._prune_messages_unlocked (cyclomatic 17): DeepAgentsApp._prune_messages_unlocked 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":21778}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4914171dfb16c02c91b44b8f15c4f9941a951b7d41320473ff2431917724f3a"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp.action_toggle_auto_approve (cyclomatic 17): DeepAgentsApp.action_toggle_auto_approve 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":23668}}}],"partialFingerprints":{"codehealthFindingId/v1":"d89c891d67d2b33c81da46a31934e01679193a83077b53aea5635446def479f0"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._retry_startup_with_model (cyclomatic 17): DeepAgentsApp._retry_startup_with_model 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":32098}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b6f41435d635ccb97b9b7aaa8d2e947540611038491d8cc8c31672188effd3f"}},{"ruleId":"D1","level":"warning","message":{"text":"BtwOperation._resolve_context (cyclomatic 17): BtwOperation._resolve_context 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":"libs/code/deepagents_code/btw.py"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"761ce2fe8ae0e698654df03459943032c369e352b61656f275a6277a078b5ce2"}},{"ruleId":"D1","level":"warning","message":{"text":"inspect_sessions.main (cyclomatic 17): inspect_sessions.main 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":"libs/code/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py"},"region":{"startLine":616}}}],"partialFingerprints":{"codehealthFindingId/v1":"6268715d7faa398ef8e6a47140bb240fbd45ad2cae02d00be5506c699e04f71b"}},{"ruleId":"D1","level":"warning","message":{"text":"auth._run_set (cyclomatic 17): auth._run_set 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":"libs/code/deepagents_code/client/commands/auth.py"},"region":{"startLine":372}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff38049c49065a851134346e8debbf3f4ce9cce7bece6e7a80a085f8ebd279c1"}},{"ruleId":"D1","level":"warning","message":{"text":"config._dotenv_environment (cyclomatic 17): config._dotenv_environment 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":"libs/code/deepagents_code/config.py"},"region":{"startLine":634}}}],"partialFingerprints":{"codehealthFindingId/v1":"affa93dbe2d7a03f86b51839fac118096033fa8a6f5583e3fd74aabaf302782c"}},{"ruleId":"D1","level":"warning","message":{"text":"config._get_provider_kwargs (cyclomatic 17): config._get_provider_kwargs 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":"libs/code/deepagents_code/config.py"},"region":{"startLine":5953}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d2d56469a52574667c73becba339abc1704fb48d04b99a89d0c73d186410894"}},{"ruleId":"D1","level":"warning","message":{"text":"config_manifest._emit_ranked_diagnostics (cyclomatic 17): config_manifest._emit_ranked_diagnostics 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":"libs/code/deepagents_code/config_manifest.py"},"region":{"startLine":1209}}}],"partialFingerprints":{"codehealthFindingId/v1":"63b81bb5d53b77fbb0e8ed7d80774acb854ab21becfd28c8d0e858bf09221ad7"}},{"ruleId":"D1","level":"warning","message":{"text":"main._ripgrep_install_hint (cyclomatic 17): main._ripgrep_install_hint 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":"libs/code/deepagents_code/main.py"},"region":{"startLine":1790}}}],"partialFingerprints":{"codehealthFindingId/v1":"c15afded2b95dfc376649b7eb5fe7a65bcc5c29b8c22441c47dbfe3309badbb8"}},{"ruleId":"D1","level":"warning","message":{"text":"main._run_acp_cli_async (cyclomatic 17): main._run_acp_cli_async has cyclomatic complexity 17 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":3515}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff5c13c58734a572c8fde579489e563a6bf1a4f59eb7af13c5345f0536ab4400"}},{"ruleId":"D1","level":"warning","message":{"text":"main._select_trust_action (cyclomatic 17): main._select_trust_action 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":"libs/code/deepagents_code/main.py"},"region":{"startLine":4274}}}],"partialFingerprints":{"codehealthFindingId/v1":"45aa49a722fedbc31289dbff8087ed9a7bac57b1709375f1037ee8dd3275b552"}},{"ruleId":"D1","level":"warning","message":{"text":"model_catalog.load_model_catalog (cyclomatic 17): model_catalog.load_model_catalog 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":"libs/code/deepagents_code/model_catalog.py"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d35231ff23d68bd070d6069edd9b5c52be0fd80e45d16eefb4a142bc04e18bb"}},{"ruleId":"D1","level":"warning","message":{"text":"CLICompactionMiddleware._summarization_for_runtime (cyclomatic 17): CLICompactionMiddleware._summarization_for_runtime 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":"libs/code/deepagents_code/offload_middleware.py"},"region":{"startLine":1330}}}],"partialFingerprints":{"codehealthFindingId/v1":"386a55e3ecad3ee68acbc361bf9abe0f96a3dbacdcc2edfba5f864ab091f1258"}},{"ruleId":"D1","level":"warning","message":{"text":"server_graph._make_graphs_in_environment (cyclomatic 17): server_graph._make_graphs_in_environment 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":"libs/code/deepagents_code/server_graph.py"},"region":{"startLine":416}}}],"partialFingerprints":{"codehealthFindingId/v1":"3397e1cd48e9d5cae3ccb0c96f969f1efef394a962994ddebd02e6ebc2d83d5e"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelSelectorScreen._format_option_label (cyclomatic 17): ModelSelectorScreen._format_option_label 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":"libs/code/deepagents_code/tui/widgets/model_selector.py"},"region":{"startLine":1676}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a0830cd6a6f4614b4226dc4e05b64cc277ff0cab71361ce9031259df5009829"}},{"ruleId":"D1","level":"warning","message":{"text":"thread_selector._format_column_value (cyclomatic 17): thread_selector._format_column_value 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":"libs/code/deepagents_code/tui/widgets/thread_selector.py"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"94ab6c8b926bd70c73845bd3150c77795e38da9d34155ce0ffd0ad5e9ef2d3b7"}},{"ruleId":"D1","level":"warning","message":{"text":"CompositeBackend.grep (cyclomatic 17): CompositeBackend.grep has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top. This shape REPEATS in the file: one other method here (CompositeBackend.agrep) 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":"libs/deepagents/deepagents/backends/composite.py"},"region":{"startLine":459}}}],"partialFingerprints":{"codehealthFindingId/v1":"074cb78779f8f63067ae29280eef2bc44ee7582da696aa363a66136297f5c32b"}},{"ruleId":"D1","level":"warning","message":{"text":"CompositeBackend.agrep (cyclomatic 17): CompositeBackend.agrep has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top. This shape REPEATS in the file: one other method here (CompositeBackend.grep) 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":"libs/deepagents/deepagents/backends/composite.py"},"region":{"startLine":551}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cb1cb929f7fa78fcfbe210a3940a9edc4e52ff6751884bd1b3c4e6dbfe8a4a5"}},{"ruleId":"D1","level":"warning","message":{"text":"ReadResult.__post_init__ (cyclomatic 17): ReadResult.__post_init__ 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":"libs/deepagents/deepagents/backends/protocol.py"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8ed915495d3adc34b455d5fb33b84ed34781e54595f77956ea575b1596eacea"}},{"ruleId":"D1","level":"warning","message":{"text":"cli._cmd_list (cyclomatic 17): cli._cmd_list 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":"libs/evals/deepagents_evals/cli.py"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"a007241dc5d3698842ffb3d77dbc5bf501fcc4603fc7d0ea6c1d7d42cd229759"}},{"ruleId":"D1","level":"warning","message":{"text":"_SlackSdkGateway.thread_context (cyclomatic 17): _SlackSdkGateway.thread_context 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":"libs/talon/deepagents_talon/channels/slack.py"},"region":{"startLine":527}}}],"partialFingerprints":{"codehealthFindingId/v1":"9064193ea5b64bfdbc2b1eeec089495bea71df44bb5f22919b51cd32f53acf42"}},{"ruleId":"D1","level":"warning","message":{"text":"mcp._remote_connection (cyclomatic 17): mcp._remote_connection has cyclomatic complexity 17 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/mcp.py"},"region":{"startLine":828}}}],"partialFingerprints":{"codehealthFindingId/v1":"cee999e49b64ede8e0e5839f7e0dd9aded4ecfe391a6dd034874798ae580bf58"}},{"ruleId":"D1","level":"warning","message":{"text":"check_release_deps._affected_extras (cyclomatic 17): check_release_deps._affected_extras 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":".github/scripts/release/check_release_deps.py"},"region":{"startLine":448}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e2ab9cabbd8d8aea7d55307cd8f3e6c32952e20a959e4c4452aea8416386b35"}},{"ruleId":"D1","level":"warning","message":{"text":"_dep_floor_check._find_floor_violations (cyclomatic 16): _dep_floor_check._find_floor_violations 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":"libs/code/deepagents_code/_dep_floor_check.py"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba3043e7de3b88ca7a6160c85ef5ea49fba9d33dfc9295dc6f530da880ef923e"}},{"ruleId":"D1","level":"warning","message":{"text":"_git.find_git_common_dir (cyclomatic 16): _git.find_git_common_dir 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":"libs/code/deepagents_code/_git.py"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"609c82f3387b7056fc17df5fb1e48e3c9d37af987b8b1a4b5fe525d9fbb1af4d"}},{"ruleId":"D1","level":"warning","message":{"text":"ServerConfig.__post_init__ (cyclomatic 16): ServerConfig.__post_init__ 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":"libs/code/deepagents_code/_server_config.py"},"region":{"startLine":748}}}],"partialFingerprints":{"codehealthFindingId/v1":"165f6289a67549e390e86ab8431dfef3a1f3f649ff921dd78f37a3be914f1e6c"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._request_approval (cyclomatic 16): DeepAgentsApp._request_approval 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":11015}}}],"partialFingerprints":{"codehealthFindingId/v1":"04e6a6b29cfdb4b02edc57bcf236f371a0fd001296d0c0c25194fbcc460e1448"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._handle_rubric_command (cyclomatic 16): DeepAgentsApp._handle_rubric_command 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":16932}}}],"partialFingerprints":{"codehealthFindingId/v1":"141c9937431c768a14ae40598c3db736e8d150dae238187534764c7ac1306723"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._set_rubric_max_iterations (cyclomatic 16): DeepAgentsApp._set_rubric_max_iterations 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":17281}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5f7308e24bc446828b8be3430e0d0e49fe19407ae01057f71ef67b5a57426d1"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._move_transcript_window_to_tail (cyclomatic 16): DeepAgentsApp._move_transcript_window_to_tail 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":21688}}}],"partialFingerprints":{"codehealthFindingId/v1":"82bea71aa106e8381c72dba8289a6caf6b32f5c531bf521ab12ad6a912aa8964"}},{"ruleId":"D1","level":"warning","message":{"text":"DeepAgentsApp._replace_server_after_cwd_switch (cyclomatic 16): DeepAgentsApp._replace_server_after_cwd_switch 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":30710}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1ce7c8dff6e744abe12738ef3a0c1d157b81ab40fe1ba1c0c76552cdfa8ac1c"}},{"ruleId":"D1","level":"warning","message":{"text":"auto_mode._ask_user_exchange_rows (cyclomatic 16): auto_mode._ask_user_exchange_rows 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":"libs/code/deepagents_code/auto_mode.py"},"region":{"startLine":1463}}}],"partialFingerprints":{"codehealthFindingId/v1":"677aba34e184ef7a76ea65c4bb0fb2c8b3fabffa5f41d995f7ca90c561db0bc5"}},{"ruleId":"D1","level":"warning","message":{"text":"server._terminate_server_process (cyclomatic 16): server._terminate_server_process 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":"libs/code/deepagents_code/client/launch/server.py"},"region":{"startLine":603}}}],"partialFingerprints":{"codehealthFindingId/v1":"b61ea2c6f4df29f08007f4fda390d28332cc1f558f6097146ca5e0afcd4578e5"}},{"ruleId":"D1","level":"warning","message":{"text":"config.detect_provider (cyclomatic 16): config.detect_provider 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":"libs/code/deepagents_code/config.py"},"region":{"startLine":5575}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a4a40e6c036deba8f7099429e244ea4c3b1c032f8e1844f3eec88f18386d724"}},{"ruleId":"D1","level":"warning","message":{"text":"cost_tracking._read_override_source (cyclomatic 16): cost_tracking._read_override_source 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":"libs/code/deepagents_code/cost_tracking.py"},"region":{"startLine":1020}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a481e64ee3d8c5ce4f22d6b6b5ca20b744a143477f712f68885f8302ecc639d"}},{"ruleId":"D1","level":"warning","message":{"text":"model_config.load_thread_config (cyclomatic 16): model_config.load_thread_config 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":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":6165}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddbf2d7b8507199145b7c2d02474866b768692cc211f4912d8c62cc80dde1c08"}},{"ruleId":"D1","level":"warning","message":{"text":"manifest.load_manifest (cyclomatic 16): manifest.load_manifest 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":"libs/code/deepagents_code/plugins/manifest.py"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"95db564f8b34b4512d92fff6751fbe550e6bfa12ff61c110041de16fdf8a4454"}},{"ruleId":"D1","level":"warning","message":{"text":"store.cache_and_register_plugin (cyclomatic 16): store.cache_and_register_plugin 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":"libs/code/deepagents_code/plugins/store.py"},"region":{"startLine":485}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d556c4b537a6135a18b7423878be9c0bbc46ff0a1abfd07024561d099d6c6f6"}},{"ruleId":"D1","level":"warning","message":{"text":"subagents._parse_subagent_file (cyclomatic 16): subagents._parse_subagent_file has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/subagents.py"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"df08fd0680ff3b18e91ed06850e2c23359947d9dd79f95f953e8d08ad3ac90ca"}},{"ruleId":"D1","level":"warning","message":{"text":"PluginManagerScreen._current_options (cyclomatic 16): PluginManagerScreen._current_options 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":"libs/code/deepagents_code/tui/modals/plugin_manager/__init__.py"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"834a753516ecf1a9e8b73747f5da1ded022942f800ba0a5ded9ffa3e36d93caa"}},{"ruleId":"D1","level":"warning","message":{"text":"diff._compose_diff_content (cyclomatic 16): diff._compose_diff_content has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/diff.py"},"region":{"startLine":817}}}],"partialFingerprints":{"codehealthFindingId/v1":"b68c82023f391f4f95533876b83491f4a9a9d766b95bffb941163e659123a691"}},{"ruleId":"D1","level":"warning","message":{"text":"ToolCallMessage._restore_deferred_state (cyclomatic 16): ToolCallMessage._restore_deferred_state 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":"libs/code/deepagents_code/tui/widgets/messages.py"},"region":{"startLine":2172}}}],"partialFingerprints":{"codehealthFindingId/v1":"04ad0ff59ae3129ae1436ba18610c60898783a48032152d17b45a6eb1be2ff45"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelSelectorScreen._set_default (cyclomatic 16): ModelSelectorScreen._set_default 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":"libs/code/deepagents_code/tui/widgets/model_selector.py"},"region":{"startLine":2297}}}],"partialFingerprints":{"codehealthFindingId/v1":"0067487bd4c98996aa8d91efac1ee5b80614a8506bc2549d1002a2b17fc55d44"}},{"ruleId":"D1","level":"warning","message":{"text":"_skill_tools._find_skill_reads (cyclomatic 16): _skill_tools._find_skill_reads 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":"libs/deepagents/deepagents/middleware/_skill_tools.py"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"300c3f6c909f21d26b285181aa16acd9b60adc46d6951086fd261a0edd52e011"}},{"ruleId":"D1","level":"warning","message":{"text":"analyze.write_trial_analysis (cyclomatic 16): analyze.write_trial_analysis 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":"libs/evals/scripts/analyze.py"},"region":{"startLine":683}}}],"partialFingerprints":{"codehealthFindingId/v1":"b990b0681a89924cbc37c347a4dd817642767cfc3e30cd9eb9258d98085d1ba2"}},{"ruleId":"D1","level":"warning","message":{"text":"analyze.main (cyclomatic 16): analyze.main 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":"libs/evals/scripts/analyze.py"},"region":{"startLine":779}}}],"partialFingerprints":{"codehealthFindingId/v1":"6687805a593498816af90721dbd648e221c1cff8d71a32cafe92b43e44fea87e"}},{"ruleId":"D1","level":"warning","message":{"text":"build_release_notes._latest_earlier_prerelease_tag (cyclomatic 16): build_release_notes._latest_earlier_prerelease_tag 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":".github/scripts/release/build_release_notes.py"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"fff59489d5bbe143cae8823b7f4388bca86f695c83fb7939d47ce089e93ba63b"}},{"ruleId":"D2","level":"warning","message":{"text":"textual_adapter.execute_task_textual (cognitive 1506): textual_adapter.execute_task_textual has cognitive complexity 1506 (threshold 15). Drivers by points: if/else 212 (942 pts), error handling 45 (211 pts), loops 31 (144 pts), ternaries 27 (131 pts), boolean chains 78 (nesting depth added 1113). 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":"libs/code/deepagents_code/tui/textual_adapter.py"},"region":{"startLine":1797}}}],"partialFingerprints":{"codehealthFindingId/v1":"f49c9ccb8d5531ddb8fbd52749c6b12afff57f83cdaeb6bde4ce63f5619c505f"}},{"ruleId":"D2","level":"warning","message":{"text":"main.cli_main (cognitive 304): main.cli_main has cognitive complexity 304 (threshold 15). Drivers by points: if/else 115 (192 pts), boolean chains 44, error handling 21 (42 pts), ternaries 11 (24 pts), loops 1 (2 pts) (nesting depth added 112). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":5335}}}],"partialFingerprints":{"codehealthFindingId/v1":"137d879ef9c007632b15004a33b0d62f9312490a72ca2e149ac046e568770261"}},{"ruleId":"D2","level":"warning","message":{"text":"agent.create_cli_agent (cognitive 156): agent.create_cli_agent has cognitive complexity 156 (threshold 15). Drivers by points: if/else 64 (89 pts), ternaries 19 (33 pts), boolean chains 30, loops 3 (4 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":"libs/code/deepagents_code/agent.py"},"region":{"startLine":2524}}}],"partialFingerprints":{"codehealthFindingId/v1":"c145452430ef42529faebf4671e538c72892f9e93c147af6a3107e7485543fc5"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._handle_command (cognitive 152): DeepAgentsApp._handle_command has cognitive complexity 152 (threshold 15). Drivers by points: if/else 37 (76 pts), ternaries 14 (36 pts), boolean chains 24, error handling 5 (14 pts), loops 1 (2 pts) (nesting depth added 71). 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":17494}}}],"partialFingerprints":{"codehealthFindingId/v1":"f99b70e281db727a3b5432fdf5079ab422851ec60d0980a591304997a47f2037"}},{"ruleId":"D2","level":"warning","message":{"text":"graph.create_deep_agent (cognitive 106): graph.create_deep_agent has cognitive complexity 106 (threshold 15). Drivers by points: if/else 39 (70 pts), ternaries 9 (20 pts), boolean chains 14, loops 2 (nesting depth added 42). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/graph.py"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd77c291721df02e972d84788d5f3bd601be83eb15ef8762406ad8d6dc66e04e"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._convert_messages_to_data (cognitive 103): DeepAgentsApp._convert_messages_to_data has cognitive complexity 103 (threshold 15). Drivers by points: if/else 25 (68 pts), ternaries 4 (15 pts), loops 6 (13 pts), boolean chains 7 (nesting depth added 61). 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":20452}}}],"partialFingerprints":{"codehealthFindingId/v1":"0686e24ae62bc22d8813a71606269f0eaabf0ef5b553c975194ceb43df41bacd"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentServerACP._handle_interrupts (cognitive 98): AgentServerACP._handle_interrupts has cognitive complexity 98 (threshold 15). Drivers by points: if/else 16 (59 pts), ternaries 4 (18 pts), boolean chains 11, loops 3 (10 pts) (nesting depth added 64). 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":"libs/acp/deepagents_acp/server.py"},"region":{"startLine":1165}}}],"partialFingerprints":{"codehealthFindingId/v1":"60fdea2a7f4351037f739bbfb57abd9f553dc71373cc2290d01186de860a8dee"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentServerACP.prompt (cognitive 93): AgentServerACP.prompt has cognitive complexity 93 (threshold 15). Drivers by points: if/else 20 (65 pts), loops 6 (18 pts), boolean chains 8, ternaries 1 (2 pts) (nesting depth added 58). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/acp/deepagents_acp/server.py"},"region":{"startLine":948}}}],"partialFingerprints":{"codehealthFindingId/v1":"e629f1dc42c44e40ba63cd976f5b5cd46367627a0e86fa03fc899d7fe6a46473"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._run_agent_task (cognitive 84): DeepAgentsApp._run_agent_task has cognitive complexity 84 (threshold 15). Drivers by points: if/else 28 (46 pts), boolean chains 21, error handling 7 (12 pts), ternaries 3 (5 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":19801}}}],"partialFingerprints":{"codehealthFindingId/v1":"add500b8503b94da8839e814f318f2e30fcf16b428ee64e94d10620b385e1a00"}},{"ruleId":"D2","level":"warning","message":{"text":"mcp_tools.resolve_and_load_mcp_tools (cognitive 80): mcp_tools.resolve_and_load_mcp_tools has cognitive complexity 80 (threshold 15). Drivers by points: if/else 26 (50 pts), loops 7 (12 pts), ternaries 3 (7 pts), error handling 4 (6 pts), boolean chains 5 (nesting depth added 35). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/mcp_tools.py"},"region":{"startLine":2565}}}],"partialFingerprints":{"codehealthFindingId/v1":"a78b56364e9b781a208bd5be3b5949f321895b40888d65e3ecc5bf123d1c3882"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelSelectorScreen._update_display (cognitive 77): ModelSelectorScreen._update_display has cognitive complexity 77 (threshold 15). Drivers by points: if/else 25 (44 pts), ternaries 6 (19 pts), boolean chains 7, loops 5 (7 pts) (nesting depth added 34). 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":"libs/code/deepagents_code/tui/widgets/model_selector.py"},"region":{"startLine":1310}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c3a86bd774dbe643c7657bbc2b8ea2098041f7842f996aa4f5bdc1e993d71aa"}},{"ruleId":"D2","level":"warning","message":{"text":"model_config._discover_available_models (cognitive 74): model_config._discover_available_models has cognitive complexity 74 (threshold 15). Drivers by points: if/else 21 (49 pts), error handling 4 (12 pts), loops 4 (8 pts), boolean chains 5 (nesting depth added 40). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":1562}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ab9817f0822f3e82d3731e9b9e8c800f5d5ef18385e4054072511fb8eeae42a"}},{"ruleId":"D2","level":"warning","message":{"text":"non_interactive._process_stream_chunk (cognitive 73): non_interactive._process_stream_chunk has cognitive complexity 73 (threshold 15). Drivers by points: if/else 20 (47 pts), ternaries 5 (15 pts), boolean chains 11 (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":"libs/code/deepagents_code/client/non_interactive.py"},"region":{"startLine":1551}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bfd17612b612eecd0aa53d6065e2aeae050cbee0ebc08d9bacba88027bb72bd"}},{"ruleId":"D2","level":"warning","message":{"text":"config.create_model (cognitive 72): config.create_model has cognitive complexity 72 (threshold 15). Drivers by points: if/else 29 (39 pts), boolean chains 12, error handling 6 (11 pts), ternaries 5 (9 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":"libs/code/deepagents_code/config.py"},"region":{"startLine":6767}}}],"partialFingerprints":{"codehealthFindingId/v1":"2310aeeb816d01fbd368e3980b5331bc3868a498ebf913910e6032e2f117bb39"}},{"ruleId":"D2","level":"warning","message":{"text":"AutoModeHITLMiddleware.awrap_model_call (cognitive 68): AutoModeHITLMiddleware.awrap_model_call has cognitive complexity 68 (threshold 15). Drivers by points: if/else 26 (39 pts), loops 7 (12 pts), boolean chains 10, ternaries 3 (5 pts), error handling 2 (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":"libs/code/deepagents_code/auto_mode.py"},"region":{"startLine":3215}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed2afef625ba480c2417e8fdc22264cf17df883f630e4b6828cde68bedc5a8f9"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._restart_server_for_owned_agent_swap (cognitive 67): DeepAgentsApp._restart_server_for_owned_agent_swap has cognitive complexity 67 (threshold 15). Drivers by points: if/else 28 (36 pts), error handling 10 (16 pts), boolean chains 8, ternaries 5 (6 pts), loops 1 (nesting depth added 15). 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":25897}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c652e71e0bbbba49506eb388e54be679088f6f23b115ee3581cf2457a171561"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._run_reload_unlocked (cognitive 65): DeepAgentsApp._run_reload_unlocked has cognitive complexity 65 (threshold 15). Drivers by points: if/else 28 (40 pts), ternaries 6 (11 pts), error handling 5 (6 pts), boolean chains 4, loops 2 (4 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":18236}}}],"partialFingerprints":{"codehealthFindingId/v1":"593291d7de7c3fb2d3e4aad31cbcc72b93b98a3544add7ef0d48c59ee89881e3"}},{"ruleId":"D2","level":"warning","message":{"text":"non_interactive._process_ai_message (cognitive 64): non_interactive._process_ai_message has cognitive complexity 64 (threshold 15). Drivers by points: if/else 16 (57 pts), boolean chains 6, loops 1 (nesting depth added 41). 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":"libs/code/deepagents_code/client/non_interactive.py"},"region":{"startLine":781}}}],"partialFingerprints":{"codehealthFindingId/v1":"260d2e9eb90e7aaf481ebd56db18a88dedc2821880c783d34ccb8f0207eff176"}},{"ruleId":"D2","level":"warning","message":{"text":"analyze.print_summary (cognitive 63): analyze.print_summary has cognitive complexity 63 (threshold 15). Drivers by points: if/else 23 (38 pts), loops 6 (11 pts), ternaries 3 (9 pts), error handling 1 (3 pts), boolean chains 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":"libs/evals/scripts/analyze.py"},"region":{"startLine":385}}}],"partialFingerprints":{"codehealthFindingId/v1":"55fa387332dd458e29083661d69ec1443c780e8fc7d845a9b3af71a5c84028a7"}},{"ruleId":"D2","level":"warning","message":{"text":"non_interactive._run_agent_loop (cognitive 62): non_interactive._run_agent_loop has cognitive complexity 62 (threshold 15). Drivers by points: if/else 23 (31 pts), boolean chains 13, ternaries 7 (9 pts), error handling 6, loops 2 (3 pts) (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/client/non_interactive.py"},"region":{"startLine":2121}}}],"partialFingerprints":{"codehealthFindingId/v1":"dca87b4433a5e1f80c24d777ccae02c0ec2ad926c56b9e01425570b9192064a2"}},{"ruleId":"D2","level":"warning","message":{"text":"AutoModeHITLMiddleware.aafter_model (cognitive 60): AutoModeHITLMiddleware.aafter_model has cognitive complexity 60 (threshold 15). Drivers by points: if/else 25 (32 pts), ternaries 8 (15 pts), boolean chains 12, 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":"libs/code/deepagents_code/auto_mode.py"},"region":{"startLine":4096}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3137fdfdd2b637005a1d503cc239bc6950c28af44243c74fdc5f894bb6f0480"}},{"ruleId":"D2","level":"warning","message":{"text":"mcp_login_service.resolve_mcp_config (cognitive 60): mcp_login_service.resolve_mcp_config has cognitive complexity 60 (threshold 15). Drivers by points: if/else 18 (43 pts), loops 5 (12 pts), boolean chains 3, error handling 1 (2 pts) (nesting depth added 33). 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":"libs/code/deepagents_code/mcp_login_service.py"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3e00cd7cdc1c7ad8333493a3b99db3a7e867712279557addfa6fc71c11eff74"}},{"ruleId":"D2","level":"warning","message":{"text":"model_config.get_model_profiles (cognitive 60): model_config.get_model_profiles has cognitive complexity 60 (threshold 15). Drivers by points: if/else 14 (26 pts), loops 6 (13 pts), error handling 4 (12 pts), boolean chains 5, ternaries 1 (4 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":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":1794}}}],"partialFingerprints":{"codehealthFindingId/v1":"08c247b08f3d350b86b2088b656fc32468bcf5fd411444e22643d1c1fa1e6ff5"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._sync_goal_rubric_state_from_thread (cognitive 56): DeepAgentsApp._sync_goal_rubric_state_from_thread has cognitive complexity 56 (threshold 15). Drivers by points: if/else 24 (40 pts), boolean chains 12, error handling 1 (2 pts), loops 1, 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":15520}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa49fb00ac47339e5a45f03222efdd3b59ffade043ef51654abfe4dd9b7be236"}},{"ruleId":"D2","level":"warning","message":{"text":"sessions.list_threads_command (cognitive 56): sessions.list_threads_command has cognitive complexity 56 (threshold 15). Drivers by points: if/else 22 (35 pts), ternaries 8 (15 pts), boolean chains 5, loops 1 (nesting depth added 20). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/sessions.py"},"region":{"startLine":2180}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbf19dd09f7060e35684af94ef914f9f10a391705e151e47c4da1cd359b19e18"}},{"ruleId":"D2","level":"warning","message":{"text":"CostTrackingMiddleware._charge (cognitive 55): CostTrackingMiddleware._charge has cognitive complexity 55 (threshold 15). Drivers by points: if/else 18 (30 pts), boolean chains 14, ternaries 5 (8 pts), loops 2, error handling 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/cost_tracking.py"},"region":{"startLine":3054}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba61003d659a4a5e2a276bc092bf884dbac90a0d1c7f18df6b28590607daa5b5"}},{"ruleId":"D2","level":"warning","message":{"text":"app._format_mcp_server_changes (cognitive 54): app._format_mcp_server_changes has cognitive complexity 54 (threshold 15). Drivers by points: if/else 32 (39 pts), boolean chains 11, loops 1 (2 pts), ternaries 1 (2 pts) (nesting depth added 9). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":859}}}],"partialFingerprints":{"codehealthFindingId/v1":"98c8d4e32cb6dd8e7987a44d348a1204c62a8b27ffaef610a0f24a6d9c579fa0"}},{"ruleId":"D2","level":"warning","message":{"text":"tool_display.format_tool_display (cognitive 54): tool_display.format_tool_display has cognitive complexity 54 (threshold 15). Drivers by points: if/else 19 (43 pts), ternaries 2 (6 pts), boolean chains 5 (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":"libs/code/deepagents_code/tool_display.py"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"23bc9dfd5f6a21cb20786a4b0f39931618250ddddd70a330bae59fa78f8a87c4"}},{"ruleId":"D2","level":"warning","message":{"text":"providers.coerce_toml_value (cognitive 53): providers.coerce_toml_value has cognitive complexity 53 (threshold 15). Drivers by points: if/else 17 (32 pts), boolean chains 9, error handling 4 (9 pts), ternaries 1 (3 pts) (nesting depth added 22). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/configuration/providers.py"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b9ff0ae5b2d97ed9e977d3d91f4130bc7c1cace91c51e988798733c0dff6396"}},{"ruleId":"D2","level":"warning","message":{"text":"bridge.handle (cognitive 53): bridge.handle has cognitive complexity 53 (threshold 15). Drivers by points: if/else 18 (28 pts), boolean chains 24, error handling 1 (nesting depth added 10). Of this number, 52 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":"libs/talon/deepagents_talon/channels/whatsapp_bridge/bridge.js"},"region":{"startLine":581}}}],"partialFingerprints":{"codehealthFindingId/v1":"02efc73b076de2bd9124b135f241c31a7b70c9e02d702b595bf6487d81beb7b8"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp.__init__ (cognitive 52): DeepAgentsApp.__init__ has cognitive complexity 52 (threshold 15). Drivers by points: boolean chains 23, if/else 18 (20 pts), ternaries 8 (9 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":3390}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fffc7ce1778e69cc401f134084ef19704c34e483b8f513335a730b130a348d2"}},{"ruleId":"D2","level":"warning","message":{"text":"FileOpTracker.complete_with_message (cognitive 52): FileOpTracker.complete_with_message has cognitive complexity 52 (threshold 15). Drivers by points: if/else 19 (37 pts), boolean chains 11, loops 1 (2 pts), ternaries 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":"libs/code/deepagents_code/file_ops.py"},"region":{"startLine":805}}}],"partialFingerprints":{"codehealthFindingId/v1":"488e8270e7a5c807300977bf53c7f37f0570778506a6aa29aa352390d2321110"}},{"ruleId":"D2","level":"warning","message":{"text":"build_release_notes.collect_contributors (cognitive 52): build_release_notes.collect_contributors has cognitive complexity 52 (threshold 15). Drivers by points: if/else 20 (35 pts), boolean chains 10, ternaries 3 (5 pts), loops 2 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/release/build_release_notes.py"},"region":{"startLine":981}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd1346003c9d6e25195f3bdd7d766b5eb927784f2640a0338192373910f49fa5"}},{"ruleId":"D2","level":"warning","message":{"text":"non_interactive.run_non_interactive (cognitive 50): non_interactive.run_non_interactive has cognitive complexity 50 (threshold 15). Drivers by points: if/else 16 (21 pts), error handling 10 (12 pts), boolean chains 9, ternaries 5 (8 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":"libs/code/deepagents_code/client/non_interactive.py"},"region":{"startLine":2795}}}],"partialFingerprints":{"codehealthFindingId/v1":"e36b75e93f2d4e4ba94a8c9e4452bac6c9e501edcd816dd38af089e95302dc9a"}},{"ruleId":"D2","level":"warning","message":{"text":"FilesystemBackend._python_search (cognitive 50): FilesystemBackend._python_search has cognitive complexity 50 (threshold 15). Drivers by points: if/else 12 (27 pts), error handling 7 (15 pts), boolean chains 3, loops 2 (3 pts), ternaries 2 (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":"libs/deepagents/deepagents/backends/filesystem.py"},"region":{"startLine":1167}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f3fc6e7f2c2eac8e60ffe7e6197e91614c39fea5a1f8b2182641c0aa29f6f0b"}},{"ruleId":"D2","level":"warning","message":{"text":"FilesystemBackend.ls (cognitive 49): FilesystemBackend.ls has cognitive complexity 49 (threshold 15). Drivers by points: error handling 10 (29 pts), if/else 9 (17 pts), boolean chains 1, loops 1, ternaries 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":"libs/deepagents/deepagents/backends/filesystem.py"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"acf566be8588e5486b9d6ccd8fec83131aa307c5119c8486695d490248f7fa4c"}},{"ruleId":"D2","level":"warning","message":{"text":"aggregate_unified_compare.compare (cognitive 49): aggregate_unified_compare.compare has cognitive complexity 49 (threshold 15). Drivers by points: if/else 10 (32 pts), loops 8 (14 pts), boolean chains 3 (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":".github/scripts/evals/aggregate_unified_compare.py"},"region":{"startLine":518}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f583fdd35831737ecde4fd963defb5b113779927f299135b636631605afd6e1"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._format_cost_summary (cognitive 46): DeepAgentsApp._format_cost_summary has cognitive complexity 46 (threshold 15). Drivers by points: if/else 16 (22 pts), boolean chains 10, ternaries 5 (10 pts), loops 2 (4 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":9260}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fce5481c7969ce1ac28ac839e102a9274cd7d93d263c09226e93c5caa958cfb"}},{"ruleId":"D2","level":"warning","message":{"text":"service.managed_policy_violations (cognitive 46): service.managed_policy_violations has cognitive complexity 46 (threshold 15). Drivers by points: if/else 12 (31 pts), boolean chains 8, loops 2 (5 pts), ternaries 1 (2 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":"libs/code/deepagents_code/configuration/service.py"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"be23d33d09f3d53caa2b3b74033d56a8bffef9158bef43a46de5c5d400536436"}},{"ruleId":"D2","level":"warning","message":{"text":"main._run_startup_auto_update (cognitive 46): main._run_startup_auto_update has cognitive complexity 46 (threshold 15). Drivers by points: if/else 19 (26 pts), ternaries 7 (11 pts), error handling 4 (6 pts), boolean chains 3 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":564}}}],"partialFingerprints":{"codehealthFindingId/v1":"e12281fad1d9f03df1ad035124fd7d1f88c136357f02bdb3f231378b7630525b"}},{"ruleId":"D2","level":"warning","message":{"text":"theme._load_user_themes (cognitive 46): theme._load_user_themes has cognitive complexity 46 (threshold 15). Drivers by points: if/else 17 (31 pts), error handling 3 (7 pts), loops 2 (3 pts), ternaries 2 (3 pts), boolean chains 2 (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":"libs/code/deepagents_code/theme.py"},"region":{"startLine":517}}}],"partialFingerprints":{"codehealthFindingId/v1":"f217495da9cbe0d5f586dea196da1d2722ac7a0f206e60f28a11944b3be4958b"}},{"ruleId":"D2","level":"warning","message":{"text":"FilesystemBackend.glob (cognitive 46): FilesystemBackend.glob has cognitive complexity 46 (threshold 15). Drivers by points: error handling 10 (22 pts), if/else 7 (12 pts), ternaries 5 (9 pts), boolean chains 2, loops 1 (nesting depth added 21). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/filesystem.py"},"region":{"startLine":1320}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fb6f05d0525cb7ad3b03795335aff73ce33a779f0fe0dd83a167a8a61b33815"}},{"ruleId":"D2","level":"warning","message":{"text":"generate_radar.main (cognitive 46): generate_radar.main has cognitive complexity 46 (threshold 15). Drivers by points: error handling 8 (18 pts), if/else 12 (18 pts), loops 3 (5 pts), boolean chains 3, ternaries 1 (2 pts) (nesting depth added 19). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/evals/scripts/generate_radar.py"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"e72b0cf0f606e4f61289278349c82914167f4954f52a7b6b2de9706b78fb44b9"}},{"ruleId":"D2","level":"warning","message":{"text":"providers.coerce_environment_value (cognitive 45): providers.coerce_environment_value has cognitive complexity 45 (threshold 15). Drivers by points: if/else 26 (35 pts), error handling 5 (10 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":"libs/code/deepagents_code/configuration/providers.py"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce4a8dcd73261f404f02e66efef314afbad0da194c3970da185641b417c097d7"}},{"ruleId":"D2","level":"warning","message":{"text":"commands_cli.execute_plugin_command (cognitive 45): commands_cli.execute_plugin_command has cognitive complexity 45 (threshold 15). Drivers by points: if/else 14 (22 pts), ternaries 4 (13 pts), error handling 3 (7 pts), loops 1 (3 pts) (nesting depth added 23). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/plugins/commands_cli.py"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"31f26643be15b97840089c41f7602766c5eddf46ac3bb7158c457ea50e4aaea4"}},{"ruleId":"D2","level":"warning","message":{"text":"WelcomeBanner._build_banner (cognitive 44): WelcomeBanner._build_banner has cognitive complexity 44 (threshold 15). Drivers by points: if/else 18 (21 pts), ternaries 10 (17 pts), boolean chains 4, loops 2 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/welcome.py"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"e373bd913f3eeb5b8d11ede54d9d4307661795a447eb9ba73f3a9da680b950c9"}},{"ruleId":"D2","level":"warning","message":{"text":"agent._resolve_ptc_option (cognitive 43): agent._resolve_ptc_option has cognitive complexity 43 (threshold 15). Drivers by points: if/else 16 (34 pts), loops 3 (7 pts), boolean chains 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":"libs/code/deepagents_code/agent.py"},"region":{"startLine":987}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9e472f2e4cdced5d048c874f46a7d458db119d838024e9666b861d3e4be220d"}},{"ruleId":"D2","level":"warning","message":{"text":"aggregate_evals.main (cognitive 43): aggregate_evals.main has cognitive complexity 43 (threshold 15). Drivers by points: if/else 15 (27 pts), loops 5 (11 pts), boolean chains 5 (nesting depth added 18). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/evals/aggregate_evals.py"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f8d074e94941d87d2648df96b319fc326a5e09a773fa6396db5b1197b92c047"}},{"ruleId":"D2","level":"warning","message":{"text":"unified_prep.main (cognitive 43): unified_prep.main has cognitive complexity 43 (threshold 15). Drivers by points: if/else 21 (29 pts), loops 4 (7 pts), boolean chains 3, ternaries 2 (3 pts), error handling 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/evals/unified_prep.py"},"region":{"startLine":527}}}],"partialFingerprints":{"codehealthFindingId/v1":"b67378e3590b0691c69001e5ab06cf1956b4ea0d6ee58c7732198409acbb281d"}},{"ruleId":"D2","level":"warning","message":{"text":"non_interactive._process_message_chunk (cognitive 42): non_interactive._process_message_chunk has cognitive complexity 42 (threshold 15). Drivers by points: if/else 14 (27 pts), ternaries 4 (9 pts), boolean chains 4, error handling 1 (2 pts) (nesting depth added 19). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/client/non_interactive.py"},"region":{"startLine":912}}}],"partialFingerprints":{"codehealthFindingId/v1":"876c40fd1647b52431c0d0bd63eca2551a546fa443e7d62f6a1b37d94df0ec24"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp.action_toggle_tool_output (cognitive 41): DeepAgentsApp.action_toggle_tool_output has cognitive complexity 41 (threshold 15). Drivers by points: if/else 12 (28 pts), boolean chains 7, error handling 2 (3 pts), loops 2 (3 pts) (nesting depth added 18). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":24399}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7762dc2e94d3ce248e5e91777401302488c4eb0a256126ddd5693796ceed1ef"}},{"ruleId":"D2","level":"warning","message":{"text":"non_interactive._process_rubric_event (cognitive 41): non_interactive._process_rubric_event has cognitive complexity 41 (threshold 15). Drivers by points: ternaries 8 (20 pts), if/else 8 (13 pts), boolean chains 4, loops 2 (4 pts) (nesting depth added 19). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/client/non_interactive.py"},"region":{"startLine":1064}}}],"partialFingerprints":{"codehealthFindingId/v1":"6aa4fd6c6b8cc154564109c48baf5c97dab004426d4a378a767c0b4a0f9061ba"}},{"ruleId":"D2","level":"warning","message":{"text":"commands._list (cognitive 41): commands._list has cognitive complexity 41 (threshold 15). Drivers by points: if/else 17 (28 pts), boolean chains 7, loops 3 (6 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":"libs/code/deepagents_code/skills/commands.py"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f7e05609521cbfc6a6dd97924fdf97bde0e35588338e620a4b1f273277aaf10"}},{"ruleId":"D2","level":"warning","message":{"text":"ChatTextArea._on_key (cognitive 41): ChatTextArea._on_key has cognitive complexity 41 (threshold 15). Drivers by points: if/else 21 (30 pts), boolean chains 11 (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":"libs/code/deepagents_code/tui/widgets/chat_input.py"},"region":{"startLine":1239}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4098af396dc76a09df345c9cde3652dadfcea7a6308dbe8f0306427579b047c"}},{"ruleId":"D2","level":"warning","message":{"text":"ask_user._parse_answers (cognitive 40): ask_user._parse_answers has cognitive complexity 40 (threshold 15). Drivers by points: if/else 16 (34 pts), boolean chains 3, match/switch 1 (2 pts), ternaries 1 (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":"libs/code/deepagents_code/ask_user.py"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"95dd7230259339b6b28c319dae7e2243ef417d5eec5a46b73d70ce9effbc4fa0"}},{"ruleId":"D2","level":"warning","message":{"text":"cost_tracking._estimate_cost (cognitive 40): cost_tracking._estimate_cost has cognitive complexity 40 (threshold 15). Drivers by points: if/else 14 (18 pts), boolean chains 15, ternaries 4, error handling 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":"libs/code/deepagents_code/cost_tracking.py"},"region":{"startLine":1687}}}],"partialFingerprints":{"codehealthFindingId/v1":"03a2d7d522265b56fa922b6918b6a9920fd05b84f165ddf24293f54dcb3cedd1"}},{"ruleId":"D2","level":"warning","message":{"text":"commands._delete (cognitive 40): commands._delete has cognitive complexity 40 (threshold 15). Drivers by points: if/else 19 (24 pts), ternaries 4 (8 pts), error handling 3 (5 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":"libs/code/deepagents_code/skills/commands.py"},"region":{"startLine":671}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bb57ca8abe2a0b4e53657bf344f9619a1bf3de37cbabfc7f5ad4e908b0f19e0"}},{"ruleId":"D2","level":"warning","message":{"text":"PluginManagerScreen._refresh_view (cognitive 40): PluginManagerScreen._refresh_view has cognitive complexity 40 (threshold 15). Drivers by points: if/else 15 (20 pts), boolean chains 7, ternaries 3 (6 pts), error handling 1 (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":"libs/code/deepagents_code/tui/modals/plugin_manager/__init__.py"},"region":{"startLine":451}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b7e55d831a4d5f3c7969e97766e51f4ec81f04882e41ac2850dae6a1a9f2d75"}},{"ruleId":"D2","level":"warning","message":{"text":"analyze.main (cognitive 40): analyze.main has cognitive complexity 40 (threshold 15). Drivers by points: if/else 10 (22 pts), ternaries 3 (9 pts), error handling 1 (4 pts), loops 1 (3 pts), boolean chains 2 (nesting depth added 23). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/evals/scripts/analyze.py"},"region":{"startLine":779}}}],"partialFingerprints":{"codehealthFindingId/v1":"059e09c1fe0f5ad1a0da0d02f1117857dcfa98d0b4792b4d01d96168050cd9f8"}},{"ruleId":"D2","level":"warning","message":{"text":"aggregate_unified.read_leaf (cognitive 40): aggregate_unified.read_leaf has cognitive complexity 40 (threshold 15). Drivers by points: if/else 15 (20 pts), boolean chains 16, loops 1 (2 pts), error handling 1, ternaries 1 (nesting depth added 6). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/evals/aggregate_unified.py"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"a246a42039ce6052e3afbbb791e31075d041213d9af97cfb4a1d069c8f730b9d"}},{"ruleId":"D2","level":"warning","message":{"text":"aggregate_unified.combine (cognitive 40): aggregate_unified.combine has cognitive complexity 40 (threshold 15). Drivers by points: if/else 10 (19 pts), boolean chains 10, ternaries 3 (7 pts), loops 4 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/evals/aggregate_unified.py"},"region":{"startLine":379}}}],"partialFingerprints":{"codehealthFindingId/v1":"934f95815851f3ec3465e60efdf74c6c314e2ff2c0ea3754c445847667979b99"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._load_thread_history (cognitive 39): DeepAgentsApp._load_thread_history has cognitive complexity 39 (threshold 15). Drivers by points: if/else 17 (22 pts), error handling 5 (7 pts), boolean chains 4, loops 3 (4 pts), ternaries 2 (nesting depth added 8). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":21041}}}],"partialFingerprints":{"codehealthFindingId/v1":"41f2a12cf59f91f949e86f255c5cffdb47a9dfd186127465cd0d24a09d5e4fe1"}},{"ruleId":"D2","level":"warning","message":{"text":"bridge.enqueueMessage (cognitive 39): bridge.enqueueMessage has cognitive complexity 39 (threshold 15). Drivers by points: boolean chains 30, if/else 5, ternaries 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":"libs/talon/deepagents_talon/channels/whatsapp_bridge/bridge.js"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"45134ac5578b105fa78d718ab9207ca4d094977109fa26d33efe4e88b045fc57"}},{"ruleId":"D2","level":"warning","message":{"text":"auto_mode._user_answer_evidence (cognitive 38): auto_mode._user_answer_evidence has cognitive complexity 38 (threshold 15). Drivers by points: if/else 12 (25 pts), loops 5 (8 pts), boolean chains 5 (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":"libs/code/deepagents_code/auto_mode.py"},"region":{"startLine":1533}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fd8c2a5dd28e26d2700d539e3c4a2e902e91e07f054aa55bb670c01a5bb4147"}},{"ruleId":"D2","level":"warning","message":{"text":"config._get_provider_kwargs (cognitive 38): config._get_provider_kwargs has cognitive complexity 38 (threshold 15). Drivers by points: if/else 11 (23 pts), ternaries 3 (11 pts), boolean chains 4 (nesting depth added 20). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/config.py"},"region":{"startLine":5953}}}],"partialFingerprints":{"codehealthFindingId/v1":"389c2df0a74443dc38a2dd39bdb3c70019024f6ccc75afcd71e04650bd96ce7d"}},{"ruleId":"D2","level":"warning","message":{"text":"ServerHooksMiddleware._after_model (cognitive 38): ServerHooksMiddleware._after_model has cognitive complexity 38 (threshold 15). Drivers by points: if/else 10 (20 pts), ternaries 3 (11 pts), boolean chains 6, loops 1 (nesting depth added 18). 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":"libs/code/deepagents_code/hooks/server_middleware.py"},"region":{"startLine":601}}}],"partialFingerprints":{"codehealthFindingId/v1":"20554271cace2f97d84ae82f22e61428b92855ea19218f0b8d4f859f89b662c5"}},{"ruleId":"D2","level":"warning","message":{"text":"mcp_tools._validate_server_config (cognitive 38): mcp_tools._validate_server_config has cognitive complexity 38 (threshold 15). Drivers by points: if/else 17 (31 pts), boolean chains 4, loops 1 (3 pts) (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/mcp_tools.py"},"region":{"startLine":415}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ce7e36fe94fa3f9b2da03acbd7e8b02625abc104df80598dc35d0e8f1ebde3b"}},{"ruleId":"D2","level":"warning","message":{"text":"discovery.auto_update_plugins (cognitive 38): discovery.auto_update_plugins has cognitive complexity 38 (threshold 15). Drivers by points: if/else 8 (21 pts), error handling 4 (9 pts), boolean chains 3, loops 2 (3 pts), match/switch 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":"libs/code/deepagents_code/plugins/discovery.py"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"18d7dd50d7fd158c2095ea378c18b0c2ca6c5b41afe7d087bca0a549886776b3"}},{"ruleId":"D2","level":"warning","message":{"text":"AuthPromptScreen.compose (cognitive 38): AuthPromptScreen.compose has cognitive complexity 38 (threshold 15). Drivers by points: if/else 17 (19 pts), ternaries 8 (12 pts), boolean chains 7 (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":"libs/code/deepagents_code/tui/widgets/auth.py"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"665b5c4559ebfaff8fdef6f9c3121aa2a8cfc3d4674d890aee278108f98aa560"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._resolve_resume_thread (cognitive 37): DeepAgentsApp._resolve_resume_thread has cognitive complexity 37 (threshold 15). Drivers by points: if/else 15 (23 pts), boolean chains 5, error handling 5, ternaries 2 (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":"libs/code/deepagents_code/app.py"},"region":{"startLine":6110}}}],"partialFingerprints":{"codehealthFindingId/v1":"d845fa9099608f7a9e45619687c16f922b37a533e7494dd6cfea77ab3613a239"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._resume_owned_thread (cognitive 37): DeepAgentsApp._resume_owned_thread has cognitive complexity 37 (threshold 15). Drivers by points: if/else 21 (33 pts), error handling 3 (4 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":31312}}}],"partialFingerprints":{"codehealthFindingId/v1":"0793d1e431a926e1e1f3dba4fc903ea2416893de70542b7db5930c94a76ce628"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._offer_thread_cwd_switch (cognitive 36): DeepAgentsApp._offer_thread_cwd_switch has cognitive complexity 36 (threshold 15). Drivers by points: if/else 15 (26 pts), boolean chains 6, ternaries 3 (4 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":31114}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c9d0547b435faecd62cd7685d57690ed4df2604363fbf5b993a52c4ef232b03"}},{"ruleId":"D2","level":"warning","message":{"text":"AutoModeHITLMiddleware._validated_plan (cognitive 36): AutoModeHITLMiddleware._validated_plan has cognitive complexity 36 (threshold 15). Drivers by points: if/else 17 (19 pts), boolean chains 16, 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":"libs/code/deepagents_code/auto_mode.py"},"region":{"startLine":3992}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed273309bf5e2d42ebd6222e3114a1d05cfb5bf9680882d083981a283da686c3"}},{"ruleId":"D2","level":"warning","message":{"text":"quick_validate.validate_skill (cognitive 36): quick_validate.validate_skill has cognitive complexity 36 (threshold 15). Drivers by points: if/else 20 (29 pts), boolean chains 4, loops 1 (2 pts), error handling 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb74ac900067a805cda710786941758859e7c3dd10ef6df6508bb7cd105727f8"}},{"ruleId":"D2","level":"warning","message":{"text":"resolver._merge (cognitive 36): resolver._merge has cognitive complexity 36 (threshold 15). Drivers by points: if/else 9 (24 pts), boolean chains 6, loops 3 (6 pts) (nesting depth added 18). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/configuration/resolver.py"},"region":{"startLine":1113}}}],"partialFingerprints":{"codehealthFindingId/v1":"b91408bb295bfa8d2340198b5cc80ad4373b124f88fe29574ba5c1ec3046ecfb"}},{"ruleId":"D2","level":"warning","message":{"text":"main._check_mcp_project_trust (cognitive 35): main._check_mcp_project_trust has cognitive complexity 35 (threshold 15). Drivers by points: if/else 18 (21 pts), boolean chains 6, ternaries 4 (5 pts), loops 2, error handling 1 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":4651}}}],"partialFingerprints":{"codehealthFindingId/v1":"b937ca691627c38bb024070d749cc6c83d1a242d571ff63be162cef7ce20ba7f"}},{"ruleId":"D2","level":"warning","message":{"text":"cli._cmd_list (cognitive 35): cli._cmd_list has cognitive complexity 35 (threshold 15). Drivers by points: if/else 18 (31 pts), error handling 2 (4 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":"libs/evals/deepagents_evals/cli.py"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0233d19bc788b114ad706a92c629a763cd8abcd6899f753f01c29e7d2a4da2d"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._handle_context_doctor_command (cognitive 34): DeepAgentsApp._handle_context_doctor_command has cognitive complexity 34 (threshold 15). Drivers by points: error handling 7 (14 pts), if/else 5 (10 pts), boolean chains 4, ternaries 2 (4 pts), loops 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":14433}}}],"partialFingerprints":{"codehealthFindingId/v1":"d58d710e97140f700e84869f49abeae47264d90e8a0902f9295a3c6b09028b48"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp.exit (cognitive 34): DeepAgentsApp.exit has cognitive complexity 34 (threshold 15). Drivers by points: if/else 18 (23 pts), boolean chains 7, loops 2, error handling 1, 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":23093}}}],"partialFingerprints":{"codehealthFindingId/v1":"832495bf381fbf158b9260c42da74ce58340a0e3105b438f2a6ed0690c749a03"}},{"ruleId":"D2","level":"warning","message":{"text":"FileOpTracker.start_operation (cognitive 34): FileOpTracker.start_operation has cognitive complexity 34 (threshold 15). Drivers by points: if/else 8 (16 pts), boolean chains 9, error handling 3 (9 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":"libs/code/deepagents_code/file_ops.py"},"region":{"startLine":695}}}],"partialFingerprints":{"codehealthFindingId/v1":"847c358975df046a998162da0195bfb81b65c75f3c3320920ed671f1b7b1cf2a"}},{"ruleId":"D2","level":"warning","message":{"text":"analyze.analyze_trial (cognitive 34): analyze.analyze_trial has cognitive complexity 34 (threshold 15). Drivers by points: error handling 4 (12 pts), if/else 10 (12 pts), ternaries 6 (7 pts), boolean chains 3 (nesting depth added 11). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/evals/scripts/analyze.py"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"9767db8de3b0cc8bb12b8d8054ac70112277b456c23ab7ff8d2087419b73f8da"}},{"ruleId":"D2","level":"warning","message":{"text":"raise_langchain_minimums._run (cognitive 33): raise_langchain_minimums._run has cognitive complexity 33 (threshold 15). Drivers by points: if/else 14 (26 pts), boolean chains 2, error handling 1 (2 pts), loops 2, ternaries 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":".github/scripts/checks/raise_langchain_minimums.py"},"region":{"startLine":628}}}],"partialFingerprints":{"codehealthFindingId/v1":"67087c87cb4503c230443ab249dbf29290ddf79530e752f99df0fd6d5883faa1"}},{"ruleId":"D2","level":"warning","message":{"text":"model_config.get_provider_auth_status (cognitive 32): model_config.get_provider_auth_status has cognitive complexity 32 (threshold 15). Drivers by points: if/else 16 (30 pts), ternaries 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":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":2642}}}],"partialFingerprints":{"codehealthFindingId/v1":"e39ee01c8bfd6069279a715f3f4285b5a66c591616e9b766a01e6e2c0e432cba"}},{"ruleId":"D2","level":"warning","message":{"text":"update_check.release_prerelease_pins (cognitive 32): update_check.release_prerelease_pins has cognitive complexity 32 (threshold 15). Drivers by points: if/else 7 (22 pts), loops 1 (5 pts), error handling 3, boolean chains 1, ternaries 1 (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":"libs/code/deepagents_code/update_check.py"},"region":{"startLine":795}}}],"partialFingerprints":{"codehealthFindingId/v1":"66b53b7a494fc9f00f53c1053d2ff24189ca7fbe6fee03a2aadc483a03807ca5"}},{"ruleId":"D2","level":"warning","message":{"text":"update_check.perform_upgrade (cognitive 32): update_check.perform_upgrade has cognitive complexity 32 (threshold 15). Drivers by points: if/else 15 (21 pts), boolean chains 7, error handling 2 (3 pts), 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":"libs/code/deepagents_code/update_check.py"},"region":{"startLine":2495}}}],"partialFingerprints":{"codehealthFindingId/v1":"a021e6490f35627a2906ea7e044b563eb066fecb4f008bddb1eae82c1f717169"}},{"ruleId":"D2","level":"warning","message":{"text":"_session_stats.record_message_usage (cognitive 31): _session_stats.record_message_usage has cognitive complexity 31 (threshold 15). Drivers by points: ternaries 9 (13 pts), boolean chains 9, if/else 6 (7 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":"libs/code/deepagents_code/_session_stats.py"},"region":{"startLine":934}}}],"partialFingerprints":{"codehealthFindingId/v1":"bea2b9b148fd2a76ff6b30a08132e3f89f320c393d09f3c525f141dfac47c5b4"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._request_approval (cognitive 31): DeepAgentsApp._request_approval has cognitive complexity 31 (threshold 15). Drivers by points: if/else 9 (15 pts), loops 3 (7 pts), error handling 2 (5 pts), boolean chains 4 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":11015}}}],"partialFingerprints":{"codehealthFindingId/v1":"6164f1d334f8fda51d507edf8f480f4720ab2eb2c1e9d187862759cdf7510963"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._prune_messages_unlocked (cognitive 31): DeepAgentsApp._prune_messages_unlocked has cognitive complexity 31 (threshold 15). Drivers by points: if/else 11 (19 pts), error handling 3 (8 pts), loops 2 (3 pts), ternaries 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":21778}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ed5fe4057f400cf5a6067ad03ad759e92d8951676758d58a9f5dccaec9c4346"}},{"ruleId":"D2","level":"warning","message":{"text":"AutoModeHITLMiddleware._human_review (cognitive 31): AutoModeHITLMiddleware._human_review has cognitive complexity 31 (threshold 15). Drivers by points: if/else 11 (17 pts), boolean chains 6, loops 3 (4 pts), error handling 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":"libs/code/deepagents_code/auto_mode.py"},"region":{"startLine":3849}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b96b2af8807d83e3d311ce2fc25665e1f5a3abdc70e5b0d74ab7a9c85d2096f"}},{"ruleId":"D2","level":"warning","message":{"text":"input._resolve_with_unicode_space_variants (cognitive 31): input._resolve_with_unicode_space_variants has cognitive complexity 31 (threshold 15). Drivers by points: if/else 13 (27 pts), error handling 1 (2 pts), boolean chains 1, loops 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/input.py"},"region":{"startLine":1073}}}],"partialFingerprints":{"codehealthFindingId/v1":"e74345a9454f8adaa947785c6eafc814a9f4449a66777128a6cffee3e989b5e1"}},{"ruleId":"D2","level":"warning","message":{"text":"main.build_version_text (cognitive 31): main.build_version_text has cognitive complexity 31 (threshold 15). Drivers by points: if/else 10 (14 pts), ternaries 3 (10 pts), error handling 4 (5 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":"libs/code/deepagents_code/main.py"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ec880e969e17d77bdfc154fbac7a81a8dd3bfb77e3c0c1f4b0606d6696bf1ac"}},{"ruleId":"D2","level":"warning","message":{"text":"main.run_textual_cli_async (cognitive 31): main.run_textual_cli_async has cognitive complexity 31 (threshold 15). Drivers by points: if/else 14 (18 pts), boolean chains 8, error handling 3, ternaries 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":"libs/code/deepagents_code/main.py"},"region":{"startLine":3167}}}],"partialFingerprints":{"codehealthFindingId/v1":"5435ddd9d787448eefbfd2ad766587f7c82bc5fc4f7e9e0320bad0e1a2b069c6"}},{"ruleId":"D2","level":"warning","message":{"text":"_ExpiryAwareOAuthClientProvider.async_auth_flow (cognitive 31): _ExpiryAwareOAuthClientProvider.async_auth_flow has cognitive complexity 31 (threshold 15). Drivers by points: if/else 11 (20 pts), loops 3 (5 pts), boolean chains 3, error handling 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":"libs/code/deepagents_code/mcp_auth.py"},"region":{"startLine":1648}}}],"partialFingerprints":{"codehealthFindingId/v1":"1aff988c2760e64de97fdfeae67f25943f7ef36df182b7ecdffed2d3565bfbdc"}},{"ruleId":"D2","level":"warning","message":{"text":"cli._cmd_trials (cognitive 31): cli._cmd_trials has cognitive complexity 31 (threshold 15). Drivers by points: if/else 18 (25 pts), boolean chains 4, loops 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/evals/deepagents_evals/cli.py"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"d33be46ca0a7829813f6adf089417a471988e2d12a67cf44a06dace86d218224"}},{"ruleId":"D2","level":"warning","message":{"text":"app._extract_model_params_flag (cognitive 30): app._extract_model_params_flag has cognitive complexity 30 (threshold 15). Drivers by points: if/else 11 (22 pts), loops 2 (4 pts), ternaries 1 (2 pts), boolean chains 1, error handling 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":1949}}}],"partialFingerprints":{"codehealthFindingId/v1":"87b2c8b84e04b92610d389efea5986db4038f398cf95fd79d24a6381546746f9"}},{"ruleId":"D2","level":"warning","message":{"text":"Credentials._reload_values (cognitive 30): Credentials._reload_values has cognitive complexity 30 (threshold 15). Drivers by points: if/else 11 (17 pts), boolean chains 6, error handling 4, ternaries 2 (3 pts) (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/config.py"},"region":{"startLine":3796}}}],"partialFingerprints":{"codehealthFindingId/v1":"2302460a29468a1dec61e5409a32da3119d4843cd3230dac22ed78fbd38b0f5b"}},{"ruleId":"D2","level":"warning","message":{"text":"PluginManagerScreen.on_option_list_option_selected (cognitive 30): PluginManagerScreen.on_option_list_option_selected has cognitive complexity 30 (threshold 15). Drivers by points: if/else 20 (26 pts), boolean chains 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":"libs/code/deepagents_code/tui/modals/plugin_manager/__init__.py"},"region":{"startLine":1030}}}],"partialFingerprints":{"codehealthFindingId/v1":"329ac066a0cdf604a229761c67fc8845b82967d16ac4e12b365a4169ae9a3f4b"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentRuntime._create_graph (cognitive 30): DeepAgentRuntime._create_graph has cognitive complexity 30 (threshold 15). Drivers by points: if/else 9 (12 pts), boolean chains 10, loops 3 (4 pts), ternaries 4 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/runtime.py"},"region":{"startLine":433}}}],"partialFingerprints":{"codehealthFindingId/v1":"38e724a7722fcbda9ca53727feb246cb9643964509a3dfbd9d9709ea6c51d7c8"}},{"ruleId":"D2","level":"warning","message":{"text":"_dep_floor_check._find_floor_violations (cognitive 29): _dep_floor_check._find_floor_violations has cognitive complexity 29 (threshold 15). Drivers by points: error handling 7 (15 pts), if/else 5 (11 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":"libs/code/deepagents_code/_dep_floor_check.py"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"79e42e300d1bc87076c53d1276bbc1b7782a129d6c77712cf2e61ecbbb8f0be0"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._set_rubric_model (cognitive 29): DeepAgentsApp._set_rubric_model has cognitive complexity 29 (threshold 15). Drivers by points: if/else 15 (20 pts), boolean chains 5, error handling 2 (3 pts), ternaries 1 (nesting depth added 6). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":17367}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7617753435695dc0a252bf8f49b8d45a2bbdf056fb7a48a22a8becd817557a1"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._handle_update_action (cognitive 29): DeepAgentsApp._handle_update_action has cognitive complexity 29 (threshold 15). Drivers by points: if/else 13 (26 pts), ternaries 1 (2 pts), boolean chains 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":27185}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4a7cd870fba92850bc342435129f3d8bb3dd18d51046c0c5b65035c04886663"}},{"ruleId":"D2","level":"warning","message":{"text":"inspect_sessions.main (cognitive 29): inspect_sessions.main has cognitive complexity 29 (threshold 15). Drivers by points: if/else 13 (21 pts), boolean chains 4, ternaries 1 (4 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":"libs/code/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py"},"region":{"startLine":616}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ff809153d0033020a3011752489fcb3860ef74b82132b996321e0f0f7845c1a"}},{"ruleId":"D2","level":"warning","message":{"text":"ServerProcess.wait_for_graph_ready (cognitive 29): ServerProcess.wait_for_graph_ready has cognitive complexity 29 (threshold 15). Drivers by points: if/else 11 (26 pts), error handling 1 (2 pts), loops 1 (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/client/launch/server.py"},"region":{"startLine":1067}}}],"partialFingerprints":{"codehealthFindingId/v1":"258967989c4df9652c941d1052ad30f2b1e1aea8086422969df24d007c367b55"}},{"ruleId":"D2","level":"warning","message":{"text":"RemoteAgent.astream (cognitive 29): RemoteAgent.astream has cognitive complexity 29 (threshold 15). Drivers by points: if/else 11 (21 pts), boolean chains 6, 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":"libs/code/deepagents_code/client/remote_client.py"},"region":{"startLine":793}}}],"partialFingerprints":{"codehealthFindingId/v1":"29fe89d3f033fc4d818d5d0e55d271c7a3d8f047b8f0b82c43801b629aad4659"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelConfig.load (cognitive 29): ModelConfig.load has cognitive complexity 29 (threshold 15). Drivers by points: if/else 11 (13 pts), boolean chains 6, ternaries 6, error handling 2, loops 1 (2 pts) (nesting depth added 3). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":3364}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc60dd71d32f32ec36c81b2ef423970e1455c1804945729378cc607da7b9ebc9"}},{"ruleId":"D2","level":"warning","message":{"text":"ChatInput.on_text_area_changed (cognitive 29): ChatInput.on_text_area_changed has cognitive complexity 29 (threshold 15). Drivers by points: if/else 14 (23 pts), boolean chains 6 (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":"libs/code/deepagents_code/tui/widgets/chat_input.py"},"region":{"startLine":2752}}}],"partialFingerprints":{"codehealthFindingId/v1":"b97e170e96fe0402113709cea6aaef1d566eafb817688658df530e253542b5f6"}},{"ruleId":"D2","level":"warning","message":{"text":"_ptc.filter_tools_for_ptc (cognitive 29): _ptc.filter_tools_for_ptc has cognitive complexity 29 (threshold 15). Drivers by points: if/else 8 (24 pts), loops 2 (4 pts), boolean chains 1 (nesting depth added 18). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/partners/quickjs/langchain_quickjs/_ptc.py"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b7f0c211e882c103fad46b8d24a45e0fc2ee18260898413bb8660a4c0ac4019"}},{"ruleId":"D2","level":"warning","message":{"text":"aggregate_unified.render_markdown (cognitive 29): aggregate_unified.render_markdown has cognitive complexity 29 (threshold 15). Drivers by points: loops 6 (12 pts), if/else 9 (11 pts), ternaries 3 (5 pts), boolean chains 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/evals/aggregate_unified.py"},"region":{"startLine":551}}}],"partialFingerprints":{"codehealthFindingId/v1":"d89c940e3de3c73ce44c3f88cfd7278134afdae17c9e90e246e1bf233e501959"}},{"ruleId":"D2","level":"warning","message":{"text":"collect_langsmith_usage.collect_all (cognitive 29): collect_langsmith_usage.collect_all has cognitive complexity 29 (threshold 15). Drivers by points: if/else 6 (17 pts), loops 3 (6 pts), error handling 1 (4 pts), boolean chains 2 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/evals/collect_langsmith_usage.py"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"60adb0777a67eeee71577fad3e241e316b74ff37121f29435c15ebe08060efbb"}},{"ruleId":"D2","level":"warning","message":{"text":"check_release_deps._affected_extras (cognitive 29): check_release_deps._affected_extras has cognitive complexity 29 (threshold 15). Drivers by points: if/else 8 (17 pts), loops 4 (6 pts), boolean chains 3, error handling 1 (3 pts) (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/release/check_release_deps.py"},"region":{"startLine":448}}}],"partialFingerprints":{"codehealthFindingId/v1":"4120fafba46160783d77643a6b0fa183146587e8cc56bb27c9bfa8ae940f1948"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentServerACP._process_tool_call_chunks (cognitive 28): AgentServerACP._process_tool_call_chunks has cognitive complexity 28 (threshold 15). Drivers by points: if/else 5 (14 pts), boolean chains 6, error handling 1 (4 pts), 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":"libs/acp/deepagents_acp/server.py"},"region":{"startLine":602}}}],"partialFingerprints":{"codehealthFindingId/v1":"97302b85a06a17d6bb2a0cb3843ac3c53905b5f726ce1bb58c1e0a0cbfd00090"}},{"ruleId":"D2","level":"warning","message":{"text":"_session_stats._record_message_usage (cognitive 28): _session_stats._record_message_usage has cognitive complexity 28 (threshold 15). Drivers by points: if/else 10 (15 pts), ternaries 6 (7 pts), boolean chains 6 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/_session_stats.py"},"region":{"startLine":1062}}}],"partialFingerprints":{"codehealthFindingId/v1":"365441037ea759c5196bb9635a0a277f10f0665f859b66c0ce450049219ff7d5"}},{"ruleId":"D2","level":"warning","message":{"text":"agent._rubric_grader_repo_call_count (cognitive 28): agent._rubric_grader_repo_call_count has cognitive complexity 28 (threshold 15). Drivers by points: if/else 9 (19 pts), boolean chains 5, loops 3 (4 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":"libs/code/deepagents_code/agent.py"},"region":{"startLine":459}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b1e9582a4573df2b8d258cb11df561090b1f4a7f5aa3bf20e86df15daf17245"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._handle_version_command (cognitive 28): DeepAgentsApp._handle_version_command has cognitive complexity 28 (threshold 15). Drivers by points: if/else 11 (17 pts), error handling 6 (8 pts), ternaries 1 (2 pts), boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":8631}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7b83b3d95346f142bdafb487a75bdbc55cf4776b5e908a3f3f8de0b3026238e"}},{"ruleId":"D2","level":"warning","message":{"text":"file_ops.build_approval_preview (cognitive 28): file_ops.build_approval_preview has cognitive complexity 28 (threshold 15). Drivers by points: if/else 12 (19 pts), boolean chains 5, ternaries 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":"libs/code/deepagents_code/file_ops.py"},"region":{"startLine":523}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0f7696b0a2b98feb52987bc873a2081709a0765ff0cebb43ddae309ed452c5b"}},{"ruleId":"D2","level":"warning","message":{"text":"marketplace.parse_marketplace_source (cognitive 28): marketplace.parse_marketplace_source has cognitive complexity 28 (threshold 15). Drivers by points: if/else 12 (20 pts), boolean chains 4, error handling 1 (2 pts), 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":"libs/code/deepagents_code/plugins/marketplace.py"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"b05bcb851c81969803c5e41af96927ba3b0fb59eb1fe43b1ebd2e1c298cd911d"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelSelectorScreen._set_default (cognitive 28): ModelSelectorScreen._set_default has cognitive complexity 28 (threshold 15). Drivers by points: if/else 12 (20 pts), error handling 3 (6 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":"libs/code/deepagents_code/tui/widgets/model_selector.py"},"region":{"startLine":2297}}}],"partialFingerprints":{"codehealthFindingId/v1":"10f734f7d061cc3e981f38eac4840d35e9cf86f9cb0e9cb70c489fd147291f54"}},{"ruleId":"D2","level":"warning","message":{"text":"update_check.get_latest_version (cognitive 28): update_check.get_latest_version has cognitive complexity 28 (threshold 15). Drivers by points: if/else 9 (14 pts), error handling 5, ternaries 3 (5 pts), boolean chains 4 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/update_check.py"},"region":{"startLine":682}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1ae93827bf183bc8d0ab2b1eeb984116cdc1929938e58bb9875dd6413885c25"}},{"ruleId":"D2","level":"warning","message":{"text":"main.main (cognitive 28): main.main has cognitive complexity 28 (threshold 15). Drivers by points: if/else 13 (20 pts), loops 3 (7 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":"libs/evals/harbor_adapters/drbench/main.py"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6295ecf995c13c496c9b05280fb41764ff683db860aa81018a9567d6d6f0659"}},{"ruleId":"D2","level":"warning","message":{"text":"extract_text._from_jsonl (cognitive 28): extract_text._from_jsonl has cognitive complexity 28 (threshold 15). Drivers by points: if/else 8 (17 pts), ternaries 2 (6 pts), boolean chains 2, error handling 1 (2 pts), loops 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/evals/harbor_adapters/drbench/templates/extract_text.py"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"12be75ce38d2c7ab37bdbd087e11016948772721ff6b868c4b98801d1eee97f7"}},{"ruleId":"D2","level":"warning","message":{"text":"CronJobStore.edit_job (cognitive 28): CronJobStore.edit_job has cognitive complexity 28 (threshold 15). Drivers by points: ternaries 7 (13 pts), if/else 6 (11 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":"libs/talon/deepagents_talon/cron/jobs.py"},"region":{"startLine":977}}}],"partialFingerprints":{"codehealthFindingId/v1":"446c2d207943fd168e4785fe29244aeef34eea25c5a6271309cf48e7920a0419"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._handle_update_command (cognitive 27): DeepAgentsApp._handle_update_command has cognitive complexity 27 (threshold 15). Drivers by points: if/else 14 (20 pts), ternaries 2 (4 pts), boolean chains 2, error handling 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":7295}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5a15c869bb7fc488bfc6d6219fed66992d6993770a3697683dd7e7c2177c4f3"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._run_shell_task (cognitive 27): DeepAgentsApp._run_shell_task has cognitive complexity 27 (threshold 15). Drivers by points: if/else 13 (19 pts), boolean chains 4, error handling 4 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":13719}}}],"partialFingerprints":{"codehealthFindingId/v1":"6202e11763fec79096960919dbb9c138c67ca5fe1fe246f54756fdbaf456015a"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._cleanup_agent_task (cognitive 27): DeepAgentsApp._cleanup_agent_task has cognitive complexity 27 (threshold 15). Drivers by points: if/else 14 (18 pts), boolean chains 7, error handling 1 (2 pts) (nesting depth added 5). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":20288}}}],"partialFingerprints":{"codehealthFindingId/v1":"8aa9b4df20888720dbaa4f6a5287ae74ebb39efa19dc289f4f4b8a7c89105160"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp.action_interrupt (cognitive 27): DeepAgentsApp.action_interrupt has cognitive complexity 27 (threshold 15). Drivers by points: if/else 18 (23 pts), boolean chains 4 (nesting depth added 5). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":22848}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2523fb8b63309eb5a34896806cf6981030d829c607b288fa1fb54117df21d1f"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._confirm_and_switch_model (cognitive 27): DeepAgentsApp._confirm_and_switch_model has cognitive complexity 27 (threshold 15). Drivers by points: if/else 7 (11 pts), error handling 3 (6 pts), boolean chains 5, ternaries 4 (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":"libs/code/deepagents_code/app.py"},"region":{"startLine":25195}}}],"partialFingerprints":{"codehealthFindingId/v1":"72ae47547955202ae5c8de4b8baba452295770c6169b5b214805218479344cb6"}},{"ruleId":"D2","level":"warning","message":{"text":"config._parse_retry_config (cognitive 27): config._parse_retry_config has cognitive complexity 27 (threshold 15). Drivers by points: if/else 11 (23 pts), loops 2 (3 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":"libs/code/deepagents_code/config.py"},"region":{"startLine":3028}}}],"partialFingerprints":{"codehealthFindingId/v1":"95291092bfbb7406e45881f7bca5a2fd83597baededb8619ef2a7e4d7c9b8a8e"}},{"ruleId":"D2","level":"warning","message":{"text":"config_manifest._emit_ranked_diagnostics (cognitive 27): config_manifest._emit_ranked_diagnostics has cognitive complexity 27 (threshold 15). Drivers by points: if/else 7 (16 pts), loops 3 (6 pts), boolean chains 5 (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":"libs/code/deepagents_code/config_manifest.py"},"region":{"startLine":1209}}}],"partialFingerprints":{"codehealthFindingId/v1":"3431211f9549a70d3f73234c6f4c363646d2cf014d8fc07694d78dccaecd3c70"}},{"ruleId":"D2","level":"warning","message":{"text":"managed_tools.ensure_ripgrep (cognitive 27): managed_tools.ensure_ripgrep has cognitive complexity 27 (threshold 15). Drivers by points: if/else 14 (20 pts), error handling 5, 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":"libs/code/deepagents_code/managed_tools.py"},"region":{"startLine":739}}}],"partialFingerprints":{"codehealthFindingId/v1":"1866cb429b273de626b4239a3e1c20f53d1150fd169d072101b735bdef88095b"}},{"ruleId":"D2","level":"warning","message":{"text":"server_graph._make_graphs_in_environment (cognitive 27): server_graph._make_graphs_in_environment has cognitive complexity 27 (threshold 15). Drivers by points: error handling 5 (9 pts), ternaries 4 (8 pts), if/else 4 (6 pts), boolean chains 2, loops 1 (2 pts) (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/server_graph.py"},"region":{"startLine":416}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f3ec196a704b7e9ad96c9a7084d133a2025849ffeafd3be13a7fff45837a05f"}},{"ruleId":"D2","level":"warning","message":{"text":"ChatTextArea._find_placeholder_span (cognitive 27): ChatTextArea._find_placeholder_span has cognitive complexity 27 (threshold 15). Drivers by points: if/else 6 (23 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 18). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/chat_input.py"},"region":{"startLine":1492}}}],"partialFingerprints":{"codehealthFindingId/v1":"de4adb1fdd8a34aa4d308117ae2a3442c18db1869c3229b8e7525c9b2ba903e4"}},{"ruleId":"D2","level":"warning","message":{"text":"_SlackSdkGateway.thread_context (cognitive 27): _SlackSdkGateway.thread_context has cognitive complexity 27 (threshold 15). Drivers by points: if/else 6 (16 pts), boolean chains 7, loops 3 (4 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":"libs/talon/deepagents_talon/channels/slack.py"},"region":{"startLine":527}}}],"partialFingerprints":{"codehealthFindingId/v1":"db7af0349ae5235268db7d58dfeef34930e8a6e0af0bb781b5fc672d657a6ad5"}},{"ruleId":"D2","level":"warning","message":{"text":"check_wheel_dep_freshness._marker_environment_overrides (cognitive 27): check_wheel_dep_freshness._marker_environment_overrides has cognitive complexity 27 (threshold 15). Drivers by points: loops 5 (12 pts), if/else 5 (8 pts), error handling 1 (5 pts), boolean chains 1, ternaries 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/release/check_wheel_dep_freshness.py"},"region":{"startLine":538}}}],"partialFingerprints":{"codehealthFindingId/v1":"51fe390edaa02c9476fc9e0af9e226127e1c56b1b0a373c047d1f47f2a9a9077"}},{"ruleId":"D2","level":"warning","message":{"text":"id_compat.reactionEntry (cognitive 27): id_compat.reactionEntry has cognitive complexity 27 (threshold 15). Drivers by points: ternaries 8 (23 pts), boolean chains 3, if/else 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":"libs/talon/deepagents_talon/channels/whatsapp_bridge/id_compat.js"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"77c48b835ba4a24b487ab605711f36c3149aebfffa20925da8ca97ff0acde78b"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._retarget_hooks_after_cwd_switch (cognitive 26): DeepAgentsApp._retarget_hooks_after_cwd_switch has cognitive complexity 26 (threshold 15). Drivers by points: if/else 7 (18 pts), error handling 2 (4 pts), boolean chains 3, ternaries 1 (nesting depth added 13). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":5619}}}],"partialFingerprints":{"codehealthFindingId/v1":"37a2915b0c6f9e55f52cf24a16c75e5d5a0730d5bf0f9bfb340d08ab79771065"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._apply_goal_application (cognitive 26): DeepAgentsApp._apply_goal_application has cognitive complexity 26 (threshold 15). Drivers by points: if/else 13 (17 pts), boolean chains 8, 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":16632}}}],"partialFingerprints":{"codehealthFindingId/v1":"c253ee2b101a49c8e545fae9692c849c8d02ab38c90d9feaeb33e6ebbc2e08bc"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._switch_model (cognitive 26): DeepAgentsApp._switch_model has cognitive complexity 26 (threshold 15). Drivers by points: if/else 15 (21 pts), boolean chains 4, 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":31887}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cfa47c4c5127e672481a444acc53cb2235a39ba0174538eb849a2013b736e6a"}},{"ruleId":"D2","level":"warning","message":{"text":"configurable_model._build_overrides (cognitive 26): configurable_model._build_overrides has cognitive complexity 26 (threshold 15). Drivers by points: if/else 14 (22 pts), boolean chains 2, ternaries 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":"libs/code/deepagents_code/configurable_model.py"},"region":{"startLine":379}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4e73422030b5deb3d08fe809ed2b36f47ae282985a7c1515022f38be8eab202"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelConfig._validate (cognitive 26): ModelConfig._validate has cognitive complexity 26 (threshold 15). Drivers by points: if/else 7 (15 pts), boolean chains 7, loops 3 (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":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":3585}}}],"partialFingerprints":{"codehealthFindingId/v1":"44b953caf25caf0a00cc4199bfe84eeb175f0ef3f30471100b45320059426e73"}},{"ruleId":"D2","level":"warning","message":{"text":"PluginManagerScreen._current_options (cognitive 26): PluginManagerScreen._current_options has cognitive complexity 26 (threshold 15). Drivers by points: if/else 12 (20 pts), ternaries 2 (4 pts), loops 1 (2 pts) (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/modals/plugin_manager/__init__.py"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"7aa573b46dd491bb5e994c955edd7bd5fda35e52a4e4dd17c205d4a7e2e36fac"}},{"ruleId":"D2","level":"warning","message":{"text":"textual_adapter._format_rubric_details (cognitive 26): textual_adapter._format_rubric_details has cognitive complexity 26 (threshold 15). Drivers by points: if/else 9 (13 pts), boolean chains 6, loops 2 (4 pts), ternaries 1 (3 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/textual_adapter.py"},"region":{"startLine":739}}}],"partialFingerprints":{"codehealthFindingId/v1":"37aa9fa8708de8bf6b42a80d1766066e01f2c0527c6cd40e9a20a29129eddd6d"}},{"ruleId":"D2","level":"warning","message":{"text":"ChatInput._build_path_replacement (cognitive 26): ChatInput._build_path_replacement has cognitive complexity 26 (threshold 15). Drivers by points: if/else 7 (11 pts), ternaries 4 (10 pts), error handling 1 (3 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":"libs/code/deepagents_code/tui/widgets/chat_input.py"},"region":{"startLine":3486}}}],"partialFingerprints":{"codehealthFindingId/v1":"cefe85153f9315a55c685ad2aecf2bcd1397977bdd6c8799d746926fa383a001"}},{"ruleId":"D2","level":"warning","message":{"text":"CompositeBackend.grep (cognitive 26): CompositeBackend.grep has cognitive complexity 26 (threshold 15). Drivers by points: if/else 8 (17 pts), boolean chains 7, loops 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. This shape REPEATS in the file: one other method here (CompositeBackend.agrep) 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":"libs/deepagents/deepagents/backends/composite.py"},"region":{"startLine":459}}}],"partialFingerprints":{"codehealthFindingId/v1":"9844a8a17fbe9d73aee8a018358f043451a539ea68f97e6c44e53ee7a16bc68c"}},{"ruleId":"D2","level":"warning","message":{"text":"CompositeBackend.agrep (cognitive 26): CompositeBackend.agrep has cognitive complexity 26 (threshold 15). Drivers by points: if/else 8 (17 pts), boolean chains 7, loops 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. This shape REPEATS in the file: one other method here (CompositeBackend.grep) 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":"libs/deepagents/deepagents/backends/composite.py"},"region":{"startLine":551}}}],"partialFingerprints":{"codehealthFindingId/v1":"648b701cd781c539e69fe2a910d8ca274b17c75a560cb5662b06a9c086abb933"}},{"ruleId":"D2","level":"warning","message":{"text":"build_release_notes._latest_earlier_prerelease_tag (cognitive 26): build_release_notes._latest_earlier_prerelease_tag has cognitive complexity 26 (threshold 15). Drivers by points: if/else 11 (22 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":".github/scripts/release/build_release_notes.py"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ad62fab9fb13512892597871181320d028c37facce7a54ddf63a62c9c6a4dd3"}},{"ruleId":"D2","level":"warning","message":{"text":"build_release_notes.build_release_notes (cognitive 26): build_release_notes.build_release_notes has cognitive complexity 26 (threshold 15). Drivers by points: if/else 16 (22 pts), boolean chains 3, ternaries 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/release/build_release_notes.py"},"region":{"startLine":1673}}}],"partialFingerprints":{"codehealthFindingId/v1":"89c9dddf750731493d3bb99794e1e46ba549a560c892159e895c5338610fc7ac"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._install_extra_unlocked (cognitive 25): DeepAgentsApp._install_extra_unlocked has cognitive complexity 25 (threshold 15). Drivers by points: if/else 11 (15 pts), error handling 4 (5 pts), boolean chains 3, 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":8037}}}],"partialFingerprints":{"codehealthFindingId/v1":"cedc4bc33f6c8218a0433038ade74beb60ae3e3fc10d709149f6354e3895a38c"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._handle_server_offload (cognitive 25): DeepAgentsApp._handle_server_offload has cognitive complexity 25 (threshold 15). Drivers by points: if/else 12 (13 pts), ternaries 6 (7 pts), error handling 4, boolean chains 1 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":18617}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a19972d12c06d05bfe2a34a7b319defa02465eeaf2560cc38ab530e4bf784cc"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._regroup_completed_tools (cognitive 25): DeepAgentsApp._regroup_completed_tools has cognitive complexity 25 (threshold 15). Drivers by points: if/else 7 (18 pts), ternaries 1 (3 pts), boolean chains 2, error handling 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":21873}}}],"partialFingerprints":{"codehealthFindingId/v1":"861ae552d1866c529205b5f3b05663382b55586ed86257ea0a9c7e5da16cb993"}},{"ruleId":"D2","level":"warning","message":{"text":"config._create_model_via_init (cognitive 25): config._create_model_via_init has cognitive complexity 25 (threshold 15). Drivers by points: if/else 9 (17 pts), error handling 4 (5 pts), ternaries 1 (2 pts), boolean chains 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/config.py"},"region":{"startLine":6533}}}],"partialFingerprints":{"codehealthFindingId/v1":"8babd926614c6a79f22a87475019c0cf5be4960a28b5da8d89824d8cb2761d0a"}},{"ruleId":"D2","level":"warning","message":{"text":"main._ripgrep_install_hint (cognitive 25): main._ripgrep_install_hint has cognitive complexity 25 (threshold 15). Drivers by points: if/else 14 (25 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":"libs/code/deepagents_code/main.py"},"region":{"startLine":1790}}}],"partialFingerprints":{"codehealthFindingId/v1":"7805fa4d423b00cc5539e1f0e66a82db0f31ed5105ffbd0beb0d61afbd2b4ca9"}},{"ruleId":"D2","level":"warning","message":{"text":"_ContextUsage.render (cognitive 25): _ContextUsage.render has cognitive complexity 25 (threshold 15). Drivers by points: if/else 9 (15 pts), boolean chains 5, ternaries 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":"libs/code/deepagents_code/tui/widgets/context_usage.py"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c0ac957629b1f92a74d08d3ff711e66281e9e328fbdb5c35f6d369914c54851"}},{"ruleId":"D2","level":"warning","message":{"text":"diff._compose_diff_content (cognitive 25): diff._compose_diff_content has cognitive complexity 25 (threshold 15). Drivers by points: if/else 8 (14 pts), loops 2 (4 pts), ternaries 2 (4 pts), boolean chains 3 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/diff.py"},"region":{"startLine":817}}}],"partialFingerprints":{"codehealthFindingId/v1":"92ab3febaa37df74a9570329f23a9ae537459ec71407262e9e8ac7af4ea7b53f"}},{"ruleId":"D2","level":"warning","message":{"text":"diff._highlighted_rows (cognitive 25): diff._highlighted_rows has cognitive complexity 25 (threshold 15). Drivers by points: if/else 8 (17 pts), loops 2 (3 pts), ternaries 1 (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":"libs/code/deepagents_code/tui/widgets/diff.py"},"region":{"startLine":879}}}],"partialFingerprints":{"codehealthFindingId/v1":"48555c2f4a1c02689f1b073d454e1d8d61a6126430b9356a9747bbcb9e072f47"}},{"ruleId":"D2","level":"warning","message":{"text":"CompositeBackend.glob (cognitive 25): CompositeBackend.glob has cognitive complexity 25 (threshold 15). Drivers by points: if/else 7 (15 pts), boolean chains 5, ternaries 1 (3 pts), loops 1 (2 pts) (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body. This shape REPEATS in the file: one other method here (CompositeBackend.aglob) 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":"libs/deepagents/deepagents/backends/composite.py"},"region":{"startLine":613}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f10aa92391047476d8498d2d8a8ea0d183eeea300b1bca7337dc37acc9c2102"}},{"ruleId":"D2","level":"warning","message":{"text":"CompositeBackend.aglob (cognitive 25): CompositeBackend.aglob has cognitive complexity 25 (threshold 15). Drivers by points: if/else 7 (15 pts), boolean chains 5, ternaries 1 (3 pts), loops 1 (2 pts) (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body. This shape REPEATS in the file: one other method here (CompositeBackend.glob) 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":"libs/deepagents/deepagents/backends/composite.py"},"region":{"startLine":665}}}],"partialFingerprints":{"codehealthFindingId/v1":"7eb3857223af096f8472fd07ecfb3761e969e50f84f34400f148dbc4fb332ce4"}},{"ruleId":"D2","level":"warning","message":{"text":"StoreConversationArchive.text_entries (cognitive 25): StoreConversationArchive.text_entries has cognitive complexity 25 (threshold 15). Drivers by points: if/else 8 (14 pts), boolean chains 8, ternaries 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":"libs/talon/deepagents_talon/store_archive.py"},"region":{"startLine":389}}}],"partialFingerprints":{"codehealthFindingId/v1":"705da43c987beab30e872a211430c5a8665a44cfb256de0f6d063f34a3221456"}},{"ruleId":"D2","level":"warning","message":{"text":"RepositoryBounds.preflight (cognitive 24): RepositoryBounds.preflight has cognitive complexity 24 (threshold 15). Drivers by points: if/else 13 (18 pts), boolean chains 3, ternaries 2, 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":"libs/code/deepagents_code/_repository_bounds.py"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec3b029ca840546dc2960b80174abd2e0e09765ecb6f7a942df834fb2eb621a7"}},{"ruleId":"D2","level":"warning","message":{"text":"ToolCallBuffer.parse_args (cognitive 24): ToolCallBuffer.parse_args has cognitive complexity 24 (threshold 15). Drivers by points: if/else 12 (17 pts), boolean chains 5, error handling 1, ternaries 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/_tool_stream.py"},"region":{"startLine":622}}}],"partialFingerprints":{"codehealthFindingId/v1":"18a5a7701ed45e6c0d4443c115bccfa0bbb98bfe4d55fa25063de29d7920b3c4"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._run_session_start_sequence (cognitive 24): DeepAgentsApp._run_session_start_sequence has cognitive complexity 24 (threshold 15). Drivers by points: if/else 14 (15 pts), boolean chains 6, error handling 1 (2 pts), ternaries 1 (nesting depth added 2). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":11872}}}],"partialFingerprints":{"codehealthFindingId/v1":"34532e883017fc21f2eb275c0cb73297003d14e9a8baa03156965c4c9367124e"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._replace_server_after_cwd_switch (cognitive 24): DeepAgentsApp._replace_server_after_cwd_switch has cognitive complexity 24 (threshold 15). Drivers by points: if/else 8 (11 pts), error handling 5 (8 pts), loops 1 (3 pts), boolean chains 2 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":30710}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5340f0435851fe392d610175d4a097df5ed2b38af0f345e4c75f738fe40b22c"}},{"ruleId":"D2","level":"warning","message":{"text":"inspect_sessions._content_text (cognitive 24): inspect_sessions._content_text has cognitive complexity 24 (threshold 15). Drivers by points: if/else 10 (21 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":"libs/code/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py"},"region":{"startLine":407}}}],"partialFingerprints":{"codehealthFindingId/v1":"548ce7bbfa583442b8d668f9f24d8d93685edad2ded62979d6e35a7bd24bb8f1"}},{"ruleId":"D2","level":"warning","message":{"text":"cost_tracking._merge_cost_breakdowns (cognitive 24): cost_tracking._merge_cost_breakdowns has cognitive complexity 24 (threshold 15). Drivers by points: if/else 6 (13 pts), loops 4 (7 pts), boolean chains 4 (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":"libs/code/deepagents_code/cost_tracking.py"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a3759371535eca787b6b6d99cab3210607acec87f05b7cd58a3111381ed29c7"}},{"ruleId":"D2","level":"warning","message":{"text":"main.apply_stdin_pipe (cognitive 24): main.apply_stdin_pipe has cognitive complexity 24 (threshold 15). Drivers by points: if/else 11 (15 pts), error handling 6 (7 pts), boolean chains 1, ternaries 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":3750}}}],"partialFingerprints":{"codehealthFindingId/v1":"13fa444d23a0dbc49a07444e6e09d01257530a26f29e395062396361d4651b25"}},{"ruleId":"D2","level":"warning","message":{"text":"offload_api.workspace (cognitive 24): offload_api.workspace has cognitive complexity 24 (threshold 15). Drivers by points: if/else 12 (15 pts), error handling 5 (6 pts), boolean chains 3 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/offload_api.py"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"19484447c629c4aad3d4a0ed6a89b81c60362e9e9eba454686ff9334e9e99548"}},{"ruleId":"D2","level":"warning","message":{"text":"sessions._count_messages_from_deltas (cognitive 24): sessions._count_messages_from_deltas has cognitive complexity 24 (threshold 15). Drivers by points: if/else 7 (14 pts), ternaries 2 (5 pts), loops 2 (3 pts), error handling 1 (2 pts) (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/sessions.py"},"region":{"startLine":1488}}}],"partialFingerprints":{"codehealthFindingId/v1":"d13962b69427ffa19b604f5785b5270de3b36863ca51a010fc14b23143d8c019"}},{"ruleId":"D2","level":"warning","message":{"text":"state._load_manager_state (cognitive 24): state._load_manager_state has cognitive complexity 24 (threshold 15). Drivers by points: if/else 3 (9 pts), ternaries 2 (7 pts), boolean chains 3, loops 2 (3 pts), error handling 1 (2 pts) (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/modals/plugin_manager/state.py"},"region":{"startLine":312}}}],"partialFingerprints":{"codehealthFindingId/v1":"f69ff219487902c724bc5dea7b71afdc3b5c42d54cb3e2ee13bf43898ce9665f"}},{"ruleId":"D2","level":"warning","message":{"text":"textual_adapter._handle_interrupt_cleanup (cognitive 24): textual_adapter._handle_interrupt_cleanup has cognitive complexity 24 (threshold 15). Drivers by points: error handling 7 (11 pts), if/else 8 (10 pts), boolean chains 1, loops 1, ternaries 1 (nesting depth added 6). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/textual_adapter.py"},"region":{"startLine":4468}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b3a065e66cbe51953861b8de545d0d2e2a07041683240bcad4f7e55afb709a0"}},{"ruleId":"D2","level":"warning","message":{"text":"_DeepAgentsSummarizationMiddleware._truncate_args (cognitive 24): _DeepAgentsSummarizationMiddleware._truncate_args has cognitive complexity 24 (threshold 15). Drivers by points: if/else 9 (19 pts), loops 2 (4 pts), boolean chains 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/summarization.py"},"region":{"startLine":1074}}}],"partialFingerprints":{"codehealthFindingId/v1":"972257037947258948559b2c34d67be3d3fa84454dc2e216ada3f90967c3735d"}},{"ruleId":"D2","level":"warning","message":{"text":"aggregate_shards.render_step_summary (cognitive 24): aggregate_shards.render_step_summary has cognitive complexity 24 (threshold 15). Drivers by points: ternaries 6 (10 pts), if/else 6, boolean chains 4, loops 2 (4 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/evals/aggregate_shards.py"},"region":{"startLine":549}}}],"partialFingerprints":{"codehealthFindingId/v1":"104aea4235d40f48686f5a967fdf5fbb5c81dde2c83c15ae508a7459f6df9ad3"}},{"ruleId":"D2","level":"warning","message":{"text":"check_release_deps.find_follow_up_conflicts (cognitive 24): check_release_deps.find_follow_up_conflicts has cognitive complexity 24 (threshold 15). Drivers by points: if/else 8 (14 pts), loops 4 (5 pts), error handling 2 (4 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":".github/scripts/release/check_release_deps.py"},"region":{"startLine":797}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0ae5095dd71b4b00c4d9fcae0c6bbef9eee349c7292b0ef4dcb6613671ad105"}},{"ruleId":"D2","level":"warning","message":{"text":"check_wheel_dep_freshness.compare_wheel_with_pypi (cognitive 24): check_wheel_dep_freshness.compare_wheel_with_pypi has cognitive complexity 24 (threshold 15). Drivers by points: if/else 6 (14 pts), ternaries 2 (4 pts), boolean chains 3, loops 2 (3 pts) (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/release/check_wheel_dep_freshness.py"},"region":{"startLine":794}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7531fe445aaa4f695a3d368851b68e83541337adab08ed968fb215e80a213ab"}},{"ruleId":"D2","level":"warning","message":{"text":"RepositoryBounds.apreflight (cognitive 23): RepositoryBounds.apreflight has cognitive complexity 23 (threshold 15). Drivers by points: if/else 12 (17 pts), boolean chains 3, ternaries 2, 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":"libs/code/deepagents_code/_repository_bounds.py"},"region":{"startLine":340}}}],"partialFingerprints":{"codehealthFindingId/v1":"0acf2e1147da2fd1e0d88407492bc7b2ef292cafaea49cf8d6feb1c7b8db5e60"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._mount_message_unlocked (cognitive 23): DeepAgentsApp._mount_message_unlocked has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (11 pts), boolean chains 6, error handling 3 (4 pts), ternaries 1 (2 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":21561}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3fb6b3b9e51500814181a685539ecee3df2b22ab9619e80fd586aa24e4ff038"}},{"ruleId":"D2","level":"warning","message":{"text":"auto_mode._classifier_context (cognitive 23): auto_mode._classifier_context has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (15 pts), loops 3 (4 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":"libs/code/deepagents_code/auto_mode.py"},"region":{"startLine":1649}}}],"partialFingerprints":{"codehealthFindingId/v1":"0760c616309b6f9b56c71bffe88b41240515aad1801e358e9d874b624a492435"}},{"ruleId":"D2","level":"warning","message":{"text":"CostTrackingMiddleware._after_agent_update (cognitive 23): CostTrackingMiddleware._after_agent_update has cognitive complexity 23 (threshold 15). Drivers by points: if/else 6 (15 pts), boolean chains 4, ternaries 2 (4 pts) (nesting depth added 11). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/cost_tracking.py"},"region":{"startLine":3011}}}],"partialFingerprints":{"codehealthFindingId/v1":"406396a7c038f97945fb0cabbee8a2ea6af10738d67b55f5daab5d789bc879dc"}},{"ruleId":"D2","level":"warning","message":{"text":"mcp_auth.build_oauth_provider (cognitive 23): mcp_auth.build_oauth_provider has cognitive complexity 23 (threshold 15). Drivers by points: if/else 7 (13 pts), ternaries 3 (9 pts), boolean chains 1 (nesting depth added 12). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/mcp_auth.py"},"region":{"startLine":1789}}}],"partialFingerprints":{"codehealthFindingId/v1":"c60b90fe5eb7d3bd821101121994497eaf5ced5ed8ce4f0dfea4cd02c5872e0c"}},{"ruleId":"D2","level":"warning","message":{"text":"model_catalog.load_model_catalog (cognitive 23): model_catalog.load_model_catalog has cognitive complexity 23 (threshold 15). Drivers by points: if/else 7 (12 pts), error handling 2 (4 pts), boolean chains 3, loops 2, ternaries 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":"libs/code/deepagents_code/model_catalog.py"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"372e3010dfeaa4429f8fbf4fc46b495a11e7bf760f41a16e7aac04c810fe2480"}},{"ruleId":"D2","level":"warning","message":{"text":"model_config.parse_model_allowlist (cognitive 23): model_config.parse_model_allowlist has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (19 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":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":531}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee753e828c95d82f9eac167e792e92625bd4753e9953acc8426ac406d1d04a8e"}},{"ruleId":"D2","level":"warning","message":{"text":"model_config.load_mcp_server_trust_lists (cognitive 23): model_config.load_mcp_server_trust_lists has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (11 pts), ternaries 7, boolean chains 5 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, 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":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":5676}}}],"partialFingerprints":{"codehealthFindingId/v1":"97fc92281861894ec77dcc87d17264e1f3b3c9063807216b14e4d55fa820819e"}},{"ruleId":"D2","level":"warning","message":{"text":"model_config.add_enabled_project_mcp_servers (cognitive 23): model_config.add_enabled_project_mcp_servers has cognitive complexity 23 (threshold 15). Drivers by points: if/else 13 (17 pts), boolean chains 3, error handling 2, loops 1 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":5942}}}],"partialFingerprints":{"codehealthFindingId/v1":"926e030b145d8888f0f120863fc391bd143dedb5bf5959e5f67730756d051b0b"}},{"ruleId":"D2","level":"warning","message":{"text":"CLICompactionMiddleware._summarization_for_runtime (cognitive 23): CLICompactionMiddleware._summarization_for_runtime has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (10 pts), ternaries 3 (6 pts), boolean chains 4, error handling 1 (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":"libs/code/deepagents_code/offload_middleware.py"},"region":{"startLine":1330}}}],"partialFingerprints":{"codehealthFindingId/v1":"b543bf5b3fcee0961f13f1de3a5eeec3a0c85da5d753cde885d510917c59d411"}},{"ruleId":"D2","level":"warning","message":{"text":"commands._trust (cognitive 23): commands._trust has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (17 pts), error handling 1 (2 pts), loops 1 (2 pts), match/switch 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":"libs/code/deepagents_code/skills/commands.py"},"region":{"startLine":874}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f9d0dbb45046999903b0794783e9f91881d5a65c76db505520ae4df33c1e430"}},{"ruleId":"D2","level":"warning","message":{"text":"autocomplete._get_project_files (cognitive 23): autocomplete._get_project_files has cognitive complexity 23 (threshold 15). Drivers by points: if/else 6 (15 pts), loops 3 (6 pts), boolean chains 1, error handling 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/autocomplete.py"},"region":{"startLine":671}}}],"partialFingerprints":{"codehealthFindingId/v1":"16a3c81d5ca2088ba694487e2514562784d089e0f5fb23be229be3b1ff51d865"}},{"ruleId":"D2","level":"warning","message":{"text":"messages._markdown_to_content (cognitive 23): messages._markdown_to_content has cognitive complexity 23 (threshold 15). Drivers by points: if/else 5 (13 pts), error handling 1 (4 pts), loops 3 (4 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":"libs/code/deepagents_code/tui/widgets/messages.py"},"region":{"startLine":6032}}}],"partialFingerprints":{"codehealthFindingId/v1":"57fce16cc1554aa01fe440053bff84d5ee1c7dc32f1aef8cec35dbf5b0564743"}},{"ruleId":"D2","level":"warning","message":{"text":"_Visitor.__init__ (cognitive 23): _Visitor.__init__ has cognitive complexity 23 (threshold 15). Drivers by points: if/else 3 (10 pts), loops 3 (7 pts), boolean chains 6 (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":"libs/code/scripts/check_process_cwd.py"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"a59e558df3c27120bd1c0768396b09b601a2356804bb01a47d8dece6872195ea"}},{"ruleId":"D2","level":"warning","message":{"text":"_messages_reducer._messages_delta_reducer (cognitive 23): _messages_reducer._messages_delta_reducer has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (15 pts), loops 4, boolean chains 3, ternaries 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/_messages_reducer.py"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d9af43ccb3f4648bc8301eb56dfd8999dc67be2c2d783a950050b541811b1b7"}},{"ruleId":"D2","level":"warning","message":{"text":"installMessageKeyCompatibility (cognitive 23): installMessageKeyCompatibility has cognitive complexity 23 (threshold 15). Drivers by points: boolean chains 10, if/else 4 (6 pts), ternaries 3 (6 pts), loops 1 (nesting depth added 5). Most of this is not in the body itself: 6 of the 23 points are its own statements and the rest belongs to 2 function items inside it that branch (get, a function literal at line 169). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/channels/whatsapp_bridge/id_compat.js"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"add12c5c38d7f287544cbdaf4a555bc368b0db39d6e8a7ad872c2a09dcbaccef"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._handle_goal_command (cognitive 22): DeepAgentsApp._handle_goal_command has cognitive complexity 22 (threshold 15). Drivers by points: if/else 12 (16 pts), boolean chains 5, 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":15834}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dc459c09a423e2eff9da5ccea20240e91c16efc55b1068ade469b384c4f661e"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._handle_rubric_command (cognitive 22): DeepAgentsApp._handle_rubric_command has cognitive complexity 22 (threshold 15). Drivers by points: if/else 13 (18 pts), error handling 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":16932}}}],"partialFingerprints":{"codehealthFindingId/v1":"5992c38119fb10f749997dc1f35e0eb1dd14992cc6a4b55fa09590017773c71b"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._set_rubric_max_iterations (cognitive 22): DeepAgentsApp._set_rubric_max_iterations has cognitive complexity 22 (threshold 15). Drivers by points: if/else 10 (13 pts), ternaries 2 (5 pts), boolean chains 4 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":17281}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f94076e8ff76aacc0c44c2b11bd9c72fff1ccd381bbe8a1a167e48525e41575"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._generate_thread_name (cognitive 22): DeepAgentsApp._generate_thread_name has cognitive complexity 22 (threshold 15). Drivers by points: if/else 10 (16 pts), boolean chains 5, error handling 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":19297}}}],"partialFingerprints":{"codehealthFindingId/v1":"96c58f681b4107234102daa5acfe96194c94c01dc6b42273c012a1d55d45323e"}},{"ruleId":"D2","level":"warning","message":{"text":"BtwOperation._resolve_context (cognitive 22): BtwOperation._resolve_context has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (10 pts), ternaries 3 (6 pts), boolean chains 5, 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":"libs/code/deepagents_code/btw.py"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ff56e73140d645dab842f30940ab3cfcb004b51fcbc289f20fde66d26f15963"}},{"ruleId":"D2","level":"warning","message":{"text":"auth._run_set (cognitive 22): auth._run_set has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (13 pts), ternaries 3 (4 pts), boolean chains 3, 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":"libs/code/deepagents_code/client/commands/auth.py"},"region":{"startLine":372}}}],"partialFingerprints":{"codehealthFindingId/v1":"e51b3ce66c9ab0562217326d34166d04d35cc84768aef412e355350c0d579104"}},{"ruleId":"D2","level":"warning","message":{"text":"server._terminate_server_process (cognitive 22): server._terminate_server_process has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (11 pts), error handling 6 (8 pts), ternaries 2, boolean chains 1 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/client/launch/server.py"},"region":{"startLine":603}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad7ef07c9aa12c6b0503b0dca9e03186f46afb45dd5ea1aab7f8aab74c4ab89a"}},{"ruleId":"D2","level":"warning","message":{"text":"config._get_default_model_spec (cognitive 22): config._get_default_model_spec has cognitive complexity 22 (threshold 15). Drivers by points: if/else 10 (18 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/config.py"},"region":{"startLine":5672}}}],"partialFingerprints":{"codehealthFindingId/v1":"255fa02ddbec88467e01150cb726be9fc1174182690685fbf45d0dff3453a3f9"}},{"ruleId":"D2","level":"warning","message":{"text":"ConfigOption.__post_init__ (cognitive 22): ConfigOption.__post_init__ has cognitive complexity 22 (threshold 15). Drivers by points: if/else 13 (14 pts), boolean chains 8 (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":"libs/code/deepagents_code/config_manifest.py"},"region":{"startLine":716}}}],"partialFingerprints":{"codehealthFindingId/v1":"03fb6f518f50feca7e5cbe9524ccbcf58a41bb9e5dc37c1a8bcbf17ae1824ccc"}},{"ruleId":"D2","level":"warning","message":{"text":"providers.ranked_environment_value (cognitive 22): providers.ranked_environment_value has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (17 pts), loops 2, ternaries 1 (2 pts), boolean chains 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/configuration/providers.py"},"region":{"startLine":454}}}],"partialFingerprints":{"codehealthFindingId/v1":"218d482d98ead5921224e2b6623647144e9ec8656adfba09889d8ab7425f8a71"}},{"ruleId":"D2","level":"warning","message":{"text":"cost_tracking._read_override_source (cognitive 22): cost_tracking._read_override_source has cognitive complexity 22 (threshold 15). Drivers by points: if/else 10 (16 pts), error handling 4, boolean chains 2 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/cost_tracking.py"},"region":{"startLine":1020}}}],"partialFingerprints":{"codehealthFindingId/v1":"cac77691cd1f8a45a56ea2a2e78e7f240d12b1d0f9016ffde08da7a8034531b6"}},{"ruleId":"D2","level":"warning","message":{"text":"FileOpTracker._populate_after_content (cognitive 22): FileOpTracker._populate_after_content has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (12 pts), error handling 3 (6 pts), boolean chains 4 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/file_ops.py"},"region":{"startLine":960}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6e3bdab800757a1e35fa03d29879f7d98113ebe1459fa8353103e10abe6444b"}},{"ruleId":"D2","level":"warning","message":{"text":"migration.migrate_legacy_hooks (cognitive 22): migration.migrate_legacy_hooks has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (17 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":"libs/code/deepagents_code/hooks/migration.py"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"93e83d30ccfee578b7e767c13bd9d53d410ef20ce3f475a86c6e3b365e7585c2"}},{"ruleId":"D2","level":"warning","message":{"text":"model_api.model_metadata (cognitive 22): model_api.model_metadata has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (10 pts), boolean chains 9, error handling 3 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, 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":"libs/code/deepagents_code/model_api.py"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"4518266d20ebc521fb575bd45f75d47ae744e645f6b38981cb768d08d921b51c"}},{"ruleId":"D2","level":"warning","message":{"text":"utils._format_grep_with_context (cognitive 22): utils._format_grep_with_context has cognitive complexity 22 (threshold 15). Drivers by points: loops 7 (15 pts), ternaries 1 (4 pts), if/else 1 (3 pts) (nesting depth added 13). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/utils.py"},"region":{"startLine":1167}}}],"partialFingerprints":{"codehealthFindingId/v1":"01b9929548fc459f0619fecf94ec70cb263204ed8e81de37ab8bb6a6b47b755a"}},{"ruleId":"D2","level":"warning","message":{"text":"run_trials._print_summary (cognitive 22): run_trials._print_summary has cognitive complexity 22 (threshold 15). Drivers by points: if/else 6 (10 pts), ternaries 3 (7 pts), loops 3 (4 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":"libs/evals/scripts/run_trials.py"},"region":{"startLine":404}}}],"partialFingerprints":{"codehealthFindingId/v1":"543fe5f7bae0f6531694b03b3c93886e5119c5f0cd86b0e6dd46a676dfc749ba"}},{"ruleId":"D2","level":"warning","message":{"text":"aggregate_shards.aggregate (cognitive 22): aggregate_shards.aggregate has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (18 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/evals/aggregate_shards.py"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf8db80281efe684fd0cd4f12a74b5f47268677938d80bce2fa133aaa4be091e"}},{"ruleId":"D2","level":"warning","message":{"text":"build_release_notes.resolve_previous_tag (cognitive 22): build_release_notes.resolve_previous_tag has cognitive complexity 22 (threshold 15). Drivers by points: if/else 10 (17 pts), error handling 1 (2 pts), ternaries 1 (2 pts), boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/release/build_release_notes.py"},"region":{"startLine":367}}}],"partialFingerprints":{"codehealthFindingId/v1":"606ed5130113770e2cb054b3b997bf447a6ece0e950c3d74016a25bc86abef0b"}},{"ruleId":"D2","level":"warning","message":{"text":"_ask_user_types.render_ask_user_transcript_for_display (cognitive 21): _ask_user_types.render_ask_user_transcript_for_display has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (13 pts), ternaries 1 (4 pts), boolean chains 2, 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":"libs/code/deepagents_code/_ask_user_types.py"},"region":{"startLine":612}}}],"partialFingerprints":{"codehealthFindingId/v1":"5caf6023a540371b94c2783ff318e89ea17d4ccac791a71c64386e26c925808d"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._start_server_background (cognitive 21): DeepAgentsApp._start_server_background has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10 (12 pts), error handling 3 (5 pts), boolean chains 2, ternaries 1 (2 pts) (nesting depth added 5). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":6305}}}],"partialFingerprints":{"codehealthFindingId/v1":"813e1e1b38afad170f12321622264492dc2dd87fc30ae9cfbdbfe6e082556947"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp.on_deep_agents_app_server_start_failed (cognitive 21): DeepAgentsApp.on_deep_agents_app_server_start_failed has cognitive complexity 21 (threshold 15). Drivers by points: if/else 12 (16 pts), boolean chains 3, ternaries 2 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":6550}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ee961e7f454f91af78a5409c078be096ce6ddb42a45e5db89cd3db31a67de83"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._finish_pending_goal_rubric_review (cognitive 21): DeepAgentsApp._finish_pending_goal_rubric_review has cognitive complexity 21 (threshold 15). Drivers by points: if/else 11 (14 pts), boolean chains 3, error handling 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":16403}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ef1a6f1dc886abad72930192f950b276a992fa40251092dd1cfa8eefb674a24"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._set_auto_classifier_model (cognitive 21): DeepAgentsApp._set_auto_classifier_model has cognitive complexity 21 (threshold 15). Drivers by points: if/else 11 (16 pts), error handling 1 (2 pts), ternaries 1 (2 pts), boolean chains 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":24100}}}],"partialFingerprints":{"codehealthFindingId/v1":"3966d8d53a2de26692407d01c81189748b4e9dfb577f71e8a82e4296c79de9a9"}},{"ruleId":"D2","level":"warning","message":{"text":"auto_mode._ask_user_exchange_rows (cognitive 21): auto_mode._ask_user_exchange_rows has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (15 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":"libs/code/deepagents_code/auto_mode.py"},"region":{"startLine":1463}}}],"partialFingerprints":{"codehealthFindingId/v1":"e88ac4e62984487b2cd98eeefd24052aa148f284694e893f02f33df8e281c9fc"}},{"ruleId":"D2","level":"warning","message":{"text":"config._dotenv_environment (cognitive 21): config._dotenv_environment has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (9 pts), boolean chains 6, error handling 3 (4 pts), 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":"libs/code/deepagents_code/config.py"},"region":{"startLine":634}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6c50a6e0a30f5caeb04ce4c35beeeb0805a905d410d1bc6d3c812bccd03db06"}},{"ruleId":"D2","level":"warning","message":{"text":"ToolCallMessage._format_ask_user_output (cognitive 21): ToolCallMessage._format_ask_user_output has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (15 pts), ternaries 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":"libs/code/deepagents_code/tui/widgets/messages.py"},"region":{"startLine":3939}}}],"partialFingerprints":{"codehealthFindingId/v1":"21ad179d057319f21b39e1214bbb08581267e53f69d25961c62377461951527a"}},{"ruleId":"D2","level":"warning","message":{"text":"_DeepAgentsSummarizationMiddleware._determine_truncate_cutoff_index (cognitive 21): _DeepAgentsSummarizationMiddleware._determine_truncate_cutoff_index has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (19 pts), loops 1 (2 pts) (nesting depth added 11). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/summarization.py"},"region":{"startLine":957}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f2d78f873bed3e3d8d992a526b5b5039f45988210ac31f4624b9892050bbdd7"}},{"ruleId":"D2","level":"warning","message":{"text":"aggregate_unified_compare._read_tasks (cognitive 21): aggregate_unified_compare._read_tasks has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (13 pts), boolean chains 3, error handling 1 (2 pts), ternaries 1 (2 pts), loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/evals/aggregate_unified_compare.py"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b325535d8bb1e59a3f1d8d2119340a4f96f2b6a01db1ac0e7ce0d176e74f2d1"}},{"ruleId":"D2","level":"warning","message":{"text":"collect_langsmith_usage.summarize_runs (cognitive 21): collect_langsmith_usage.summarize_runs has cognitive complexity 21 (threshold 15). Drivers by points: if/else 4 (7 pts), loops 3 (7 pts), ternaries 2 (4 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":".github/scripts/evals/collect_langsmith_usage.py"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"bde27b8b6595ee844d74f0ee0379ff0fc280352a83546cc4c408861e6ff70b89"}},{"ruleId":"D2","level":"warning","message":{"text":"build_release_notes._collect_issue_reporters (cognitive 21): build_release_notes._collect_issue_reporters has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (18 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":".github/scripts/release/build_release_notes.py"},"region":{"startLine":1217}}}],"partialFingerprints":{"codehealthFindingId/v1":"26bc0568e352af379a13b757a2d89327b1d28538ae98a8732cfe24895a7e0ff3"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentServerACP.set_config_option (cognitive 20): AgentServerACP.set_config_option has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (19 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":"libs/acp/deepagents_acp/server.py"},"region":{"startLine":449}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b8f27349a24840ee4793b23a5627094a7a1545649b4872ea686838e086fef67"}},{"ruleId":"D2","level":"warning","message":{"text":"_dep_floor_check._prompt_if_editable_deps_stale (cognitive 20): _dep_floor_check._prompt_if_editable_deps_stale has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (19 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":"libs/code/deepagents_code/_dep_floor_check.py"},"region":{"startLine":704}}}],"partialFingerprints":{"codehealthFindingId/v1":"3af5805d09499d88e022d672bf2d76e5f0e51094943fd00aa3097e483e7d75ff"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._refresh_cache_expiry_banner (cognitive 20): DeepAgentsApp._refresh_cache_expiry_banner has cognitive complexity 20 (threshold 15). Drivers by points: if/else 4 (8 pts), ternaries 2 (7 pts), loops 1 (3 pts), boolean chains 2 (nesting depth added 11). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":9698}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e24b35ed5460c49621acf9fb725044aa66f2f26b810696dd166434e3c822e36"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._move_transcript_window_to_tail (cognitive 20): DeepAgentsApp._move_transcript_window_to_tail has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (13 pts), loops 2 (3 pts), boolean chains 2, ternaries 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":21688}}}],"partialFingerprints":{"codehealthFindingId/v1":"e73156820aa3f9b5cb8282ede8579871d7cef9721c4fd0d64aa881b943995038"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._fingerprint_component_paths (cognitive 20): DeepAgentsApp._fingerprint_component_paths has cognitive complexity 20 (threshold 15). Drivers by points: if/else 5 (10 pts), error handling 5 (9 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":27422}}}],"partialFingerprints":{"codehealthFindingId/v1":"e12282106a56e21e68b79be0aead778c58d1795646eb3665a7379e1ef1b12205"}},{"ruleId":"D2","level":"warning","message":{"text":"auto_mode._ask_user_question_count (cognitive 20): auto_mode._ask_user_question_count has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 5, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/auto_mode.py"},"region":{"startLine":1334}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca1ec9bd67bdacc0e9588468ae8eb7475bde7bcf0fcaf33c34e1cea0f3aa34ee"}},{"ruleId":"D2","level":"warning","message":{"text":"server.wait_for_server_healthy (cognitive 20): server.wait_for_server_healthy has cognitive complexity 20 (threshold 15). Drivers by points: if/else 5 (12 pts), ternaries 2 (4 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":"libs/code/deepagents_code/client/launch/server.py"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"28071ea3a5de74b64e6426d72016bee56cd9a1bcb5006d8af9f5ee54b4df46c9"}},{"ruleId":"D2","level":"warning","message":{"text":"RemoteAgent.aoffload (cognitive 20): RemoteAgent.aoffload has cognitive complexity 20 (threshold 15). Drivers by points: if/else 5 (10 pts), ternaries 3 (5 pts), boolean chains 2, error handling 1 (2 pts), loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/client/remote_client.py"},"region":{"startLine":657}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd2ef300357fccf3369af034f9a64330403548ed847da9913dece25bc380a826"}},{"ruleId":"D2","level":"warning","message":{"text":"extras_info.get_optional_dependency_status (cognitive 20): extras_info.get_optional_dependency_status has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (13 pts), error handling 3 (5 pts), boolean chains 1, loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/extras_info.py"},"region":{"startLine":1229}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbca69deb14f10e248a542cdbf4ada3ecd1b440381fcc7071a13811ad97a6f1c"}},{"ruleId":"D2","level":"warning","message":{"text":"runner.run_command_handler (cognitive 20): runner.run_command_handler has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (10 pts), error handling 6, boolean chains 2, ternaries 2 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/hooks/runner.py"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"5667533017b9dc3b3a557e151ec22d387de0b7469afd772bdf207341384e0170"}},{"ruleId":"D2","level":"warning","message":{"text":"HooksSnapshot.from_config (cognitive 20): HooksSnapshot.from_config has cognitive complexity 20 (threshold 15). Drivers by points: if/else 3 (7 pts), loops 3 (6 pts), ternaries 1 (4 pts), boolean chains 3 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/hooks/snapshot.py"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"87b2ce9490c9f6b7afd1e11c4a7fb186b16fc9b361b93bb47059cb7fb01fdffb"}},{"ruleId":"D2","level":"warning","message":{"text":"model_config._profile_from_ollama_show_payload (cognitive 20): model_config._profile_from_ollama_show_payload has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (16 pts), boolean chains 4 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":2308}}}],"partialFingerprints":{"codehealthFindingId/v1":"af9f89b79bf0115c047ddbdbd2a0a990a2e47a75dcfa8af73a9e453d16187e89"}},{"ruleId":"D2","level":"warning","message":{"text":"store.cache_and_register_plugin (cognitive 20): store.cache_and_register_plugin has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (14 pts), error handling 3 (4 pts), boolean chains 2 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/plugins/store.py"},"region":{"startLine":485}}}],"partialFingerprints":{"codehealthFindingId/v1":"5495b3d98543500945406793eba4e7fcc9238aa3f37f5208b648072ce5a7671f"}},{"ruleId":"D2","level":"warning","message":{"text":"ToolCallMessage._update_output_display (cognitive 20): ToolCallMessage._update_output_display has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (14 pts), boolean chains 6 (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":"libs/code/deepagents_code/tui/widgets/messages.py"},"region":{"startLine":4039}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f047e02ac041871174cb4077fba4ec8dc0da2d2d44cb9e0bc59e68fd42da412"}},{"ruleId":"D2","level":"warning","message":{"text":"LazyToolGroupSummary._set_expanded (cognitive 20): LazyToolGroupSummary._set_expanded has cognitive complexity 20 (threshold 15). Drivers by points: error handling 3 (7 pts), ternaries 2 (5 pts), if/else 4, boolean chains 2, loops 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":"libs/code/deepagents_code/tui/widgets/messages.py"},"region":{"startLine":5431}}}],"partialFingerprints":{"codehealthFindingId/v1":"370909b35528bc45c7b6a87576ebc28c83032bcd4e2753150cbac5ddd4a64180"}},{"ruleId":"D2","level":"warning","message":{"text":"ContextHubBackend.grep (cognitive 20): ContextHubBackend.grep has cognitive complexity 20 (threshold 15). Drivers by points: if/else 4 (11 pts), boolean chains 3, loops 2 (3 pts), ternaries 2, error handling 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/context_hub.py"},"region":{"startLine":596}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7a4af53ac480018533b324b08dbd36e10b91cc665b25bb10f8f3c6c8894803a"}},{"ruleId":"D2","level":"warning","message":{"text":"FilesystemMiddleware.__init__ (cognitive 20): FilesystemMiddleware.__init__ has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9, boolean chains 8, ternaries 3. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":1891}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6c86370ec92717e78feee09bca883d1c91c3fa8be51b156d2024e43a5a22c64"}},{"ruleId":"D2","level":"warning","message":{"text":"_DeepAgentsSummarizationMiddleware._offload_inline_media (cognitive 20): _DeepAgentsSummarizationMiddleware._offload_inline_media has cognitive complexity 20 (threshold 15). Drivers by points: if/else 5 (13 pts), error handling 1 (3 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body. This shape REPEATS in the file: one other method here (_DeepAgentsSummarizationMiddleware._aoffload_inline_media) 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":"libs/deepagents/deepagents/middleware/summarization.py"},"region":{"startLine":1131}}}],"partialFingerprints":{"codehealthFindingId/v1":"f69629a31b59d5c0a6a653eee4de4089085b24d931afb93fe5478f115984382e"}},{"ruleId":"D2","level":"warning","message":{"text":"_DeepAgentsSummarizationMiddleware._aoffload_inline_media (cognitive 20): _DeepAgentsSummarizationMiddleware._aoffload_inline_media has cognitive complexity 20 (threshold 15). Drivers by points: if/else 5 (13 pts), error handling 1 (3 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body. This shape REPEATS in the file: one other method here (_DeepAgentsSummarizationMiddleware._offload_inline_media) 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":"libs/deepagents/deepagents/middleware/summarization.py"},"region":{"startLine":1213}}}],"partialFingerprints":{"codehealthFindingId/v1":"5635bfca97b5dab6a96026b482d435238fcdb511ff524d84d7edb6f785676fc2"}},{"ruleId":"D2","level":"warning","message":{"text":"run_trials.main (cognitive 20): run_trials.main has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (16 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/evals/scripts/run_trials.py"},"region":{"startLine":562}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c1228d557b2d73b3702d56654a052489cd6dcb7fb1652dd90145348a6a0fb1c"}},{"ruleId":"D2","level":"warning","message":{"text":"TalonHost._dispatch_background_results (cognitive 20): TalonHost._dispatch_background_results has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (15 pts), boolean chains 4, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/host.py"},"region":{"startLine":950}}}],"partialFingerprints":{"codehealthFindingId/v1":"9022b6f9e87b5ee9fcf48512170afdb7ebc52195251f72dd7c583d7b5c286bc4"}},{"ruleId":"D2","level":"warning","message":{"text":"curated_apply_only._changelog_path (cognitive 20): curated_apply_only._changelog_path has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (14 pts), boolean chains 4, loops 1, ternaries 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/checks/curated_apply_only.py"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0df625495431b074733a0b825cd9c52c4ddd9ec0ef275e4dd11b882deec065a"}},{"ruleId":"D2","level":"warning","message":{"text":"aggregate_shards.main (cognitive 20): aggregate_shards.main has cognitive complexity 20 (threshold 15). Drivers by points: if/else 11 (12 pts), boolean chains 7, ternaries 1 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/evals/aggregate_shards.py"},"region":{"startLine":675}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ce74ae9e368a96be8c8ee9b419550bbc1a5a41aa4a31032fab12a4547303d69"}},{"ruleId":"D2","level":"warning","message":{"text":"utils.extract_command_types (cognitive 19): utils.extract_command_types has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (13 pts), loops 2 (3 pts), error handling 1 (2 pts), boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/acp/deepagents_acp/utils.py"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0df42d6089de743909fdef8ba13b0518a2a42de1d33e8c17fce9e9a4035b197"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._handle_tools_command (cognitive 19): DeepAgentsApp._handle_tools_command has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (10 pts), error handling 2 (4 pts), boolean chains 3, 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":14337}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7954f7f9e71697e315fad3adfbaedeca4b52d7b7c7b33352d6fbc4aad8617af"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp.action_quit_or_interrupt (cognitive 19): DeepAgentsApp.action_quit_or_interrupt has cognitive complexity 19 (threshold 15). Drivers by points: if/else 12 (14 pts), boolean chains 5 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":22666}}}],"partialFingerprints":{"codehealthFindingId/v1":"e38404e54c3f7402d3226981b0a09318f03dadcea05ce4acb9caba9ce17d1266"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp.check_action (cognitive 19): DeepAgentsApp.check_action has cognitive complexity 19 (threshold 15). Drivers by points: if/else 11 (16 pts), boolean chains 3 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":26433}}}],"partialFingerprints":{"codehealthFindingId/v1":"354c822fe21fa6b9c6fc81c56aaf3f121c618910ca11d04041861f1e4765b490"}},{"ruleId":"D2","level":"warning","message":{"text":"extras._run_install_extra (cognitive 19): extras._run_install_extra has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (13 pts), ternaries 2 (3 pts), error handling 2, boolean chains 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/client/commands/extras.py"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"28c0913aa564ca04abbf2b9fa50f3735028574f3c07950e157db12601c79add2"}},{"ruleId":"D2","level":"warning","message":{"text":"non_interactive._terminate_startup_process (cognitive 19): non_interactive._terminate_startup_process has cognitive complexity 19 (threshold 15). Drivers by points: error handling 9 (13 pts), if/else 5 (6 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":"libs/code/deepagents_code/client/non_interactive.py"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"188bdb5a3b9f3a593f6b58cf4e935304023a751caf0e4241aa1ac96f586403c3"}},{"ruleId":"D2","level":"warning","message":{"text":"CliProvider._coerce (cognitive 19): CliProvider._coerce has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (15 pts), boolean chains 4 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/configuration/provider.py"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"021c34f5c18159a11df249a0bd41ddd3c7c8fa465caffc10281aca34fef98c2c"}},{"ruleId":"D2","level":"warning","message":{"text":"goal_rubric._summarize_criteria_result (cognitive 19): goal_rubric._summarize_criteria_result has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (14 pts), ternaries 1 (4 pts), boolean chains 1 (nesting depth added 11). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/goal_rubric.py"},"region":{"startLine":1170}}}],"partialFingerprints":{"codehealthFindingId/v1":"59b4817496027eb944fd680ec895a61f92eddd84ff4e1d082fecdce7f2f7bac1"}},{"ruleId":"D2","level":"warning","message":{"text":"goal_state_notice.build_goal_state_notice (cognitive 19): goal_state_notice.build_goal_state_notice has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9, boolean chains 5, error handling 2 (3 pts), ternaries 2 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/goal_state_notice.py"},"region":{"startLine":639}}}],"partialFingerprints":{"codehealthFindingId/v1":"516de456ab59cc10bb620dbde36efc15dfc40ae1680359b32aa45d3742ef80cb"}},{"ruleId":"D2","level":"warning","message":{"text":"loading._validate_hooks_document (cognitive 19): loading._validate_hooks_document has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (12 pts), loops 2 (3 pts), boolean chains 2, error handling 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":"libs/code/deepagents_code/hooks/loading.py"},"region":{"startLine":444}}}],"partialFingerprints":{"codehealthFindingId/v1":"36ee33dac1f28f90342e945e576005a5bf09fa974862ef379d8c641303ec8b1f"}},{"ruleId":"D2","level":"warning","message":{"text":"input._leading_token_end (cognitive 19): input._leading_token_end has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (12 pts), boolean chains 4, loops 2 (3 pts) (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/input.py"},"region":{"startLine":855}}}],"partialFingerprints":{"codehealthFindingId/v1":"23639e229063458a6790c93b38786d0fce7ea3720bfb0a377238e840a8827622"}},{"ruleId":"D2","level":"warning","message":{"text":"model_retry._extract_status_code (cognitive 19): model_retry._extract_status_code has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (16 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":"libs/code/deepagents_code/model_retry.py"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecb53df2ea2989a619e76befb214835f1369070e743a812b78c2f9ced46451ae"}},{"ruleId":"D2","level":"warning","message":{"text":"model_retry._retry_call (cognitive 19): model_retry._retry_call has cognitive complexity 19 (threshold 15). Drivers by points: if/else 4 (12 pts), error handling 2 (4 pts), boolean chains 2, loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body. This shape REPEATS in the file: one other method here (model_retry._aretry_call) 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":"libs/code/deepagents_code/model_retry.py"},"region":{"startLine":611}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dec3ee2a24d4ae9794b8ad8367eec00c7ab166fa450b102fa74fef6eddf27fe"}},{"ruleId":"D2","level":"warning","message":{"text":"model_retry._aretry_call (cognitive 19): model_retry._aretry_call has cognitive complexity 19 (threshold 15). Drivers by points: if/else 4 (12 pts), error handling 2 (4 pts), boolean chains 2, loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body. This shape REPEATS in the file: one other method here (model_retry._retry_call) 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":"libs/code/deepagents_code/model_retry.py"},"region":{"startLine":658}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a820ffc1f6abd051a550f3a271993ba51aaf045d71bc733719fcf1b55a577d8"}},{"ruleId":"D2","level":"warning","message":{"text":"_json.json_value (cognitive 19): _json.json_value has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (12 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":"libs/code/deepagents_code/plugins/_json.py"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"df08acc49cf3aed102a6154c1deffcd21c60e22a063e317c84653fa76a1a88ba"}},{"ruleId":"D2","level":"warning","message":{"text":"marketplace._parse_plugin_source (cognitive 19): marketplace._parse_plugin_source has cognitive complexity 19 (threshold 15). Drivers by points: if/else 13 (15 pts), boolean chains 4 (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":"libs/code/deepagents_code/plugins/marketplace.py"},"region":{"startLine":686}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e215cbbeed2a7a29b7585ff31a1ae350d9167f073c153c17c38a135fceb5371"}},{"ruleId":"D2","level":"warning","message":{"text":"commands._info (cognitive 19): commands._info has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (11 pts), loops 3 (5 pts), error handling 1 (2 pts), boolean chains 1 (nesting depth added 4). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/skills/commands.py"},"region":{"startLine":534}}}],"partialFingerprints":{"codehealthFindingId/v1":"5df03c7a218227799448952ebe0389c13aeea40ebbebbb90cce91def3ffbd8ed"}},{"ruleId":"D2","level":"warning","message":{"text":"ApprovalMenu._collect_security_warnings (cognitive 19): ApprovalMenu._collect_security_warnings has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (16 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":"libs/code/deepagents_code/tui/widgets/approval.py"},"region":{"startLine":715}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a0fd5d2d68ac11bc4bcb2309fa1f0c861f7ce42764e0f6d6a038761d7c858c0"}},{"ruleId":"D2","level":"warning","message":{"text":"_QuestionWidget.get_answer (cognitive 19): _QuestionWidget.get_answer has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (12 pts), boolean chains 3, loops 1 (2 pts), 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":"libs/code/deepagents_code/tui/widgets/ask_user.py"},"region":{"startLine":977}}}],"partialFingerprints":{"codehealthFindingId/v1":"89addee327c006ea17f56f1848b5abd30160be03f667db6db1a4e098d31761b8"}},{"ruleId":"D2","level":"warning","message":{"text":"_QuestionWidget.action_select_or_submit (cognitive 19): _QuestionWidget.action_select_or_submit has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (18 pts), boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/ask_user.py"},"region":{"startLine":1227}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd5a5ea8a45eca862ba1885059b65bbc6b25e8e1f33f4192771401d8007294f2"}},{"ruleId":"D2","level":"warning","message":{"text":"ToolCallMessage._restore_deferred_state (cognitive 19): ToolCallMessage._restore_deferred_state has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (13 pts), ternaries 1 (3 pts), boolean chains 2, match/switch 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/messages.py"},"region":{"startLine":2172}}}],"partialFingerprints":{"codehealthFindingId/v1":"69260332e07e09e6cc82fb219eff0996bf3f0d10d4d30c0b47e3e6224a65f436"}},{"ruleId":"D2","level":"warning","message":{"text":"update_check.get_sdk_release_time (cognitive 19): update_check.get_sdk_release_time has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (14 pts), error handling 3, boolean chains 2 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/update_check.py"},"region":{"startLine":1096}}}],"partialFingerprints":{"codehealthFindingId/v1":"c83955bcd5f89eca5e5ca4f75de1582b7c80245a82f8f2d0d12ab8aa9e476d6d"}},{"ruleId":"D2","level":"warning","message":{"text":"update_check._run_install_subprocess (cognitive 19): update_check._run_install_subprocess has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (15 pts), error handling 4 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/update_check.py"},"region":{"startLine":2156}}}],"partialFingerprints":{"codehealthFindingId/v1":"885ea2fdbfcf77e8ae93034eecc8a225d7b532e683d1d187090d56269b86b5cf"}},{"ruleId":"D2","level":"warning","message":{"text":"ReadResult.__post_init__ (cognitive 19): ReadResult.__post_init__ has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (11 pts), boolean chains 8 (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":"libs/deepagents/deepagents/backends/protocol.py"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"54dfe8068d2ed9943e6cf27a486d4897692eef2ca68146b7ff413757fb549d74"}},{"ruleId":"D2","level":"warning","message":{"text":"utils.grep_matches_from_files (cognitive 19): utils.grep_matches_from_files has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (12 pts), error handling 2 (3 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/utils.py"},"region":{"startLine":1091}}}],"partialFingerprints":{"codehealthFindingId/v1":"46365cc32c37b34868bb1af76fbd5e9555f114529ce6703f9c1ed51f42e45e13"}},{"ruleId":"D2","level":"warning","message":{"text":"_skill_tools._find_skill_reads (cognitive 19): _skill_tools._find_skill_reads has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (9 pts), boolean chains 6, ternaries 1 (3 pts), loops 1 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/_skill_tools.py"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e26011b3da56da62304dadcd3619474dd89b4c770ef278b9b8229a347c39898"}},{"ruleId":"D2","level":"warning","message":{"text":"PatchToolCallsMiddleware.before_agent (cognitive 19): PatchToolCallsMiddleware.before_agent 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":"libs/deepagents/deepagents/middleware/patch_tool_calls.py"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d2e7758235461dd09adf79f890f140406caea522fcddc7faf5ea8839677b9f4"}},{"ruleId":"D2","level":"warning","message":{"text":"history_profiles._validate_profile (cognitive 19): history_profiles._validate_profile has cognitive complexity 19 (threshold 15). Drivers by points: boolean chains 10, if/else 9. 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":"libs/talon/deepagents_talon/history_profiles.py"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c05c6e0a6d3ea89bb95eafa370dda1dbfd2423c8d1006874c2cfea2cccd5609"}},{"ruleId":"D2","level":"warning","message":{"text":"mcp.load_mcp_tools (cognitive 19): mcp.load_mcp_tools has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 4 (11 pts), loops 2 (3 pts), boolean chains 2, error handling 1 (2 pts), if/else 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":"libs/talon/deepagents_talon/mcp.py"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc1c6c20c69a94b5d4d68888cf104bd186aec58c12680e8e396cc946c32a66db"}},{"ruleId":"D2","level":"warning","message":{"text":"build_release_notes.generate_git_log (cognitive 19): build_release_notes.generate_git_log has cognitive complexity 19 (threshold 15). Drivers by points: if/else 11 (15 pts), ternaries 1 (2 pts), boolean chains 1, loops 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/release/build_release_notes.py"},"region":{"startLine":665}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc1abe2ace02eeee1855a682281ae98b1f6626947c45007777018d3e0457b248"}},{"ruleId":"D2","level":"warning","message":{"text":"check_release_deps._follow_up_markdown (cognitive 19): check_release_deps._follow_up_markdown has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (11 pts), loops 2 (4 pts), ternaries 1 (3 pts), boolean chains 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/release/check_release_deps.py"},"region":{"startLine":890}}}],"partialFingerprints":{"codehealthFindingId/v1":"c62ee37a93a7320f27dbff09a60e511afa74f097dc8a68adc5b2e1e27554cf53"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentServerACP._create_tool_call_start (cognitive 18): AgentServerACP._create_tool_call_start has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 6, if/else 5 (6 pts), ternaries 3 (6 pts) (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/acp/deepagents_acp/server.py"},"region":{"startLine":670}}}],"partialFingerprints":{"codehealthFindingId/v1":"4df78715fd3a7de14971ea27b2ac8db05f7da252088ba75860d2465eaf387f63"}},{"ruleId":"D2","level":"warning","message":{"text":"agent.get_system_prompt (cognitive 18): agent.get_system_prompt has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (10 pts), ternaries 5, error handling 1 (3 pts) (nesting depth added 3). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/agent.py"},"region":{"startLine":1604}}}],"partialFingerprints":{"codehealthFindingId/v1":"7375d4279af4bd1e584b7cca3c8c90fa2806023075c5e36a222fe31d06855af2"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._mount_hydration_batch (cognitive 18): DeepAgentsApp._mount_hydration_batch has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (10 pts), error handling 3 (4 pts), loops 1 (2 pts), boolean chains 1, ternaries 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":10418}}}],"partialFingerprints":{"codehealthFindingId/v1":"93f92ca43987fc11da03ad24f0b2fc1413b980acab7ec7cfa9f6b8897d029452"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._on_auto_approve_enabled (cognitive 18): DeepAgentsApp._on_auto_approve_enabled has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (14 pts), error handling 1 (3 pts), boolean chains 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":11343}}}],"partialFingerprints":{"codehealthFindingId/v1":"0eb3a79481ac2059c35ed3182338ffd6cbe9b86c573b01cce403979680917a9f"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._toggle_mcp_server_disabled (cognitive 18): DeepAgentsApp._toggle_mcp_server_disabled has cognitive complexity 18 (threshold 15). Drivers by points: if/else 11 (13 pts), boolean chains 2, error handling 1 (2 pts), 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":28210}}}],"partialFingerprints":{"codehealthFindingId/v1":"85379a1836294b4c2e33a1ba10a17092478531f86ffa0e012d490ef33184ac9a"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._resolve_threads_resume_target (cognitive 18): DeepAgentsApp._resolve_threads_resume_target has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (12 pts), boolean chains 2, error handling 2, ternaries 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":30048}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7a0355cdd19ef6b9167346e8393fcc0c1b6991593a19ffd8878d2b44e23fcbb"}},{"ruleId":"D2","level":"warning","message":{"text":"auto_mode._merge_temp_artifacts (cognitive 18): auto_mode._merge_temp_artifacts has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (11 pts), boolean chains 5, 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":"libs/code/deepagents_code/auto_mode.py"},"region":{"startLine":599}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a5dc0b6defb76ffad096ed184c8b3047fd6aa9367673b7a38402a2a2b35ef63"}},{"ruleId":"D2","level":"warning","message":{"text":"btw._tool_free_transcript (cognitive 18): btw._tool_free_transcript has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (17 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":"libs/code/deepagents_code/btw.py"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"147121c9e8238dd1b93bdc847e82d66ebca7554c9de9238644762d139b666301"}},{"ruleId":"D2","level":"warning","message":{"text":"config._run_get (cognitive 18): config._run_get has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (13 pts), ternaries 3 (4 pts), loops 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/client/commands/config.py"},"region":{"startLine":1091}}}],"partialFingerprints":{"codehealthFindingId/v1":"166e1a005a067bea1e0a828d3411f9cf90006eccd6f348ce45f46c2e211c4d4f"}},{"ruleId":"D2","level":"warning","message":{"text":"config._parse_interpreter_ptc (cognitive 18): config._parse_interpreter_ptc has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (14 pts), boolean chains 2, loops 1 (2 pts) (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/config.py"},"region":{"startLine":2928}}}],"partialFingerprints":{"codehealthFindingId/v1":"e39f8b2ff63a5dd1c08419b2bf4e3d3f07504b2d43b82310bb26643d9cd8f997"}},{"ruleId":"D2","level":"warning","message":{"text":"config_manifest.load_bool_display_preference (cognitive 18): config_manifest.load_bool_display_preference has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (10 pts), loops 2 (6 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":"libs/code/deepagents_code/config_manifest.py"},"region":{"startLine":1395}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4610e8206e27ca0360e7ea5c5fae48981cb4f715f864efe59b7875f20415234"}},{"ruleId":"D2","level":"warning","message":{"text":"_SessionCostRecorder._start (cognitive 18): _SessionCostRecorder._start has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 6, ternaries 6, if/else 3, loops 2 (3 pts) (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/cost_tracking.py"},"region":{"startLine":2209}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b7d3c4a72a697173de0f193949415504df5314fcca114db9a12f3dd0b19e525"}},{"ruleId":"D2","level":"warning","message":{"text":"diff_utils.file_header_indexes (cognitive 18): diff_utils.file_header_indexes has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (13 pts), boolean chains 4, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/diff_utils.py"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca9580df6dd039d55277660531a5f6f41397582e2ca9d8f2827299072cefe4ee"}},{"ruleId":"D2","level":"warning","message":{"text":"goal_rubric._conversation_context (cognitive 18): goal_rubric._conversation_context has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (14 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":"libs/code/deepagents_code/goal_rubric.py"},"region":{"startLine":1306}}}],"partialFingerprints":{"codehealthFindingId/v1":"823746b1563efa7d1503ba16f64ad7cd09d246a73c401a8014a3e81d741e9629"}},{"ruleId":"D2","level":"warning","message":{"text":"main._run_acp_cli_async (cognitive 18): main._run_acp_cli_async has cognitive complexity 18 (threshold 15). Drivers by points: error handling 7 (8 pts), if/else 4, ternaries 3, boolean chains 2, loops 1 (nesting depth added 1). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":3515}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1fbf062402401b98e4b8b3363570fe78e321887cc2560340067627a125fc91e"}},{"ruleId":"D2","level":"warning","message":{"text":"main._select_trust_action (cognitive 18): main._select_trust_action has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (10 pts), boolean chains 3, 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, 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":"libs/code/deepagents_code/main.py"},"region":{"startLine":4274}}}],"partialFingerprints":{"codehealthFindingId/v1":"70a6ebb6f236b7b0c546b22f6c404e0d0d0d266656551edb157ba76fd9f46c6e"}},{"ruleId":"D2","level":"warning","message":{"text":"mcp_auth.find_oauth_challenge (cognitive 18): mcp_auth.find_oauth_challenge has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (15 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":"libs/code/deepagents_code/mcp_auth.py"},"region":{"startLine":2128}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ce66e01f8dce1a63193fc445e9847400017da8ff3d8a35d75a644f496af6a43"}},{"ruleId":"D2","level":"warning","message":{"text":"ManagedMemoryGuardMiddleware._without_managed_block_edits (cognitive 18): ManagedMemoryGuardMiddleware._without_managed_block_edits has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (14 pts), boolean chains 2, loops 2 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/memory_guard.py"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"1889aba836e9bae7fd659646ff8b866f5e83f488474c3013f8fdb5e2f9b823d4"}},{"ruleId":"D2","level":"warning","message":{"text":"model_config.load_thread_config (cognitive 18): model_config.load_thread_config has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10 (12 pts), boolean chains 3, loops 1 (2 pts), error handling 1 (nesting depth added 3). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":6165}}}],"partialFingerprints":{"codehealthFindingId/v1":"0723037193e5452376a168561caa2120c6bffac5d974b7116f1f8fb575dc4424"}},{"ruleId":"D2","level":"warning","message":{"text":"manifest.load_manifest (cognitive 18): manifest.load_manifest has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (10 pts), boolean chains 3, error handling 2, ternaries 2, loops 1 (nesting depth added 3). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/plugins/manifest.py"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"25bc53275836edda62dccfdcfd45b23f0ce66c40ad5778e996c2a30f5ab83211"}},{"ruleId":"D2","level":"warning","message":{"text":"subagents._parse_subagent_file (cognitive 18): subagents._parse_subagent_file has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (10 pts), boolean chains 4, error handling 2, ternaries 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":"libs/code/deepagents_code/subagents.py"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"045e8d4c533b8e7bdf36759d4ced83edd695919327e5431afb8f24cbb6916471"}},{"ruleId":"D2","level":"warning","message":{"text":"subagents._load_subagents_from_dir (cognitive 18): subagents._load_subagents_from_dir has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (16 pts), boolean chains 1, loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/subagents.py"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"99e2f77545a10980e3d983d03b2f024b5646a03129b012109173dfdd09854ffe"}},{"ruleId":"D2","level":"warning","message":{"text":"_QuestionWidget._update_choice_selection (cognitive 18): _QuestionWidget._update_choice_selection 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":"libs/code/deepagents_code/tui/widgets/ask_user.py"},"region":{"startLine":1280}}}],"partialFingerprints":{"codehealthFindingId/v1":"0655f266945dc4a0071aa784fefb3161d79d7291e4aae8fd3a9093d94bd339ae"}},{"ruleId":"D2","level":"warning","message":{"text":"ToolCallMessage._format_js_eval_output (cognitive 18): ToolCallMessage._format_js_eval_output has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 5 (9 pts), if/else 5 (7 pts), boolean chains 1, loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/messages.py"},"region":{"startLine":3652}}}],"partialFingerprints":{"codehealthFindingId/v1":"7acaa32be00614e81bfd1c43fae26eaa9eb62793b3bd8bb982ffb88055638291"}},{"ruleId":"D2","level":"warning","message":{"text":"ToolGroupSummary._render_line (cognitive 18): ToolGroupSummary._render_line has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (13 pts), boolean chains 3, ternaries 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":"libs/code/deepagents_code/tui/widgets/messages.py"},"region":{"startLine":5271}}}],"partialFingerprints":{"codehealthFindingId/v1":"37e769b76152c59555c3d0159255425ce0b348beeba74b42ff0466b56e16a472"}},{"ruleId":"D2","level":"warning","message":{"text":"DiffMessage.compose (cognitive 18): DiffMessage.compose has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (13 pts), boolean chains 3, 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":"libs/code/deepagents_code/tui/widgets/messages.py"},"region":{"startLine":5623}}}],"partialFingerprints":{"codehealthFindingId/v1":"f847bbcb9267d9a92349571bb13025db4600260f54206837d244760653995ed8"}},{"ruleId":"D2","level":"warning","message":{"text":"ThreadSelectorScreen.on_select_changed (cognitive 18): ThreadSelectorScreen.on_select_changed has cognitive complexity 18 (threshold 15). Drivers by points: if/else 11 (15 pts), ternaries 2 (3 pts) (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/thread_selector.py"},"region":{"startLine":2842}}}],"partialFingerprints":{"codehealthFindingId/v1":"f492c62f11eb11c02b341271e97938038204fb58fab8c86d1efad6e3701d0a8d"}},{"ruleId":"D2","level":"warning","message":{"text":"ContextHubBackend.ls (cognitive 18): ContextHubBackend.ls has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (10 pts), ternaries 2 (5 pts), boolean chains 1, 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":"libs/deepagents/deepagents/backends/context_hub.py"},"region":{"startLine":564}}}],"partialFingerprints":{"codehealthFindingId/v1":"54dfd232466869aed0d9894c6d433863e53268a031c658eb2d925f514984b223"}},{"ruleId":"D2","level":"warning","message":{"text":"FilesystemBackend._ripgrep_search (cognitive 18): FilesystemBackend._ripgrep_search has cognitive complexity 18 (threshold 15). Drivers by points: if/else 12 (15 pts), boolean chains 1, error handling 1, loops 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/filesystem.py"},"region":{"startLine":913}}}],"partialFingerprints":{"codehealthFindingId/v1":"2418a6389118e3c33610a09c924e9f1b18dc53064bf485c2b1eeee5efff5618d"}},{"ruleId":"D2","level":"warning","message":{"text":"FilesystemMiddleware._with_filtered_grep_description (cognitive 18): FilesystemMiddleware._with_filtered_grep_description has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (14 pts), boolean chains 2, loops 1, ternaries 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body. This shape REPEATS in the file: one other method here (FilesystemMiddleware._with_filtered_execute_description) 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":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":2894}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d9b40355c50795e59f411efd9584aef7b39018d675dbf92b9976a279e97efa3"}},{"ruleId":"D2","level":"warning","message":{"text":"FilesystemMiddleware._with_filtered_execute_description (cognitive 18): FilesystemMiddleware._with_filtered_execute_description has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (14 pts), boolean chains 2, loops 1, ternaries 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body. This shape REPEATS in the file: one other method here (FilesystemMiddleware._with_filtered_grep_description) 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":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":2957}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c3bfd487d7a1fc835da009f79c042903facbec00e25c08dc0f80d6c153ca096"}},{"ruleId":"D2","level":"warning","message":{"text":"FilesystemMiddleware.wrap_model_call (cognitive 18): FilesystemMiddleware.wrap_model_call has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (10 pts), ternaries 3 (6 pts), boolean chains 1, 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. This shape REPEATS in the file: one other method here (FilesystemMiddleware.awrap_model_call) 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":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":3381}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf4678eb64363e6f1836a0b4292e2fcdba9d8bc7e8e9781cf9748f4005b91209"}},{"ruleId":"D2","level":"warning","message":{"text":"FilesystemMiddleware.awrap_model_call (cognitive 18): FilesystemMiddleware.awrap_model_call has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (10 pts), ternaries 3 (6 pts), boolean chains 1, 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. This shape REPEATS in the file: one other method here (FilesystemMiddleware.wrap_model_call) 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":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":3443}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6550cff9da8ce0ff7aaa57e75d6a852ae442330bd901a750029d2887ef28e46"}},{"ruleId":"D2","level":"warning","message":{"text":"filesystem._move_media_results_after_tool_results (cognitive 18): filesystem._move_media_results_after_tool_results has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (13 pts), loops 2 (3 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":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"00b9b361e677d87df8243f0ada536524c514b295a97e6928c9694211135373c9"}},{"ruleId":"D2","level":"warning","message":{"text":"run_trials._collect_numeric_values (cognitive 18): run_trials._collect_numeric_values has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (13 pts), ternaries 1 (3 pts), boolean chains 1, loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/evals/scripts/run_trials.py"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"81bac94b6c8c23d9329a21fb6e53b157d01cad673b841f2859c4ff6aa4211342"}},{"ruleId":"D2","level":"warning","message":{"text":"provider._ensure_blueprint (cognitive 18): provider._ensure_blueprint has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (11 pts), error handling 2 (3 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":"libs/partners/runloop/langchain_runloop/provider.py"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"260ea193764b13170e5f2e2397035174936e8d1796261343e5dc811c7d54dac9"}},{"ruleId":"D2","level":"warning","message":{"text":"ConversationSaver._messages (cognitive 18): ConversationSaver._messages has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (14 pts), loops 1 (3 pts), boolean chains 1 (nesting depth added 11). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/archive_saver.py"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"3323d8f997eb759af71b91a2ab82613c03185d94ad3fdbf9d38e7985f666c144"}},{"ruleId":"D2","level":"warning","message":{"text":"whatsapp._parse_message (cognitive 18): whatsapp._parse_message has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 15, if/else 2, 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":"libs/talon/deepagents_talon/channels/whatsapp.py"},"region":{"startLine":839}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed8d5f8d0ed26a72cd5eb88e0b36fd08983388cde6978fb36c70936148f56a24"}},{"ruleId":"D2","level":"warning","message":{"text":"store_archive._chunks (cognitive 18): store_archive._chunks has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 6, if/else 3 (6 pts), loops 2 (3 pts), ternaries 1 (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":"libs/talon/deepagents_talon/store_archive.py"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"f33683df6f8f51ea43e5072fc175cc760379b1f7bc8364c7841d81d3ea0fa44a"}},{"ruleId":"D2","level":"warning","message":{"text":"check_dep_freshness.check_dependency_freshness (cognitive 18): check_dep_freshness.check_dependency_freshness has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (9 pts), ternaries 3 (4 pts), error handling 1 (2 pts), loops 2, boolean chains 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/release/check_dep_freshness.py"},"region":{"startLine":488}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5fee61f28345eb30b700ebfdb1030ac487c650243db954daba0d42d97563944"}},{"ruleId":"D2","level":"warning","message":{"text":"ServerConfig.__post_init__ (cognitive 17): ServerConfig.__post_init__ has cognitive complexity 17 (threshold 15). Drivers by points: if/else 11 (13 pts), boolean chains 4 (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":"libs/code/deepagents_code/_server_config.py"},"region":{"startLine":748}}}],"partialFingerprints":{"codehealthFindingId/v1":"a447d0ebb0fa9d9715dc9a1a02979b4a3dcf3b79078bf9d2b89ce859e6b24798"}},{"ruleId":"D2","level":"warning","message":{"text":"agent.load_async_subagents (cognitive 17): agent.load_async_subagents has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (12 pts), boolean chains 3, 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":"libs/code/deepagents_code/agent.py"},"region":{"startLine":1152}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e8791a7c757bf6841bb7b436b4eb8c63a41739ff646910952150bca6ac94ff7"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._sync_cache_state_from_state (cognitive 17): DeepAgentsApp._sync_cache_state_from_state has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (9 pts), boolean chains 5, ternaries 2, loops 1 (nesting depth added 3). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":9471}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac2c6ac38d195a1cd41cad330b4caa8e16e2fde669d48db930e372ddc10f25d7"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._set_spinner (cognitive 17): DeepAgentsApp._set_spinner has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (10 pts), error handling 3 (6 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":10916}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b757b2a36cf1d94d402f256137d77c281ecdb32ccb4e1704768fd62d4a6a917"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._confirm_then_resume_owned_cross_agent_thread (cognitive 17): DeepAgentsApp._confirm_then_resume_owned_cross_agent_thread has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10, error handling 4, boolean chains 3. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":30176}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b381cb2d255ef5523ab039fa783da21ebeaa12bb816d4580cf34204643681c2"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._retry_startup_with_model (cognitive 17): DeepAgentsApp._retry_startup_with_model has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9, boolean chains 6, error handling 1, ternaries 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":32098}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ea440e921a86463859878b9ea61fc017cb2ff45be64522bbc5a87662a1bae3d"}},{"ruleId":"D2","level":"warning","message":{"text":"inspect_sessions._ensure_runtime (cognitive 17): inspect_sessions._ensure_runtime has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (10 pts), error handling 2 (4 pts), loops 2, boolean chains 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1e9537a02e8c32aea14514a7dc176626e2123da0832ffaf6a0198a05a92b95b"}},{"ruleId":"D2","level":"warning","message":{"text":"inspect_sessions._reconstruct_messages (cognitive 17): inspect_sessions._reconstruct_messages 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":"libs/code/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9a564a82e32c93b300adc99727bec2e1e6f0fc11a33652d891639a7c0936d26"}},{"ruleId":"D2","level":"warning","message":{"text":"inspect_sessions._message_record (cognitive 17): inspect_sessions._message_record has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (12 pts), loops 1 (2 pts), ternaries 2, boolean chains 1 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py"},"region":{"startLine":465}}}],"partialFingerprints":{"codehealthFindingId/v1":"c48ad7ac1429edb6dba93c3908c7236b25f7c8c02a98e8cc5d240c29b10d015d"}},{"ruleId":"D2","level":"warning","message":{"text":"non_interactive._process_hitl_interrupts (cognitive 17): non_interactive._process_hitl_interrupts has cognitive complexity 17 (threshold 15). Drivers by points: if/else 3 (7 pts), ternaries 2 (6 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/client/non_interactive.py"},"region":{"startLine":1865}}}],"partialFingerprints":{"codehealthFindingId/v1":"cda506da42b4f06c8edb6d4bc49e477eff8bfd52492f1f56bd05ce806ea63e3b"}},{"ruleId":"D2","level":"warning","message":{"text":"cold_cache.resolve_prompt_cache_policy (cognitive 17): cold_cache.resolve_prompt_cache_policy has cognitive complexity 17 (threshold 15). Drivers by points: if/else 11 (13 pts), boolean chains 3, ternaries 1 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/cold_cache.py"},"region":{"startLine":815}}}],"partialFingerprints":{"codehealthFindingId/v1":"e069f6610e0fb5f480185e1b953beff72a7bd2dcd58a151638af108b4270e439"}},{"ruleId":"D2","level":"warning","message":{"text":"config.langsmith_key_shadowed_by_empty_override (cognitive 17): config.langsmith_key_shadowed_by_empty_override has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (10 pts), boolean chains 3, error handling 1 (3 pts), loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/config.py"},"region":{"startLine":4419}}}],"partialFingerprints":{"codehealthFindingId/v1":"1038ff765b03345133b1c051f0482de736dc2050a0ad203630ed9108e686327d"}},{"ruleId":"D2","level":"warning","message":{"text":"config.detect_provider (cognitive 17): config.detect_provider has cognitive complexity 17 (threshold 15). Drivers by points: if/else 13 (15 pts), boolean chains 2 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/config.py"},"region":{"startLine":5575}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1d4f7d64ecac9fa7091dd41aee87fad4dc3baf2bf6d1c9aa56e1817b0203ba1"}},{"ruleId":"D2","level":"warning","message":{"text":"doctor._render_text (cognitive 17): doctor._render_text has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 5 (13 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/doctor.py"},"region":{"startLine":774}}}],"partialFingerprints":{"codehealthFindingId/v1":"3504dd4bd0e85bacc95333bb02a90564e43e062d2000eb6f30b7d76d8e7b49f4"}},{"ruleId":"D2","level":"warning","message":{"text":"goal_rubric._goal_criteria_request (cognitive 17): goal_rubric._goal_criteria_request has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10 (13 pts), boolean chains 3, loops 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/goal_rubric.py"},"region":{"startLine":1200}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8bc281cfedddb818c1d47e96b52d10fe55a76859705580b97ea19074e396540"}},{"ruleId":"D2","level":"warning","message":{"text":"input._token_to_path (cognitive 17): input._token_to_path has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (11 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":"libs/code/deepagents_code/input.py"},"region":{"startLine":811}}}],"partialFingerprints":{"codehealthFindingId/v1":"daafa2f3ea5c52d9aec1f697113fc223b2dcbc3783d3e14bac2c22293138deb5"}},{"ruleId":"D2","level":"warning","message":{"text":"_DaytonaProvider.get_or_create (cognitive 17): _DaytonaProvider.get_or_create has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (6 pts), ternaries 3 (5 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":"libs/code/deepagents_code/integrations/sandbox_factory.py"},"region":{"startLine":490}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2e0099d1d242bef9404679fc835e3469f483025c42964617431acad31d7ee39"}},{"ruleId":"D2","level":"warning","message":{"text":"_ModalProvider.get_or_create (cognitive 17): _ModalProvider.get_or_create has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (9 pts), error handling 1 (3 pts), ternaries 1 (3 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":"libs/code/deepagents_code/integrations/sandbox_factory.py"},"region":{"startLine":712}}}],"partialFingerprints":{"codehealthFindingId/v1":"4369b38bee67ab7128709b711030911afcdab18629b21cbfa89402607bb07881"}},{"ruleId":"D2","level":"warning","message":{"text":"mcp_auth._run_device_flow (cognitive 17): mcp_auth._run_device_flow has cognitive complexity 17 (threshold 15). Drivers by points: error handling 5 (8 pts), if/else 4 (7 pts), loops 1, ternaries 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/mcp_auth.py"},"region":{"startLine":1883}}}],"partialFingerprints":{"codehealthFindingId/v1":"9227c9d854d8030e45c8777cf455ba84267c3b5160f93ce353d4aea918f2f5e6"}},{"ruleId":"D2","level":"warning","message":{"text":"model_config.resolve_env_var (cognitive 17): model_config.resolve_env_var has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (13 pts), boolean chains 4 (nesting depth added 8). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"583a022f04abb1785254c43c69e97bb5add71204d26631592d144406ba7442ee"}},{"ruleId":"D2","level":"warning","message":{"text":"load.list_skills (cognitive 17): load.list_skills has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (10 pts), loops 2 (3 pts), boolean chains 2, error handling 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":"libs/code/deepagents_code/skills/load.py"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2e5da2284767b0c1c770f7b51b289a47d049747f992c634fe686c4ca66afc48"}},{"ruleId":"D2","level":"warning","message":{"text":"SlashCommandController._score_command (cognitive 17): SlashCommandController._score_command has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (10 pts), boolean chains 4, loops 1 (2 pts), 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":"libs/code/deepagents_code/tui/widgets/autocomplete.py"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ae43e1d9bd17513890a45ea743c2f63e04e0fa369c96f7e66ac5aace0f0eef8"}},{"ruleId":"D2","level":"warning","message":{"text":"UserMessage._append_highlighted_body (cognitive 17): UserMessage._append_highlighted_body has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (14 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":"libs/code/deepagents_code/tui/widgets/messages.py"},"region":{"startLine":874}}}],"partialFingerprints":{"codehealthFindingId/v1":"899ac2a374aaaa974cd0f726c47f271e2c26a9befa9f5bc5eacf63b8d6997cfc"}},{"ruleId":"D2","level":"warning","message":{"text":"_excluded_middleware._apply_excluded_middleware (cognitive 17): _excluded_middleware._apply_excluded_middleware has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (15 pts), loops 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/_excluded_middleware.py"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d6dbc89127c173fb6581abde0b2d27e2ea8b643640eea283083d6d9b6197a7b"}},{"ruleId":"D2","level":"warning","message":{"text":"_video._sample_frames_in_window (cognitive 17): _video._sample_frames_in_window has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 1, error handling 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":"libs/deepagents/deepagents/middleware/_video.py"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cebe0e456fafe6882f8dd45bb56191bc444ee8ece220ea3ed515192b7b12940"}},{"ruleId":"D2","level":"warning","message":{"text":"filesystem._parallel_file_mutation_error (cognitive 17): filesystem._parallel_file_mutation_error has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (9 pts), error handling 2 (3 pts), boolean chains 2, ternaries 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":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"df6f699df24046fda8b62a53d310b8870f52e319568b6c3a46fcebc6b61b5085"}},{"ruleId":"D2","level":"warning","message":{"text":"filesystem._find_delete_deny_patterns (cognitive 17): filesystem._find_delete_deny_patterns has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (13 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":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":635}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2981e1c55eac26d4fa47c45b6e3785416d11aa77e49287a5406c24649d49c3e"}},{"ruleId":"D2","level":"warning","message":{"text":"SummarizationToolMiddleware._is_compaction_clause_met (cognitive 17): SummarizationToolMiddleware._is_compaction_clause_met has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (14 pts), boolean chains 2, loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/summarization.py"},"region":{"startLine":2206}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb5f3ed190ae73a85395e865067359df0022d64d68020ef5f9785b5568718386"}},{"ruleId":"D2","level":"warning","message":{"text":"harness_profiles._harness_profile_for_model (cognitive 17): harness_profiles._harness_profile_for_model has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (12 pts), boolean chains 2, loops 2, ternaries 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/profiles/harness/harness_profiles.py"},"region":{"startLine":1319}}}],"partialFingerprints":{"codehealthFindingId/v1":"39217b6e818b6cdd74711435bf4dc6a420cf2a19bf5a5ab88f03e4374492c002"}},{"ruleId":"D2","level":"warning","message":{"text":"cli._collect_failed_nodeids (cognitive 17): cli._collect_failed_nodeids has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (12 pts), loops 2 (3 pts), boolean chains 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":"libs/evals/deepagents_evals/cli.py"},"region":{"startLine":350}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c2fbcfe8ec4b6d8018467ae0a7c69b9a46f811713e7ad6b889ae0dc70a10e4c"}},{"ruleId":"D2","level":"warning","message":{"text":"whatsapp._enforce_inbound_media_cap (cognitive 17): whatsapp._enforce_inbound_media_cap has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (10 pts), error handling 2 (4 pts), boolean chains 1, loops 1, ternaries 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/channels/whatsapp.py"},"region":{"startLine":915}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1a3835dd212c5c6a1f951d1d6fbe44f4d93cf0ce46a6ca7f7eedebac009cd33"}},{"ruleId":"D2","level":"warning","message":{"text":"mcp._remote_connection (cognitive 17): mcp._remote_connection has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 9, if/else 5 (7 pts), ternaries 1 (nesting depth added 2). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/mcp.py"},"region":{"startLine":828}}}],"partialFingerprints":{"codehealthFindingId/v1":"114a173927540c6429d485f29b949b6a0290e36586a8dca0348271fd528cdd59"}},{"ruleId":"D2","level":"warning","message":{"text":"aggregate_shards.build_summary (cognitive 17): aggregate_shards.build_summary has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 6 (7 pts), if/else 2 (5 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/evals/aggregate_shards.py"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"533a8281b78138125f40310c4e9439075fc0c5ab356da3f22425c5d21b025ae2"}},{"ruleId":"D2","level":"warning","message":{"text":"aggregate_unified_compare.render_markdown (cognitive 17): aggregate_unified_compare.render_markdown has cognitive complexity 17 (threshold 15). Drivers by points: loops 8 (12 pts), if/else 2, ternaries 1 (2 pts), boolean chains 1 (nesting depth added 5). 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":".github/scripts/evals/aggregate_unified_compare.py"},"region":{"startLine":692}}}],"partialFingerprints":{"codehealthFindingId/v1":"0aa615efed577ae011406bbe6e43c7da3f5bde19105bc5624021017c5d0935cb"}},{"ruleId":"D2","level":"warning","message":{"text":"check_release_deps._manifest_requirements (cognitive 17): check_release_deps._manifest_requirements has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (12 pts), loops 2 (3 pts), error handling 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":".github/scripts/release/check_release_deps.py"},"region":{"startLine":549}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf654a431d1a645b9bbd204b8b693a303252bbe032b492950d95342c4a59b2cb"}},{"ruleId":"D2","level":"warning","message":{"text":"_git.find_git_common_dir (cognitive 16): _git.find_git_common_dir has cognitive complexity 16 (threshold 15). Drivers by points: if/else 11 (12 pts), boolean chains 3, 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":"libs/code/deepagents_code/_git.py"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"086877475e2290991f6c4dedd0c3745a3dc311806399953d5db308de0bcb8392"}},{"ruleId":"D2","level":"warning","message":{"text":"SessionStats.retract_request (cognitive 16): SessionStats.retract_request has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (15 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":"libs/code/deepagents_code/_session_stats.py"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"32372361756060c5ce5a44ac810b6a25877c1ffd79fc00b8ee1496629e4829bc"}},{"ruleId":"D2","level":"warning","message":{"text":"ToolCallBuffer._scan_args_fragment (cognitive 16): ToolCallBuffer._scan_args_fragment has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (15 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":"libs/code/deepagents_code/_tool_stream.py"},"region":{"startLine":431}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2ecc7c9c0d4b1ba7df7050ea9112a27dfe18d83dabdc153d6ab390edb11e9bc"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._check_optional_tools_background (cognitive 16): DeepAgentsApp._check_optional_tools_background has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (8 pts), error handling 4 (5 pts), boolean chains 2, loops 1 (nesting depth added 3). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":5812}}}],"partialFingerprints":{"codehealthFindingId/v1":"2687fdfe5f5f252d30fee15f1c230afc2686db6ca68d5b58f11833140db54c65"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._check_for_updates_impl (cognitive 16): DeepAgentsApp._check_for_updates_impl has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (10 pts), error handling 3, ternaries 3 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":7037}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f9dba67910b2e8eb583a960a19571b2b8e0da57bbbf10e7c595744de01b1494"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._perform_app_upgrade_unlocked (cognitive 16): DeepAgentsApp._perform_app_upgrade_unlocked has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (10 pts), ternaries 2 (4 pts), boolean chains 2 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":7616}}}],"partialFingerprints":{"codehealthFindingId/v1":"abddb0f85ebbec69edccec9526af2a6f014a3c5cede377fff3d1d92af8b41768"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._uninstall_extra_unlocked (cognitive 16): DeepAgentsApp._uninstall_extra_unlocked has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 4 (7 pts), if/else 5, error handling 3, boolean chains 1 (nesting depth added 3). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":8312}}}],"partialFingerprints":{"codehealthFindingId/v1":"be24a89023ae9783b50a8c9225ad4b4eaa208e0d2d5150d049134823a5e985a6"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._run_launch_init_sequence (cognitive 16): DeepAgentsApp._run_launch_init_sequence has cognitive complexity 16 (threshold 15). Drivers by points: if/else 12, error handling 3 (4 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":12459}}}],"partialFingerprints":{"codehealthFindingId/v1":"901078a6ff4451dfd6841920a5b6214370d6ff433f98c2df4ec6481b2ef6176c"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._handle_trace_command (cognitive 16): DeepAgentsApp._handle_trace_command has cognitive complexity 16 (threshold 15). Drivers by points: error handling 7 (8 pts), if/else 6 (7 pts), boolean chains 1 (nesting depth added 2). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":14136}}}],"partialFingerprints":{"codehealthFindingId/v1":"48cbbffcbeb4ecdd1bc42aab414d28d50b3a7851cc323299b52df012b916cbc8"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._sync_status_model (cognitive 16): DeepAgentsApp._sync_status_model has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 4, error handling 3 (4 pts), if/else 4, ternaries 2 (4 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":"libs/code/deepagents_code/app.py"},"region":{"startLine":19469}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf34f266b645171863804d22313d6be5ff5aee2e6bcc750453fb6fb7e87bd909"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp.action_toggle_auto_approve (cognitive 16): DeepAgentsApp.action_toggle_auto_approve has cognitive complexity 16 (threshold 15). Drivers by points: if/else 13, boolean chains 3. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":23668}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c50add0383954640998f7b29678f06121c5d472ccadb0a389673ba5e7acb0c9"}},{"ruleId":"D2","level":"warning","message":{"text":"DeepAgentsApp._apply_optimistic_disabled_state (cognitive 16): DeepAgentsApp._apply_optimistic_disabled_state has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (15 pts), loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":28316}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4172bfd706bb4bff584989876b45794e1357a82ac1d28812447f54f55b2dd2c"}},{"ruleId":"D2","level":"warning","message":{"text":"config._display_value (cognitive 16): config._display_value has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (10 pts), ternaries 2 (5 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":"libs/code/deepagents_code/client/commands/config.py"},"region":{"startLine":395}}}],"partialFingerprints":{"codehealthFindingId/v1":"d489f4993fbdfa7b32156e93f1eae4e5b9521837752d4826526ee4b20ae9899f"}},{"ruleId":"D2","level":"warning","message":{"text":"remote_client._validated_offload_result (cognitive 16): remote_client._validated_offload_result has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (10 pts), loops 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":"libs/code/deepagents_code/client/remote_client.py"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"885991e37124249f3d9bc2384658dc228a2b884193a75930e2b6f24b01d2de31"}},{"ruleId":"D2","level":"warning","message":{"text":"config_manifest.resolve_auto_classifier_timeout_with_source (cognitive 16): config_manifest.resolve_auto_classifier_timeout_with_source has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10 (15 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":"libs/code/deepagents_code/config_manifest.py"},"region":{"startLine":1510}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f1f856fc7404fb8151e43700263c7dc6cdc22c0e173f1598dc96de705c56466"}},{"ruleId":"D2","level":"warning","message":{"text":"configurable_model._effective_cache_params (cognitive 16): configurable_model._effective_cache_params has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 6, ternaries 3 (6 pts), if/else 3, 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":"libs/code/deepagents_code/configurable_model.py"},"region":{"startLine":699}}}],"partialFingerprints":{"codehealthFindingId/v1":"74da32285fb96cc389780158968964c4c97192b8e580f9d7777ad273e9ed96ab"}},{"ruleId":"D2","level":"warning","message":{"text":"resolver.get_config_resolver (cognitive 16): resolver.get_config_resolver has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (12 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":"libs/code/deepagents_code/configuration/resolver.py"},"region":{"startLine":514}}}],"partialFingerprints":{"codehealthFindingId/v1":"99560bcf62c864926f875f13410e7136d822e5c6bf8446e98893fd43a1053533"}},{"ruleId":"D2","level":"warning","message":{"text":"cost_tracking._find_override_model (cognitive 16): cost_tracking._find_override_model has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (10 pts), boolean chains 3, error handling 1 (2 pts), loops 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/cost_tracking.py"},"region":{"startLine":1285}}}],"partialFingerprints":{"codehealthFindingId/v1":"a42bb4d32e8aaa3abba51cce1e88c9db4bab9916b02ab4ae6e6fe2fa13910e2b"}},{"ruleId":"D2","level":"warning","message":{"text":"server_middleware._ask_permission_via_hitl (cognitive 16): server_middleware._ask_permission_via_hitl has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (10 pts), boolean chains 3, ternaries 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":"libs/code/deepagents_code/hooks/server_middleware.py"},"region":{"startLine":1225}}}],"partialFingerprints":{"codehealthFindingId/v1":"adaf66c1d971c3acd77d4ef210aff89d98c4b6a69ba763a295ea4564d298c858"}},{"ruleId":"D2","level":"warning","message":{"text":"trust._load_store (cognitive 16): trust._load_store has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (12 pts), error handling 4 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/hooks/trust.py"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"37e4e43de178e85f28ff7c0aafd58e1f20e933674b43bda0277ed58c3e841c71"}},{"ruleId":"D2","level":"warning","message":{"text":"SandboxConfig.load (cognitive 16): SandboxConfig.load has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (9 pts), boolean chains 4, ternaries 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":"libs/code/deepagents_code/integrations/sandbox_config.py"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"760422415a886a993f8361ea7cba87f8a74a97fb532eb09534865acdce00472a"}},{"ruleId":"D2","level":"warning","message":{"text":"_ExpiryAwareOAuthClientProvider._refresh_lock_guard (cognitive 16): _ExpiryAwareOAuthClientProvider._refresh_lock_guard has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (13 pts), error handling 2 (3 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/mcp_auth.py"},"region":{"startLine":1530}}}],"partialFingerprints":{"codehealthFindingId/v1":"f730cd79996f994b73718862df7316cd0a5eabfb1e7a25d138fa293cc5e3a82c"}},{"ruleId":"D2","level":"warning","message":{"text":"offload_api._validate_context (cognitive 16): offload_api._validate_context has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 7, if/else 5 (7 pts), loops 2 (nesting depth added 2). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/offload_api.py"},"region":{"startLine":595}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2be00c5dd2fdd1c5f3f81cb7a802a5c3563252b5c9bed4b75ee24bd4734c6ff"}},{"ruleId":"D2","level":"warning","message":{"text":"state_migration.migrate_legacy_state (cognitive 16): state_migration.migrate_legacy_state has cognitive complexity 16 (threshold 15). Drivers by points: error handling 4 (7 pts), if/else 5 (7 pts), loops 2 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/state_migration.py"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf7902388d46cd93fc6fe32767c0c92e4361dd95ad89cb63de4129a17a9f8f16"}},{"ruleId":"D2","level":"warning","message":{"text":"textual_adapter._settle_attempt_for_retry (cognitive 16): textual_adapter._settle_attempt_for_retry has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (7 pts), error handling 2 (5 pts), loops 1 (2 pts), boolean chains 1, ternaries 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/textual_adapter.py"},"region":{"startLine":507}}}],"partialFingerprints":{"codehealthFindingId/v1":"c19c35f702a8f6e027fc81e76ebdd3040d9516987580b8a436e8adf7cd4ae27d"}},{"ruleId":"D2","level":"warning","message":{"text":"CollapsingPasteTextArea._find_placeholder_span (cognitive 16): CollapsingPasteTextArea._find_placeholder_span has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (14 pts), boolean chains 1, loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/_paste_textarea.py"},"region":{"startLine":817}}}],"partialFingerprints":{"codehealthFindingId/v1":"e722c0316ff3896701f6e542cd00e80fbb86c2b7d66c6fdcd094a2ee6b642718"}},{"ruleId":"D2","level":"warning","message":{"text":"AuthPromptScreen.on_input_submitted (cognitive 16): AuthPromptScreen.on_input_submitted has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (11 pts), boolean chains 3, error handling 1, loops 1 (nesting depth added 3). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/auth.py"},"region":{"startLine":1276}}}],"partialFingerprints":{"codehealthFindingId/v1":"2939fc3e2e5508e61328af34ad6d8aac85ac5f28f1074646d845a5bf3791ac43"}},{"ruleId":"D2","level":"warning","message":{"text":"MessageData.from_widget (cognitive 16): MessageData.from_widget has cognitive complexity 16 (threshold 15). Drivers by points: if/else 11 (12 pts), error handling 1 (3 pts), boolean chains 1 (nesting depth added 3). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/message_store.py"},"region":{"startLine":496}}}],"partialFingerprints":{"codehealthFindingId/v1":"f230fee5fadf27c81a017a1cdea7db40144989d14e1398c7345167386f106172"}},{"ruleId":"D2","level":"warning","message":{"text":"_blob_offload._pending_blobs (cognitive 16): _blob_offload._pending_blobs has cognitive complexity 16 (threshold 15). Drivers by points: if/else 2 (5 pts), error handling 1 (3 pts), loops 2 (3 pts), ternaries 1 (3 pts), boolean chains 2 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/_blob_offload.py"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"38e80f8850a2c1c38fc5bf46aec2b7f561f80c55f79ed8d668f3f9c7d5ea787f"}},{"ruleId":"D2","level":"warning","message":{"text":"RubricMiddleware._revision_prompt (cognitive 16): RubricMiddleware._revision_prompt has cognitive complexity 16 (threshold 15). Drivers by points: if/else 11 (13 pts), loops 1 (2 pts), boolean chains 1 (nesting depth added 3). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/rubric.py"},"region":{"startLine":1166}}}],"partialFingerprints":{"codehealthFindingId/v1":"d07129be7f06777074dbd507bf5d160a14164ad4dc175cc92b9ede25c8931d58"}},{"ruleId":"D2","level":"warning","message":{"text":"summarization._rewrite_data_url_blocks (cognitive 16): summarization._rewrite_data_url_blocks has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (13 pts), loops 2 (3 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/summarization.py"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"232717dd4350558726067bd9d9d9d75c7470d994ec6c84d06e9fb89494000f73"}},{"ruleId":"D2","level":"warning","message":{"text":"EntityResolutionGuardMiddleware._missing_current_branch_resolutions (cognitive 16): EntityResolutionGuardMiddleware._missing_current_branch_resolutions has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (10 pts), loops 3 (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":"libs/deepagents/deepagents/profiles/harness/_nvidia_nemotron_3_ultra.py"},"region":{"startLine":1500}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef1d0aeb26b9b75d360eeebf8395cfee0e22e2ef3d0fff6adb1b123d8881e2fb"}},{"ruleId":"D2","level":"warning","message":{"text":"radar.generate_radar (cognitive 16): radar.generate_radar has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (6 pts), loops 3 (5 pts), boolean chains 2, ternaries 1 (2 pts), error handling 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/evals/deepagents_evals/radar.py"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5a856c939e5773bd8abb8e19bedf1dad97ab43a163a643980a438cca20a2fb4"}},{"ruleId":"D2","level":"warning","message":{"text":"failure._extract_observation_texts (cognitive 16): failure._extract_observation_texts has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (10 pts), loops 2 (3 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":"libs/evals/deepagents_harbor/failure.py"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ecafd9ed819475b843c0993ec5aa6ab30fdac7a7bfa63e7d2a4be072b050f1d"}},{"ruleId":"D2","level":"warning","message":{"text":"failure.classify_failure (cognitive 16): failure.classify_failure has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (14 pts), loops 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":"libs/evals/deepagents_harbor/failure.py"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"845751a0cd17cae824b1e5f9d530ec8c08b2c442e88b307a1204a3cde6b70263"}},{"ruleId":"D2","level":"warning","message":{"text":"_prompt._json_schema_to_ts (cognitive 16): _prompt._json_schema_to_ts has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (10 pts), ternaries 2 (5 pts), boolean chains 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":"libs/partners/quickjs/langchain_quickjs/_prompt.py"},"region":{"startLine":519}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e65c80b9f58fb81e455500971897848679ee5436237ac2caf23502e229567f8"}},{"ruleId":"D2","level":"warning","message":{"text":"_repl._inject_tool_args_for_ptc (cognitive 16): _repl._inject_tool_args_for_ptc has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (8 pts), ternaries 1 (4 pts), boolean chains 2, 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":"libs/partners/quickjs/langchain_quickjs/_repl.py"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff491bee9a6c66c3d533ae186ce6ec673e6cb8f8721c39864b943b866beba8b6"}},{"ruleId":"D2","level":"warning","message":{"text":"TelegramChannel._poll_updates (cognitive 16): TelegramChannel._poll_updates has cognitive complexity 16 (threshold 15). Drivers by points: error handling 3 (6 pts), if/else 2 (4 pts), loops 2 (3 pts), ternaries 1 (3 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/channels/telegram.py"},"region":{"startLine":591}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d484f7a268f392e7ce2d3eb46800786afe8c26af3837416b603dea36574f9be"}},{"ruleId":"D2","level":"warning","message":{"text":"WhatsAppChannel._poll_messages (cognitive 16): WhatsAppChannel._poll_messages has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (11 pts), loops 2 (3 pts), error handling 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":"libs/talon/deepagents_talon/channels/whatsapp.py"},"region":{"startLine":600}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f7f3e9f99d07b3980839559da8ac39357f27b3fe6b7fb5743bc673fd3e61b14"}},{"ruleId":"D2","level":"warning","message":{"text":"HistoryVectorIndex.close (cognitive 16): HistoryVectorIndex.close has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (9 pts), boolean chains 4, loops 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":"libs/talon/deepagents_talon/history_vectors.py"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"b06320b8c069865751f1242a5857aa1cdcabb9845739ca5f44f37e7a818d0823"}},{"ruleId":"D2","level":"warning","message":{"text":"TalonHost._effort_command (cognitive 16): TalonHost._effort_command has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (10 pts), boolean chains 4, error handling 1, ternaries 1 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/host.py"},"region":{"startLine":752}}}],"partialFingerprints":{"codehealthFindingId/v1":"be0ccedab70b234c18be21f1331b7fca54fbc6c54380b6e87c043fac87998daf"}},{"ruleId":"D2","level":"warning","message":{"text":"models._resolve_models (cognitive 16): models._resolve_models has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (16 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":".github/scripts/evals/models.py"},"region":{"startLine":825}}}],"partialFingerprints":{"codehealthFindingId/v1":"75db580a95725ebbe9f827c9f7ddc6b0a73990e0a328359a81054abc403b5e18"}},{"ruleId":"D2","level":"warning","message":{"text":"check_pr_scope_files._release_files (cognitive 16): check_pr_scope_files._release_files has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (10 pts), loops 2 (3 pts), boolean chains 2, error handling 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/labeling/check_pr_scope_files.py"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"a799d36919572cb03331c3ea3d0d647572fe0c2d32db994e29e1e6fed7601b61"}},{"ruleId":"D2","level":"warning","message":{"text":"build_release_notes.build_base_body (cognitive 16): build_release_notes.build_base_body has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (12 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":".github/scripts/release/build_release_notes.py"},"region":{"startLine":1548}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcca51ed5b97c805afddf6a455211d092e24982b30d47ac1b527f3dd7ab5866f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_code/app.py: FileTooLong \u2014 18826 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 18326 over it, 37.65\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"500bfea8e04f92868e552a87806a907b2812bb3974b1c399287266cc7349f3df"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DeepAgentsApp: TooManyMethods \u2014 659 methods. The bar is 30 methods; this is 629 over it, 21.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":"libs/code/deepagents_code/app.py"},"region":{"startLine":3222}}}],"partialFingerprints":{"codehealthFindingId/v1":"59b7593c86c3ca0ea3475bf922749ab08cec76387d2adc93c1a8ecbb99d405fa"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_code/main.py: FileTooLong \u2014 3921 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 3421 over it, 7.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":"libs/code/deepagents_code/main.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8414d9c79136fc5d58a6a77a7ebdd7f6a03ec7f42577d7f9824d09bd7414f2d8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_code/config.py: FileTooLong \u2014 3524 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 3024 over it, 7.05\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/config.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"06e43a390697a099f8c814fba08dbd466ff5529c0ce7d41cea695891fc61088e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_code/model_config.py: FileTooLong \u2014 3262 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 2762 over it, 6.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":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e5b59e9e95b80b418e407953226e11cb9db7e6c04650b74dc7542547de46f60"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_code/auto_mode.py: FileTooLong \u2014 2994 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 2494 over it, 5.99\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/auto_mode.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c53dfafb3805b5c30c39e9440eba6fe5aa5a39987badc1ef70f6304fe03e5bf"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: tui/textual_adapter.py: FileTooLong \u2014 2786 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 2286 over it, 5.57\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/textual_adapter.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a2d5188db3f9fc36aba330de0cfe27969b1f5a0749c076017e4c77bb3ca0011"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: widgets/messages.py: FileTooLong \u2014 2673 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 2173 over it, 5.35\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/messages.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"358c9d18d2e376408dd04a3f352e18d5ed0fc60c1143e2b0e15d47f1cbc5f244"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: middleware/filesystem.py: FileTooLong \u2014 2388 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1888 over it, 4.78\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":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b466d27c2014f7f9defab80de59d9c2759892f6eb5a275e5240fe39583ca0588"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: widgets/chat_input.py: FileTooLong \u2014 2194 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1694 over it, 4.39\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/chat_input.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a57c18eca5713839073b6bc34dece0ec9b6e8afc01db470e356fedc6a6d8f6bd"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_code/update_check.py: FileTooLong \u2014 2131 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1631 over it, 4.26\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/update_check.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e86dc377b623d997c43d690946c31c55462ae93ede9fde2bc3306ac9bb144f7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_code/agent.py: FileTooLong \u2014 2106 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1606 over it, 4.21\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/agent.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"da7a36e78567fd234acd99a7c5b786fc3d8a4e6f3d4788002f8936841ba143b9"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_code/config_manifest.py: FileTooLong \u2014 1981 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1481 over it, 3.96\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":"libs/code/deepagents_code/config_manifest.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1289343d80f534d35c52a6d096b221361be7b85fc8c46fea0022790db59cedd"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_talon/host.py: FileTooLong \u2014 1947 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1447 over it, 3.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":"libs/talon/deepagents_talon/host.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4cbf495b7f2b55e6a8022d02b6b49e13ed432e974926bdc392cbb8ad77e432a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: widgets/thread_selector.py: FileTooLong \u2014 1852 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1352 over it, 3.70\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/thread_selector.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"15728072a4c5b3284cc2c0345e805130443b3d24f97aa73e006f0fee369f30b8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: client/non_interactive.py: FileTooLong \u2014 1821 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1321 over it, 3.64\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":"libs/code/deepagents_code/client/non_interactive.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5572085ab969730fa7e504885c47a1fd72ee0ace48de4315d940bff63016054"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ThreadSelectorScreen: TooManyMethods \u2014 106 methods. The bar is 30 methods; this is 76 over it, 3.53\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/thread_selector.py"},"region":{"startLine":746}}}],"partialFingerprints":{"codehealthFindingId/v1":"794105f24b3d3d2a601ff975c44adbef1d5847205c0904f0dbe965f525d80013"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_code/cost_tracking.py: FileTooLong \u2014 1760 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1260 over it, 3.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":"libs/code/deepagents_code/cost_tracking.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"88a65b4fff4a6969a63df64bff1d1c5afb951ab028f46986f901ad8008df3e0d"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ChatInput: TooManyMethods \u2014 91 methods. The bar is 30 methods; this is 61 over it, 3.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":"libs/code/deepagents_code/tui/widgets/chat_input.py"},"region":{"startLine":2136}}}],"partialFingerprints":{"codehealthFindingId/v1":"55663f0f51fe708c08337251c52c25d63966695445f6617f79e7ad94d0be6aec"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_talon/runtime.py: FileTooLong \u2014 1512 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1012 over it, 3.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":"libs/talon/deepagents_talon/runtime.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"20e672a8a63b192b4218e401f0305ece5d8fdbb3154730caf7e2cc59db64c085"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: harness/_nvidia_nemotron_3_ultra.py: FileTooLong \u2014 1455 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 955 over it, 2.91\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":"libs/deepagents/deepagents/profiles/harness/_nvidia_nemotron_3_ultra.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c69dc3be426e8a40ca71e356192be96cc49906930d7b99aba308c315d06773e0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_code/mcp_tools.py: 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":"libs/code/deepagents_code/mcp_tools.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"64b69c18f6104910628edb80774e7490b50d04198210fdad250ec590e8b5f30e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: widgets/model_selector.py: FileTooLong \u2014 1421 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 921 over it, 2.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":"libs/code/deepagents_code/tui/widgets/model_selector.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd6b69b6345e8f8605e9c6dfff22f661c5db1914a6d81383881115bf5d22e332"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_code/mcp_auth.py: FileTooLong \u2014 1277 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 777 over it, 2.55\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/mcp_auth.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2829be2f1360c4e49a0132aa88eabf7ae19fc93578b22b171210d185ffe4a249"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ToolCallMessage: TooManyMethods \u2014 76 methods. The bar is 30 methods; this is 46 over it, 2.53\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/messages.py"},"region":{"startLine":1853}}}],"partialFingerprints":{"codehealthFindingId/v1":"e55d1d3ce01a0e12a2cd11e3df1a114046e3415dcc0828f0a3abdd1897b55864"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: release/build_release_notes.py: FileTooLong \u2014 1203 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 703 over it, 2.41\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/release/build_release_notes.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6c5b4c575a0250034cbaeaffd29adc48f90c5fac9e26759cdd745fed127d891"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: backends/sandbox.py: FileTooLong \u2014 1196 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 696 over it, 2.39\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/sandbox.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"141677b86de4dbff011c86f734268dc092b0d3805f769886c9afda77f031b4a5"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: TalonHost: TooManyMethods \u2014 67 methods. The bar is 30 methods; this is 37 over it, 2.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":"libs/talon/deepagents_talon/host.py"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"0add42c0a3589f573992d6fe2942bd332475d879858402ad974e959bac76524c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: widgets/auth.py: FileTooLong \u2014 1104 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 604 over it, 2.21\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/auth.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed23e52d276607d04b926053ef75a628955c815b0b726c37b422989636694965"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_code/goal_rubric.py: FileTooLong \u2014 1072 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 572 over it, 2.14\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/goal_rubric.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"67ae562f5b28a4deb1d580266897287df828a9dad7d404e002d74871ff1a691d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: hooks/server_middleware.py: FileTooLong \u2014 1063 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 563 over it, 2.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":"libs/code/deepagents_code/hooks/server_middleware.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4aa6bd17acf099a6e955a6ab972eb7ca185abca782227df8cfe655b72bb3b5f5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: cron/jobs.py: FileTooLong \u2014 1063 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 563 over it, 2.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":"libs/talon/deepagents_talon/cron/jobs.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"32648b8c67e978dc460aa9e6727b299b57921c26cbc75fa046cea69fe8c4f8bf"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: channels/slack.py: FileTooLong \u2014 1047 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 547 over it, 2.09\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/channels/slack.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"add63b59a5f2fe3deccc8e84372f2f819552b12aaa88b8901eb0be8a460d8bad"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: middleware/summarization.py: FileTooLong \u2014 1041 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 541 over it, 2.08\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/summarization.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ce9b8b2519edf9e158b2d2839fdee58023a9e9ed1912a9dcf77308f3ac984e1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: channels/discord.py: FileTooLong \u2014 1019 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 519 over it, 2.04\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/channels/discord.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6428be9dc9a4093eb19c00fadac896c04f6e0b70d9f50b183186c5dc84887fc0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: plugin_manager/__init__.py: FileTooLong \u2014 995 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 495 over it, 1.99\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/modals/plugin_manager/__init__.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9554125b34d58758728b7130b209aa36ae88c33d9eb1cf2a3686869f015e43b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_code/sessions.py: FileTooLong \u2014 985 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 485 over it, 1.97\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/sessions.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"11db8c577430ac346904a4ee11a2105bca1902fc361523368fe16e92f782c67b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: channels/telegram.py: FileTooLong \u2014 956 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 456 over it, 1.91\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":"libs/talon/deepagents_talon/channels/telegram.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"255b920ad12beef674807a231de31c27ad37b0a3a22d17d8f3856fef412bacd6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_acp/server.py: FileTooLong \u2014 955 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 455 over it, 1.91\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":"libs/acp/deepagents_acp/server.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"82f4cd357cd13d2b368d501432819f1729b1121256250cd999fbdf26cd4c084e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_code/offload_middleware.py: FileTooLong \u2014 940 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 440 over it, 1.88\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/offload_middleware.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0657617323fa30b017dc3b73a9884b10e218a8bc742dd7e6ea8758832873443f"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ModelSelectorScreen: TooManyMethods \u2014 56 methods. The bar is 30 methods; this is 26 over it, 1.87\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/model_selector.py"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"95e9c03c039e7892ee1822068c7996d31c9232d24337ede9f0ea4c5fa667598f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: configuration/providers.py: FileTooLong \u2014 932 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 432 over it, 1.86\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/configuration/providers.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d0237b665b4196eea0a9d4cdafbbecaee17842a6713c7b10d60cd899c393295"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: middleware/async_subagents.py: FileTooLong \u2014 915 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 415 over it, 1.83\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/async_subagents.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"42e53e0f74f91a21fc8d83aceb774dbfd8530f9deb334cf75ec08c211416e4dd"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: client/remote_client.py: FileTooLong \u2014 913 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 413 over it, 1.83\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/client/remote_client.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"96c1cd895168c1f7e67e6f83c84291d378612de1368123672df9fa1959775114"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_talon/mcp_auth.py: FileTooLong \u2014 898 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 398 over it, 1.80\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/mcp_auth.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"37f27bc3826fbc0170e9b87f05ed8154a86b5cd404ebfc19a6cbb58da8f9ab05"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: widgets/debug_console.py: FileTooLong \u2014 894 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 394 over it, 1.79\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/debug_console.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c748cc844daf7a6ed5bf8ccbda9fc3f08e02b09cb01726a5bababb8085c0755a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: backends/filesystem.py: FileTooLong \u2014 870 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 370 over it, 1.74\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":"libs/deepagents/deepagents/backends/filesystem.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f4973ee288b1ce2548efdaf74485e5eb14a37de6cb027e964f94a2357223be7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: release/check_release_deps.py: FileTooLong \u2014 849 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 349 over it, 1.70\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/release/check_release_deps.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7085fa160a85c25a970e97945b8e6b9dac8cfdf912f730fb56d75149960d881"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: PluginManagerScreen: TooManyMethods \u2014 49 methods. The bar is 30 methods; this is 19 over it, 1.63\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/modals/plugin_manager/__init__.py"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1fbefae8c13334a8ef1554a583a9865e467ebe719e9d0a959f05dec2ae4edc5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: integrations/sandbox_factory.py: FileTooLong \u2014 816 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 316 over it, 1.63\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/integrations/sandbox_factory.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fce73e82a3b36396cc6def5db65b455a53256342cdff9032357e98d171509991"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_code/offload_api.py: FileTooLong \u2014 811 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 311 over it, 1.62\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/offload_api.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"51d1977c4d75cb23e5130c7d4238afb4f5e7c164b4390cd8c7f535767666f76d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_code/_session_stats.py: FileTooLong \u2014 805 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 305 over it, 1.61\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/_session_stats.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"723bf02ec2725f471373dd78c8c4d6918908b15825162aec3525b2d4f790e435"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ChatTextArea: TooManyMethods \u2014 48 methods. The bar is 30 methods; this is 18 over it, 1.60\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/chat_input.py"},"region":{"startLine":572}}}],"partialFingerprints":{"codehealthFindingId/v1":"01790e910597cf1f85b9a4438f531f999aa6c82610bbb18f92dbb64ca19d70a4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_code/ui.py: FileTooLong \u2014 793 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 293 over it, 1.59\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/ui.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ed2e528dae066d033ce0db92bea97b150cabf81c11fea30c91a80741024a486"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: widgets/mcp_viewer.py: FileTooLong \u2014 789 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 289 over it, 1.58\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/mcp_viewer.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0a5090a33d65226e8df1b25ac30fc8b781f3c49e940055dcdf4229a21ff930f"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: StatusBar: TooManyMethods \u2014 47 methods. The bar is 30 methods; this is 17 over it, 1.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":"libs/code/deepagents_code/tui/widgets/status.py"},"region":{"startLine":559}}}],"partialFingerprints":{"codehealthFindingId/v1":"5aeacfa7b82a1c254ee85ee0c0ff8c36337245a21defc9c8b7264ec9fc1a6953"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: middleware/rubric.py: FileTooLong \u2014 775 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 275 over it, 1.55\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/rubric.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"363b2d5c498dacff4c0904c044ae1e4080c39d978f38ba015ee241243b5e8706"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_code/extras_info.py: FileTooLong \u2014 773 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 273 over it, 1.55\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/extras_info.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac22979b624cbd5480106195782be6e32921746b65c94518f4812ec022fb6bec"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: channels/whatsapp.py: FileTooLong \u2014 765 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 265 over it, 1.53\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/channels/whatsapp.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"58b3629720c76e04fd909ef84073afb72575f2817363548ae7b53a2691092d16"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: widgets/status.py: 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":"libs/code/deepagents_code/tui/widgets/status.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5711f6c3bb31ba1f570bb48c091d1b74e6229e2519d9ca24493746115582961a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: widgets/ask_user.py: FileTooLong \u2014 749 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 249 over it, 1.50\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/ask_user.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"01fd64d23d017cd7f14e715cbecfc0b061ea4070a3a429e477dd47b5e5522c75"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: commands/config.py: FileTooLong \u2014 745 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 245 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":"libs/code/deepagents_code/client/commands/config.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"becfd5364d3494903df307af2bcd8d558438773f7abecaec9bc775f5632040cf"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_code/model_retry.py: FileTooLong \u2014 739 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 239 over it, 1.48\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_retry.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"faea5064952e96c09c41895119a35899dc647d17ddba1a2a2b72fc28b0f40c84"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: evals/aggregate_unified.py: FileTooLong \u2014 729 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 229 over it, 1.46\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/evals/aggregate_unified.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"08866b1a899a307627206f5c78b84c149d6e4fdcd9fa404b50ea4c65f88f12a2"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_talon/mcp.py: FileTooLong \u2014 729 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 229 over it, 1.46\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/mcp.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb3d444a8dc0d07921d3df1ae8175b191620ca49dad19b254f16157cac94994d"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DeepAgentRuntime: TooManyMethods \u2014 43 methods. The bar is 30 methods; this is 13 over it, 1.43\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/runtime.py"},"region":{"startLine":291}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e85b3f3f5a7d50427e2235696ae51a1e7f2bb67f61269631bab39580f611069"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: SubagentPanel: TooManyMethods \u2014 42 methods. The bar is 30 methods; this is 12 over it, 1.40\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/subagent_panel.py"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"474d42cce40f6799322dd7c91ce951a733eeecdc004909b2fe9ff435dafdc524"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: release/check_wheel_dep_freshness.py: FileTooLong \u2014 700 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 200 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":".github/scripts/release/check_wheel_dep_freshness.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c16838bc4597a0355760926c4c59aea996e4578e1fd0dd2d24752dae6773c961"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: evals/aggregate_unified_compare.py: FileTooLong \u2014 694 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 194 over it, 1.39\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/evals/aggregate_unified_compare.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"262e64f9e5c5446e3a6b2b99e70af74c2ca3f27e2eddb5d28d169e54866fe443"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: launch/server.py: FileTooLong \u2014 670 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 170 over it, 1.34\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/client/launch/server.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc502fc83270beeca70ddd5b38b92a48c9ef587a53009f9eabe513763f6f540a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: langchain_quickjs/_repl.py: FileTooLong \u2014 664 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 164 over it, 1.33\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":"libs/partners/quickjs/langchain_quickjs/_repl.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebc2e41e875fbbccd6e89ba61840142d05f00fd61e6900399b33dd367014ee9e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_code/server_graph.py: FileTooLong \u2014 657 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 157 over it, 1.31\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/server_graph.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b98c0f18b061dd4889079fd6fb6354d8da0ff21650733284085b87cfd0c2a9d1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: widgets/autocomplete.py: FileTooLong \u2014 627 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 127 over it, 1.25\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/autocomplete.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5c34d924fd26a0932d9072532f3d6dfa82ddef0346890659296a675ae0ffe1d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: plugins/marketplace.py: FileTooLong \u2014 620 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 120 over it, 1.24\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/plugins/marketplace.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ae6744a53da2c76a104e5d90f593e7c8cb10119fc5996e6fa5a1995e021b4df"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_code/local_context.py: FileTooLong \u2014 619 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 119 over it, 1.24\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/local_context.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e60734ecab8705fb6ccb6d517e51b2b2a1c0358aa35a49d6a31c6ad9cb22ae5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: configuration/resolver.py: FileTooLong \u2014 610 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 110 over it, 1.22\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/configuration/resolver.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8bb614b9e3721e3844b1562b8d92ff4bf76e6d33d519dfe8918c9a9dd979ee0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: drbench/adapter.py: FileTooLong \u2014 607 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 107 over it, 1.21\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/evals/harbor_adapters/drbench/adapter.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8546328bb63f01cdb31b20d19b3e33970346983a62f5991d4479efe23f911dc6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: middleware/skills.py: FileTooLong \u2014 578 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 78 over it, 1.16\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/skills.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"de687271e063d1b0f5c63663d42013e87454ed76991312e5138bdaf2fff07e8a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: evals/aggregate_shards.py: FileTooLong \u2014 571 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 71 over it, 1.14\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/evals/aggregate_shards.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce9a507d6e1a9e457279b89dc965a8ae67dd551fcd5f4572bb5bc6f14857a855"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: widgets/message_store.py: FileTooLong \u2014 571 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 71 over it, 1.14\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/message_store.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"977ae088ad2467c997b1c17893269f9e386d4443b7952030b6baaabeacbe3594"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: widgets/subagent_panel.py: FileTooLong \u2014 567 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 67 over it, 1.13\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/subagent_panel.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"80579dcc96e16de7af82415b910fb6f7f66a1c9402525ece027d70445a1a269d"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DebugConsoleScreen: 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":"libs/code/deepagents_code/tui/widgets/debug_console.py"},"region":{"startLine":722}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd8043690a661ad69e3d0539762a39454012465f66800e2f09f2b22ef11252b2"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: FilesystemMiddleware: 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":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":1819}}}],"partialFingerprints":{"codehealthFindingId/v1":"58b5e075414e84dc0cb5518c82bfa7c36bf9c0566800f603c7187de1612ea3b4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: backends/context_hub.py: 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":"libs/deepagents/deepagents/backends/context_hub.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff4fa7d7a4459b5caf6c3d123480392080fe05d5e75963019d54babd70213f2c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: scripts/inspect_sessions.py: FileTooLong \u2014 551 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 51 over it, 1.10\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"478a8a31f75aa4c7478d81ae1d4c7e0e4ea3a008d40fdb2df6293e0a860e75fb"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MessageStore: TooManyMethods \u2014 33 methods. The bar is 30 methods; this is 3 over it, 1.10\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/message_store.py"},"region":{"startLine":655}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7fce5fa6e03e4052fb94756a728ed7141d8eb4814cee9e86572ab3b60dad5d3"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: _DeepAgentsSummarizationMiddleware: TooManyMethods \u2014 33 methods. The bar is 30 methods; this is 3 over it, 1.10\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/summarization.py"},"region":{"startLine":524}}}],"partialFingerprints":{"codehealthFindingId/v1":"8547a0442c2511d359a080dc4030c2cec86c0765609d00a10b9e5a5ad498cda2"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_talon/store_archive.py: FileTooLong \u2014 549 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 49 over it, 1.10\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/store_archive.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e3664ba829fe142bb016768d7f82c68cdd2991694b894a4b9536dad541986b1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: evals/models.py: 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":".github/scripts/evals/models.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7b3504ba303e54b4d650dbd57a66484aef5e4687559b0663369692eb2971f6a"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ContextHubBackend: TooManyMethods \u2014 32 methods. The bar is 30 methods; this is 2 over it, 1.07\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/context_hub.py"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"d67fbb47dceb7554127efb9125266224b4b477af77d441e23a01ad45f438aa2e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: hooks/transcript.py: FileTooLong \u2014 530 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 30 over it, 1.06\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/hooks/transcript.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"39655b4fb465d666b6fc4f30f480da1600da2dbcbe955745935e39ff458be07d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_code/file_ops.py: FileTooLong \u2014 528 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 28 over it, 1.06\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/file_ops.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"89daa2f3f51ccdb395c61a9ef23030d6e5ca3c6047db5a233a74e8f541499140"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: whatsapp_bridge/bridge.js: FileTooLong \u2014 527 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 27 over it, 1.05\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/channels/whatsapp_bridge/bridge.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"98dac94e600e58bf76b14588d73b1da54a761c0f07b0bbf2cf848ed5cc205304"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: widgets/notification_center.py: FileTooLong \u2014 522 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 22 over it, 1.04\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/notification_center.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"021df68324a7e12731cc8ee811511e37f72a4b25c3eba06ff93e73caceceaddd"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_code/_server_config.py: FileTooLong \u2014 520 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 20 over it, 1.04\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/_server_config.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6776c28d93bc5d5b59adcbded385476f376aa9ca3ce1471243a95fa62de53ce3"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: backends/composite.py: FileTooLong \u2014 518 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 18 over it, 1.04\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/composite.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"272c260aa791bea21d354bed39d1ef70305aa8d4ac8abd693e70ab3b59c69d12"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MCPViewerScreen: 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":"libs/code/deepagents_code/tui/widgets/mcp_viewer.py"},"region":{"startLine":767}}}],"partialFingerprints":{"codehealthFindingId/v1":"87b6a3110637651274ac117c386f1b4cd5e36834f50f2540f4019e9c090d2a37"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: deepagents_code/configurable_model.py: FileTooLong \u2014 514 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 14 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":"libs/code/deepagents_code/configurable_model.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"177e68e446c005544395a0c21dac68d638cd89759f45baba46a36189cb970b52"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (100 shared lines): libs/deepagents/deepagents/middleware/summarization.py:1531-1662 | libs/deepagents/deepagents/middleware/summarization.py:1669-1801 \u2014 These two members are variants of one another: 100 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/summarization.py"},"region":{"startLine":1531}}}],"partialFingerprints":{"codehealthFindingId/v1":"33de0c78c610ab4a044d69cbe1a772fc1086977fb4f8f42ecd161e00ac93e1dc"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (62 shared lines): libs/deepagents/deepagents/middleware/filesystem.py:2305-2393 | libs/deepagents/deepagents/middleware/filesystem.py:2493-2583 \u2014 These two members are variants of one another: 62 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":2305}}}],"partialFingerprints":{"codehealthFindingId/v1":"256f4821157e5f2bedd9333e33deda7a3ec8ebc519f01512939be700c938d3a4"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (46 shared lines): libs/code/deepagents_code/_repository_bounds.py:275-338 | libs/code/deepagents_code/_repository_bounds.py:341-401 \u2014 These two members are variants of one another: 46 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/_repository_bounds.py"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6227717a4fa568b8471628c154215b32628622d96d8608e19988e594347ff73"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (45 shared lines): libs/code/deepagents_code/main.py:1339-1446 | libs/code/deepagents_code/main.py:4047-4216 \u2014 These two members are variants of one another: 45 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":1339}}}],"partialFingerprints":{"codehealthFindingId/v1":"356443182e1812ea23f74df711191b1b00e80cf6009733c0f2827f60274a67cd"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (41 shared lines): libs/code/deepagents_code/main.py:4047-4216 | libs/code/deepagents_code/main.py:4393-4570 \u2014 These two members are variants of one another: 41 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":4047}}}],"partialFingerprints":{"codehealthFindingId/v1":"75a383b967212d3a64909aa6d3b85cf21198112c264c806caf9921d8c894f261"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (37 shared lines): libs/deepagents/deepagents/backends/composite.py:467-549 | libs/deepagents/deepagents/backends/composite.py:559-611 \u2014 These two members are variants of one another: 37 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/composite.py"},"region":{"startLine":467}}}],"partialFingerprints":{"codehealthFindingId/v1":"f187c171419820ef873dc74f80db679d3fac4d023887e244a6384db4b1aec8a4"}},{"ruleId":"D4","level":"warning","message":{"text":"Edited copy of a member (32 corresponding lines): libs/code/deepagents_code/client/launch/server_manager.py:331-488 | libs/code/deepagents_code/client/launch/server_manager.py:532-633 \u2014 These two members are one piece of code written twice and then edited apart: 32 consecutive lines correspond almost exactly, broken only by small local edits. Most of that correspondence is NOT reported as duplicated blocks below \u2014 the edits cut it into fragments and only the largest of them clear the block floor, so the rows below understate it. The repair is at the members\u0027 grain \u2014 factor the shared implementation into one the two call with their differences as parameters or as an injected step, or, where the difference is systematic (an extra return value, one transport against another), generate one from the other. Left alone, the next edit has to be made twice and the two will drift further apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/client/launch/server_manager.py"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"914aada2b3c06bd9eba004ba76f842157de7a2d413c6212ffc133ba3f54426e4"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (11 members, 50\u002B identical tokens): libs/code/deepagents_code/model_config.py:4095-4154 | libs/code/deepagents_code/model_config.py:4334-4402 | libs/code/deepagents_code/model_config.py:4514-4576 | libs/code/deepagents_code/model_config.py:4654-4734 | libs/code/deepagents_code/model_config.py:4738-4800 | libs/code/deepagents_code/model_config.py:5949-6072 | libs/code/deepagents_code/model_config.py:6320-6360 | libs/code/deepagents_code/model_config.py:6388-6424 | libs/code/deepagents_code/model_config.py:6609-6653 | libs/code/deepagents_code/model_config.py:6657-6703 | libs/code/deepagents_code/model_config.py:6892-6938 \u2014 These 11 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 11 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 11 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":4095}}}],"partialFingerprints":{"codehealthFindingId/v1":"296bcc2aa07e00571299358b3f96a2eda9804e45ee055c79910e1096a36a721d"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): libs/code/deepagents_code/app.py:21439-21462 | libs/code/deepagents_code/app.py:21484-21515 | libs/code/deepagents_code/app.py:21518-21543 | libs/code/deepagents_code/app.py:25417-25473 | libs/code/deepagents_code/app.py:26590-26627 \u2014 These 5 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 5 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 5 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":21439}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fb2fa67600d504499e195f3b026708ff5da5e7661d59226ab0ed1de05dbc5a1"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): libs/code/deepagents_code/ui.py:378-393 | libs/code/deepagents_code/ui.py:654-670 | libs/code/deepagents_code/ui.py:841-863 | libs/code/deepagents_code/ui.py:1007-1027 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/ui.py"},"region":{"startLine":378}}}],"partialFingerprints":{"codehealthFindingId/v1":"131ef491fdd76ccc9c46faadf1d119fc6bc168c8661ce1ea3bb12e733a1d6035"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (53\u201355 lines \u00D7 2): libs/deepagents/deepagents/middleware/filesystem.py:3147-3201 | libs/deepagents/deepagents/middleware/filesystem.py:3237-3289 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":3147}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddd1bc592fd0769e4567763c7ef0a4a012e8f5aa9b58111583d2d41e4119a0cc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24\u201353 lines \u00D7 2): libs/deepagents/deepagents/middleware/summarization.py:1136-1188 | libs/deepagents/deepagents/middleware/summarization.py:1218-1241 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/summarization.py"},"region":{"startLine":1136}}}],"partialFingerprints":{"codehealthFindingId/v1":"63295de6885726b4fbc97a9379a2115997389e0eab79bcede150a663617268c0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (53 lines \u00D7 2): libs/deepagents/deepagents/middleware/summarization.py:1531-1583 | libs/deepagents/deepagents/middleware/summarization.py:1669-1721 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note first that the copies are not typed on the same thing: the declarations holding them bind \u0060handler\u0060 to \u0060Callable[[ModelRequest], ModelResponse]\u0060 in one and \u0060Callable[[ModelRequest], Awaitable[ModelResponse]]\u0060 in another, and the duplicated lines use it. The extracted unit therefore needs a parameter type that fits BOTH \u2014 their common supertype where they have one, or a new abstraction over them where they do not \u2014 and settling that is the step that comes BEFORE the extraction above. Where the two types are deliberately unrelated, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/summarization.py"},"region":{"startLine":1531}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ccf2a8a010b1d7126d678bfae8d29469f4a8ad6b9567e9aedf4d9520fe7a424"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (50 lines \u00D7 2): libs/code/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py:36-85 | libs/code/examples/skills/skill-creator/scripts/quick_validate.py:36-85 \u2014 before extracting anything, compare \u0060libs/code/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py\u0060 and \u0060libs/code/examples/skills/skill-creator/scripts/quick_validate.py\u0060 as WHOLE FILES: 93% of the shorter file\u0027s lines also appear in the other, so this reads as one file having been copied from the other rather than as a helper waiting to be extracted. The 2 duplicated block(s) this scan matched between them are fragments of that copy, not the extent of it \u2014 treat the file pair as the unit. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"6867565b371a6ec226fc5ea138d9e30dc2d7ac2b4adcf4d6652a44d97bac8057"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (47 lines \u00D7 2): libs/code/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py:102-148 | libs/code/examples/skills/skill-creator/scripts/quick_validate.py:96-142 \u2014 before extracting anything, compare \u0060libs/code/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py\u0060 and \u0060libs/code/examples/skills/skill-creator/scripts/quick_validate.py\u0060 as WHOLE FILES: 93% of the shorter file\u0027s lines also appear in the other, so this reads as one file having been copied from the other rather than as a helper waiting to be extracted. The 2 duplicated block(s) this scan matched between them are fragments of that copy, not the extent of it \u2014 treat the file pair as the unit. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fa114c9f7ea83c50ee6bae789f8935475c737eabb324850006afbf86964d18d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (33\u201339 lines \u00D7 2): libs/code/deepagents_code/configurable_model.py:530-568 | libs/code/deepagents_code/configurable_model.py:617-649 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/configurable_model.py"},"region":{"startLine":530}}}],"partialFingerprints":{"codehealthFindingId/v1":"4432357d80bad7ccf2c6434b53746cdfd2d354daf2070bf62d7869bc1d1d1b4b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (37\u201338 lines \u00D7 2): libs/code/deepagents_code/app.py:23374-23410 | libs/code/deepagents_code/app.py:23419-23456 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/app.py:23374\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":23374}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fe1def607047fda7400a190dc84dc215afce904898997cefb758946d76acc6b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (37\u201338 lines \u00D7 2): libs/code/deepagents_code/configurable_model.py:570-606 | libs/code/deepagents_code/configurable_model.py:654-691 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/configurable_model.py:654\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/configurable_model.py"},"region":{"startLine":570}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b34c13be268672d23ad8540c6263a90785c5b2d566f0b50aabd046b1eace3a8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (34\u201336 lines \u00D7 2): libs/deepagents/deepagents/middleware/filesystem.py:2659-2694 | libs/deepagents/deepagents/middleware/filesystem.py:2736-2769 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":2659}}}],"partialFingerprints":{"codehealthFindingId/v1":"4176c8f2099bf21ec98606c31e6178743e36518a36e9138504bfd4e485fe5ec2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26\u201334 lines \u00D7 2): libs/code/deepagents_code/ui.py:157-190 | libs/code/deepagents_code/ui.py:292-317 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/ui.py:292\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/ui.py"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0b726db2427af10f9d1cdba129a28189fbf5e81def0549b67bf41e2df8f1597"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (28\u201332 lines \u00D7 2): libs/code/deepagents_code/ui.py:216-247 | libs/code/deepagents_code/ui.py:261-288 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/ui.py:216\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/ui.py"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"4330a520e60d342186a71fd5893c58089aebab5046723e5741434cfdafd8e7ea"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27\u201332 lines \u00D7 2): libs/deepagents/deepagents/_excluded_middleware.py:29-55 | libs/deepagents/deepagents/_excluded_middleware.py:176-207 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/_excluded_middleware.py"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fb5f02a0c0c377890ada995fb823bed040d0956b51abb5fcbfb0e3fd8e77e4a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (30\u201331 lines \u00D7 2): libs/deepagents/deepagents/middleware/filesystem.py:2589-2619 | libs/deepagents/deepagents/middleware/filesystem.py:2697-2726 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":2589}}}],"partialFingerprints":{"codehealthFindingId/v1":"45d70f3c958248f89874511b09c0f0cb2007ca9bd612b6e4f3089dbbd2b6d324"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201330 lines \u00D7 2): libs/code/deepagents_code/ui.py:137-166 | libs/code/deepagents_code/ui.py:477-493 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/ui.py:137\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/ui.py"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"8edb2099df6eb3007e2b69df40e6b328804919f17cdc8f54c95f028924c74032"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (30 lines \u00D7 2): libs/deepagents/deepagents/middleware/filesystem.py:2906-2935 | libs/deepagents/deepagents/middleware/filesystem.py:2982-3011 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":2906}}}],"partialFingerprints":{"codehealthFindingId/v1":"699ae16c862197c04d948c8bae7b6bce608d214388e6af5ce13d4f8773b7ac6b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25\u201329 lines \u00D7 2): libs/code/deepagents_code/_git.py:406-430 | libs/code/deepagents_code/_git.py:490-518 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/_git.py"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fcb4fdccf1959c27881160c2d524007acdfcb18b35e6da281a0c7b28587719f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201329 lines \u00D7 2): libs/deepagents/deepagents/backends/composite.py:878-906 | libs/deepagents/deepagents/backends/composite.py:921-936 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/composite.py"},"region":{"startLine":878}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8655ad993b9ca0a5e5c7499fbfc0b2243f19bef4de7ae9be03bb461a674bbf0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27\u201328 lines \u00D7 2): libs/deepagents/deepagents/middleware/filesystem.py:2789-2816 | libs/deepagents/deepagents/middleware/filesystem.py:2836-2862 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":2789}}}],"partialFingerprints":{"codehealthFindingId/v1":"c86901c6776243bf98b35cd7d7f2b08dc40fac6c09ad8f6774df2da6780d1f1d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2): libs/code/deepagents_code/extras_info.py:69-95 | libs/deepagents/deepagents/_version.py:48-74 \u2014 before extracting anything, compare \u0060libs/code/deepagents_code/extras_info.py\u0060 and \u0060libs/deepagents/deepagents/_version.py\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 81 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/extras_info.py"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"17f8e87311ff5f6341de380fffad793f90370403083fd4863552d7483fd8787f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25\u201327 lines \u00D7 2): libs/code/deepagents_code/ui.py:172-196 | libs/code/deepagents_code/ui.py:255-281 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/ui.py:172\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/ui.py"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cd466ae8b2e0f59b2409acc6cdbc91da0b505221ef3dcca1d0f161c8c46e7d6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201327 lines \u00D7 2): libs/deepagents/deepagents/backends/composite.py:951-977 | libs/deepagents/deepagents/backends/composite.py:993-1006 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/composite.py"},"region":{"startLine":951}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bfe800dc9e4f756db8646e28ad47699ea369f4ce5b8168cda5a5539789273eb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2): libs/deepagents/deepagents/middleware/async_subagents.py:707-733 | libs/deepagents/deepagents/middleware/async_subagents.py:749-775 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/deepagents/deepagents/middleware/async_subagents.py:707\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/async_subagents.py"},"region":{"startLine":707}}}],"partialFingerprints":{"codehealthFindingId/v1":"eda3e39a1ea0f139e8bf263d3ff50dc4e83393fdd0c08ca43ef72a647421979e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2): libs/deepagents/deepagents/middleware/async_subagents.py:997-1023 | libs/deepagents/deepagents/middleware/async_subagents.py:1037-1063 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/deepagents/deepagents/middleware/async_subagents.py:997\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/async_subagents.py"},"region":{"startLine":997}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6dfbf1edf1dfab04f4fa2fc20a1ac7aeb1684f9699aef686108cf37344b0a82"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26\u201327 lines \u00D7 2): libs/deepagents/deepagents/middleware/filesystem.py:2399-2425 | libs/deepagents/deepagents/middleware/filesystem.py:2442-2467 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":2399}}}],"partialFingerprints":{"codehealthFindingId/v1":"75b8323c0d56b6620190bf5febf6d46617cff7b799802f03b20a0efb504eb253"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26\u201327 lines \u00D7 2): libs/deepagents/deepagents/middleware/subagents.py:838-864 | libs/deepagents/deepagents/middleware/subagents.py:869-894 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/deepagents/deepagents/middleware/subagents.py:869\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/subagents.py"},"region":{"startLine":838}}}],"partialFingerprints":{"codehealthFindingId/v1":"b539f77c3939ecf099dc28af2e10e81db6ccc67e3548896b4ec37d89a42d2a06"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22\u201326 lines \u00D7 3): libs/code/deepagents_code/ui.py:169-192 | libs/code/deepagents_code/ui.py:252-277 | libs/code/deepagents_code/ui.py:296-317 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/ui.py:169\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/ui.py"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"50222e0fee0dc7efd20be2525b5bba41374aeab065c522dbf4cf20c0db58fcbe"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2): libs/code/deepagents_code/tui/textual_adapter.py:3944-3969 | libs/code/deepagents_code/tui/textual_adapter.py:3988-4013 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/textual_adapter.py"},"region":{"startLine":3944}}}],"partialFingerprints":{"codehealthFindingId/v1":"5316aa305c809bacc82bb6eda8ab9aa0d994230c35d311d5989fe4218b29dd15"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2): libs/deepagents/deepagents/backends/filesystem.py:352-377 | libs/deepagents/deepagents/backends/filesystem.py:391-416 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/filesystem.py"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"fde7c990e7a81a6cad4def3776d943ad2de42c5fff57f7b12971b78c26a47c14"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2): libs/evals/harbor_adapters/contextbench/main.py:17-42 | libs/evals/harbor_adapters/drbench/main.py:15-40 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/evals/harbor_adapters/contextbench/main.py:17\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/evals/harbor_adapters/contextbench/main.py"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"c05382600766beb9457dbd77330fdd13b7d54726548ff9dbb11b42e90b939530"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2): libs/code/deepagents_code/_git.py:439-463 | libs/code/deepagents_code/_git.py:641-665 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/_git.py"},"region":{"startLine":439}}}],"partialFingerprints":{"codehealthFindingId/v1":"4367572d8bdd658c752e01e8f45834d1420b3e96e5d804348faafb77e32ea7f0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24\u201325 lines \u00D7 2): libs/code/deepagents_code/main.py:1377-1400 | libs/code/deepagents_code/main.py:4135-4159 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/main.py:4135\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":1377}}}],"partialFingerprints":{"codehealthFindingId/v1":"cced70d0962f6d08e4fc7703c49eac57cf9d36d9c8ab36e1f5d50e98b8458737"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2): libs/deepagents/deepagents/backends/state.py:300-324 | libs/deepagents/deepagents/backends/store.py:637-661 \u2014 before extracting anything, compare \u0060libs/deepagents/deepagents/backends/state.py\u0060 and \u0060libs/deepagents/deepagents/backends/store.py\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 54 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/state.py"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"b201fcfd617351e865cf4c9920ec681fa61b7c06795302e9156802f8b745759a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2): libs/deepagents/deepagents/middleware/skills.py:712-736 | libs/deepagents/deepagents/middleware/skills.py:778-802 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/skills.py"},"region":{"startLine":712}}}],"partialFingerprints":{"codehealthFindingId/v1":"a66a8545cdf80776c5685a3c2733dd8ca847d5b4b4f70141e26ba717e6642f89"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2): libs/deepagents/deepagents/middleware/summarization.py:2246-2270 | libs/deepagents/deepagents/middleware/summarization.py:2280-2304 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/summarization.py"},"region":{"startLine":2246}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f3c32cd9f034a58267edf9a718c0838b40b14556336b39ad6c943e4ebb1f030"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23\u201324 lines \u00D7 2): libs/deepagents/deepagents/middleware/filesystem.py:2241-2264 | libs/deepagents/deepagents/middleware/filesystem.py:2269-2291 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":2241}}}],"partialFingerprints":{"codehealthFindingId/v1":"19336d23c5e5ad37b4f30a2689a0a5662b967f8a9129ae5f00d77d219b91e680"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23\u201324 lines \u00D7 2): libs/deepagents/deepagents/middleware/filesystem.py:2308-2331 | libs/deepagents/deepagents/middleware/filesystem.py:2348-2370 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":2308}}}],"partialFingerprints":{"codehealthFindingId/v1":"d74852723ae3199ceb76e7b39c6f523588469ad8a79c325d2ef381b37c6109ce"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20\u201323 lines \u00D7 2): libs/code/deepagents_code/app.py:25696-25718 | libs/code/deepagents_code/app.py:32213-32232 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":25696}}}],"partialFingerprints":{"codehealthFindingId/v1":"4277774691ff8e0720d4f5ce0f78034ecc87db418e8bf8a61b0990c50e22cabc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): libs/code/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py:254-276 | libs/code/examples/skills/skill-creator/scripts/init_skill.py:210-232 \u2014 before extracting anything, compare \u0060libs/code/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py\u0060 and \u0060libs/code/examples/skills/skill-creator/scripts/init_skill.py\u0060 as WHOLE FILES: 96% of the shorter file\u0027s lines also appear in the other, so this reads as one file having been copied from the other rather than as a helper waiting to be extracted. The 2 duplicated block(s) this scan matched between them are fragments of that copy, not the extent of it \u2014 treat the file pair as the unit. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3e8afc28d30d8388c40125aee622161e27f31426ecf60d9a769b2b0d05f80db"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): libs/code/deepagents_code/model_config.py:4006-4028 | libs/code/deepagents_code/model_config.py:4064-4086 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":4006}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e60975d21c33efe98fd16507f991715e54efae23f60b8e2e72f83464efc6217"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18\u201323 lines \u00D7 2): libs/code/deepagents_code/sessions.py:1744-1761 | libs/code/deepagents_code/sessions.py:1816-1838 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/sessions.py"},"region":{"startLine":1744}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6c22d0b6590618ebfc9d61c29cef03b9418d0f7a196cda3dde5d2c70d4ee0fd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21\u201323 lines \u00D7 2): libs/code/deepagents_code/tui/textual_adapter.py:3642-3664 | libs/code/deepagents_code/tui/textual_adapter.py:3706-3726 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/textual_adapter.py"},"region":{"startLine":3642}}}],"partialFingerprints":{"codehealthFindingId/v1":"bce8d18dcdff49c4628b98467c146efc63795d5ffa58054ab149767bcdf664d4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19\u201323 lines \u00D7 2): libs/code/deepagents_code/tui/widgets/_paste_textarea.py:774-792 | libs/code/deepagents_code/tui/widgets/chat_input.py:1556-1578 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/_paste_textarea.py"},"region":{"startLine":774}}}],"partialFingerprints":{"codehealthFindingId/v1":"959001a3e03d6ffedcdf1e8f06bff605ca81d45ddab0691ad34024af20c2b9b3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21\u201323 lines \u00D7 2): libs/code/deepagents_code/tui/widgets/_paste_textarea.py:795-815 | libs/code/deepagents_code/tui/widgets/chat_input.py:1441-1463 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/_paste_textarea.py"},"region":{"startLine":795}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f8d263551fabda51947ab105f77bb7de3cf5b827ae48d89d8069b927ac24bcd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): libs/deepagents/deepagents/middleware/filesystem.py:3212-3234 | libs/deepagents/deepagents/middleware/filesystem.py:3300-3322 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":3212}}}],"partialFingerprints":{"codehealthFindingId/v1":"92f5585b4865f987ace15a255d80c3113a96cc40f1c9619a2a135f1bedee4e1d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18\u201323 lines \u00D7 2): libs/deepagents/deepagents/middleware/filesystem.py:3652-3674 | libs/deepagents/deepagents/middleware/filesystem.py:3683-3700 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":3652}}}],"partialFingerprints":{"codehealthFindingId/v1":"b29e927d546492fe3e7caa4314a101c8ad2c1a74a295be1be08adf250aeef13d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201323 lines \u00D7 3): libs/evals/scripts/harbor_langsmith.py:40-62 | libs/evals/scripts/harbor_langsmith.py:64-86 | libs/evals/scripts/harbor_langsmith.py:87-97 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/evals/scripts/harbor_langsmith.py:40\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/evals/scripts/harbor_langsmith.py"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"547ed9cb076398a149a8102f9abee230f384476156b2572cd85d06c06e0c2b89"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): libs/code/deepagents_code/_repository_bounds.py:275-296 | libs/code/deepagents_code/_repository_bounds.py:341-362 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/_repository_bounds.py"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f6a0429be95802fe9fcd53ce3db2c82a83523b00c19f50c16d76bd408fd1bfb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20\u201322 lines \u00D7 2): libs/code/deepagents_code/app.py:26093-26114 | libs/code/deepagents_code/app.py:30842-30861 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060libs/code/deepagents_code/app.py:30862\u0060 calls \u0060isinstance\u0060 and \u0060libs/code/deepagents_code/app.py:26115\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":26093}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1ecc03d7afd8662f54e869c4e377fb7bfa9ac54ffc35c554ef69ee3cc19c17f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18\u201322 lines \u00D7 2): libs/code/deepagents_code/main.py:2425-2442 | libs/code/deepagents_code/main.py:2445-2466 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/main.py:2425\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":2425}}}],"partialFingerprints":{"codehealthFindingId/v1":"88495d52c732b2870ddc34440c64ecf7f732000e4216098194a6780a0ba57ad8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20\u201322 lines \u00D7 2): libs/code/deepagents_code/model_retry.py:631-652 | libs/code/deepagents_code/model_retry.py:680-699 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_retry.py"},"region":{"startLine":631}}}],"partialFingerprints":{"codehealthFindingId/v1":"6514dec6e09852980ca91f86a3a2c075189ecc40c0d50dfb774e2f1db0668034"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20\u201322 lines \u00D7 2): libs/code/deepagents_code/tui/widgets/_paste_textarea.py:838-857 | libs/code/deepagents_code/tui/widgets/chat_input.py:1532-1553 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/_paste_textarea.py"},"region":{"startLine":838}}}],"partialFingerprints":{"codehealthFindingId/v1":"9646153bd603e6450ba8a770bfd62869f457c181ed5c5d9079896c0ce38a1fb8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201322 lines \u00D7 2): libs/code/deepagents_code/tui/widgets/messages.py:2865-2886 | libs/code/deepagents_code/tui/widgets/messages.py:2904-2917 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/tui/widgets/messages.py:2865\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/messages.py"},"region":{"startLine":2865}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc9654bb074d3b7810a5db0bcc3636dd079aaf02fc3200744830b955c221a29e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): libs/deepagents/deepagents/backends/store.py:490-511 | libs/deepagents/deepagents/backends/store.py:531-552 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/store.py"},"region":{"startLine":490}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4eaf72d5e6b1eaf49a9af5a87437b1329335cd2a9092fa34d4a1bd51b25c92b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21\u201322 lines \u00D7 2): libs/deepagents/deepagents/middleware/filesystem.py:2039-2060 | libs/deepagents/deepagents/middleware/filesystem.py:2079-2099 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":2039}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1b6c63fc3d743fec654673763f264fdd166dcf6a1db6ea016fb52848b2b4f6a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): libs/deepagents/deepagents/middleware/summarization.py:1190-1211 | libs/deepagents/deepagents/middleware/summarization.py:1243-1264 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/summarization.py"},"region":{"startLine":1190}}}],"partialFingerprints":{"codehealthFindingId/v1":"6756051bb5d8d84fbf97acf980ab6f366a2155fd7746c1f543d698daef2ffefa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21\u201322 lines \u00D7 2): libs/deepagents/deepagents/middleware/summarization.py:1321-1341 | libs/deepagents/deepagents/middleware/summarization.py:1399-1420 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/summarization.py"},"region":{"startLine":1321}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca7280b68d364423ce6870cffb7120834f97f0cc2c89a9e286a63841876d3373"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201321 lines \u00D7 3): libs/code/deepagents_code/ui.py:140-160 | libs/code/deepagents_code/ui.py:483-491 | libs/code/deepagents_code/ui.py:970-980 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/ui.py:140\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/ui.py"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf973006a59faadd86690c4dd2a5aed90e1f9f0ea87d366ee9e6002291678e2c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19\u201321 lines \u00D7 2): libs/code/deepagents_code/auth_store.py:246-264 | libs/code/deepagents_code/mcp_auth.py:761-781 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/auth_store.py"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"af6a05302952ecc92f01f7d3fa56ca8af5a7b87f5fafbbbfeaaf7b01abfc1eb7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19\u201321 lines \u00D7 2): libs/code/deepagents_code/main.py:4935-4953 | libs/code/deepagents_code/main.py:5038-5058 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/main.py:4935\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":4935}}}],"partialFingerprints":{"codehealthFindingId/v1":"69e4f2a94344de7454983f1aad2194ee5632c77adc489c53336d0929d7b16e87"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): libs/code/deepagents_code/model_api.py:45-65 | libs/code/deepagents_code/model_api.py:155-178 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_api.py"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"fee585d1702714b6c2203aa876239ad35fe48306c58e4fb3d95210a2b20e4ae1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): libs/partners/quickjs/langchain_quickjs/middleware.py:421-441 | libs/partners/quickjs/langchain_quickjs/middleware.py:461-481 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/partners/quickjs/langchain_quickjs/middleware.py"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1ac9839da0adb3bba61a8e4e52b1da3c15bb501a48287e0c147d289f820b692"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 4): libs/deepagents/deepagents/middleware/filesystem.py:2312-2331 | libs/deepagents/deepagents/middleware/filesystem.py:2351-2370 | libs/deepagents/deepagents/middleware/filesystem.py:2406-2425 | libs/deepagents/deepagents/middleware/filesystem.py:2448-2467 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":2312}}}],"partialFingerprints":{"codehealthFindingId/v1":"f57579e39f2076ea4ce5bbe5f696cca87d02a455f251b5143926632aa64888bc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): libs/code/deepagents_code/model_config.py:1643-1662 | libs/code/deepagents_code/model_config.py:1900-1919 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":1643}}}],"partialFingerprints":{"codehealthFindingId/v1":"761c6b839ec4db2ae1ac289a4ead4c79d62970b1e009b46411ad87053b81cf97"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): libs/deepagents/deepagents/middleware/async_subagents.py:1097-1116 | libs/deepagents/deepagents/middleware/async_subagents.py:1130-1149 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/async_subagents.py"},"region":{"startLine":1097}}}],"partialFingerprints":{"codehealthFindingId/v1":"048e975d0f696506d7118aefd95711f6959759f9506b62ef030ebb9abeb0b1d4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): libs/deepagents/deepagents/middleware/filesystem.py:2372-2391 | libs/deepagents/deepagents/middleware/filesystem.py:2562-2581 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":2372}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b23e0ced415ca134fa9228c8c00619d23a6987f82f3a69631a7b09cda5525ee"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 5): libs/code/deepagents_code/app.py:21444-21462 | libs/code/deepagents_code/app.py:21497-21515 | libs/code/deepagents_code/app.py:21525-21543 | libs/code/deepagents_code/app.py:25441-25459 | libs/code/deepagents_code/app.py:26607-26625 \u2014 all 5 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/app.py:21444\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":21444}}}],"partialFingerprints":{"codehealthFindingId/v1":"9af3c50a733ba4f7f61b3eb6e94cdf7275cf3edcfc83942a44f5db059a22ee53"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 3): libs/code/deepagents_code/model_config.py:4654-4683 | libs/code/deepagents_code/model_config.py:6320-6340 | libs/code/deepagents_code/model_config.py:6388-6406 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":4654}}}],"partialFingerprints":{"codehealthFindingId/v1":"cad5f5f21e510ccc40ea116caa497506eba4ee0bcf09e1f045a8263ba6625718"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201319 lines \u00D7 2): libs/code/deepagents_code/app.py:16953-16969 | libs/code/deepagents_code/app.py:17185-17203 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/app.py:17185\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":16953}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9384b0b0799f3f8f3976ab8217224606fe246e0f4fb79e7009e2ecea9b04d69"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): libs/code/deepagents_code/hooks/server_middleware.py:424-442 | libs/code/deepagents_code/hooks/server_middleware.py:455-473 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/hooks/server_middleware.py"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"641d7c1ecac52409d261ffd3f0bcbe148c8b52202b38653a8731e4ea6d5855c2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): libs/code/deepagents_code/main.py:2271-2289 | libs/code/deepagents_code/main.py:2336-2354 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/main.py:2271\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":2271}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0bb50d1eaa4dba28ce5209ec8576acc60f9ba49b15c583f417022e8eaf3b68a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201319 lines \u00D7 2): libs/code/deepagents_code/main.py:4156-4172 | libs/code/deepagents_code/main.py:4481-4499 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/main.py:4481\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":4156}}}],"partialFingerprints":{"codehealthFindingId/v1":"453c14c261b64199439c11bb8ab3133d4cdc3466533a5af18291225f83646c3c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): libs/code/deepagents_code/model_retry.py:1220-1238 | libs/code/deepagents_code/model_retry.py:1275-1293 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_retry.py"},"region":{"startLine":1220}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f4b1feacf5bf57a64e755ad2034503a32bfe8700b4476342fbeab5703f30fa6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): libs/code/deepagents_code/skills/commands.py:558-576 | libs/code/deepagents_code/skills/commands.py:710-728 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/skills/commands.py:558\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060libs/code/deepagents_code/skills/commands.py:577\u0060 calls \u0060get_built_in_skills_dir\u0060 and \u0060libs/code/deepagents_code/skills/commands.py:729\u0060 does not \u2014 after which the two agree again for 4 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/skills/commands.py"},"region":{"startLine":558}}}],"partialFingerprints":{"codehealthFindingId/v1":"89967761f4d2bd5b326df2946c5cd0b82cda91561bd19f6487f254b90e94a0b6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18\u201319 lines \u00D7 2): libs/code/deepagents_code/ui.py:622-640 | libs/code/deepagents_code/ui.py:699-716 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/ui.py:622\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/ui.py"},"region":{"startLine":622}}}],"partialFingerprints":{"codehealthFindingId/v1":"e36594e1bd53b0552fef3115fb3be355b9d3020c730ca201cfe68e455eab0d16"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 3): libs/code/deepagents_code/agent.py:1132-1149 | libs/code/deepagents_code/app.py:434-451 | libs/code/deepagents_code/client/non_interactive.py:1724-1741 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/agent.py"},"region":{"startLine":1132}}}],"partialFingerprints":{"codehealthFindingId/v1":"92b6f8737108210ef0f0f2c69dc1084aededaff171892ce6693768f053202781"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201318 lines \u00D7 2): libs/code/deepagents_code/client/non_interactive.py:1836-1853 | libs/code/deepagents_code/tui/widgets/approval.py:729-744 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/client/non_interactive.py"},"region":{"startLine":1836}}}],"partialFingerprints":{"codehealthFindingId/v1":"42e6c95d2ac9295108ac32e550192cde268492e26323936cf7efbc7a7dc49330"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201318 lines \u00D7 2): libs/code/deepagents_code/extras_info.py:99-116 | libs/deepagents/deepagents/_version.py:78-90 \u2014 before extracting anything, compare \u0060libs/code/deepagents_code/extras_info.py\u0060 and \u0060libs/deepagents/deepagents/_version.py\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 81 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/extras_info.py"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc17c502a7eea32624e7afd940ef78c6dcdf99048f7c455b59f84e5c1474d8bb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201318 lines \u00D7 2): libs/code/deepagents_code/main.py:6379-6396 | libs/code/deepagents_code/main.py:6516-6531 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/main.py:6379\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":6379}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3b43c685ad24ae1495c8b2754ad61c956a65d36119825dfb289c18605ac9394"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201318 lines \u00D7 2): libs/code/deepagents_code/model_config.py:1582-1599 | libs/code/deepagents_code/model_config.py:1837-1853 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/model_config.py:1582\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":1582}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8fda9fdfdb835700b65fce948173fd3f5b89cf86464d2972707df6fe3834f2d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201318 lines \u00D7 2): libs/code/deepagents_code/sessions.py:1247-1264 | libs/code/deepagents_code/sessions.py:1413-1425 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060libs/code/deepagents_code/sessions.py:1407\u0060 calls \u0060get_running_loop\u0060 and \u0060libs/code/deepagents_code/sessions.py:1243\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/sessions.py"},"region":{"startLine":1247}}}],"partialFingerprints":{"codehealthFindingId/v1":"35b5b4359d2f878a11a70f80c01670b57e5befaadd32f22dc873a3fe10a7dfe8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201318 lines \u00D7 3): libs/code/deepagents_code/skills/commands.py:1093-1110 | libs/code/deepagents_code/skills/commands.py:1115-1132 | libs/code/deepagents_code/skills/commands.py:1136-1147 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/skills/commands.py:1093\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060libs/code/deepagents_code/skills/commands.py:1115\u0060 calls \u0060add_argument\u0060 and \u0060libs/code/deepagents_code/skills/commands.py:1136\u0060 does not \u2014 after which the two agree again for 5 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/skills/commands.py"},"region":{"startLine":1093}}}],"partialFingerprints":{"codehealthFindingId/v1":"25177619f72dc72dcf4b7d358952a9fe747c29d5cfb57c69bcd2ad651bc999a7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201318 lines \u00D7 2): libs/deepagents/deepagents/backends/state.py:156-173 | libs/deepagents/deepagents/backends/store.py:349-364 \u2014 before extracting anything, compare \u0060libs/deepagents/deepagents/backends/state.py\u0060 and \u0060libs/deepagents/deepagents/backends/store.py\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 54 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/state.py"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"f88c36ad26aab944e332b2398035d0220d60bfb4ca002ae6da1812c2863f5b0d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): libs/deepagents/deepagents/middleware/summarization.py:1645-1662 | libs/deepagents/deepagents/middleware/summarization.py:1784-1801 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/summarization.py"},"region":{"startLine":1645}}}],"partialFingerprints":{"codehealthFindingId/v1":"983a831196b498017f44b3efd2a9735814d198f0fff6b386c086d574dc7fe82a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201317 lines \u00D7 4): libs/code/deepagents_code/model_config.py:6334-6350 | libs/code/deepagents_code/model_config.py:6401-6414 | libs/code/deepagents_code/model_config.py:6630-6643 | libs/code/deepagents_code/model_config.py:6676-6689 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":6334}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0f1f3fbaf707e856a9ce1f10fdf80465bef463a730bb8338fd2853ff991cc75"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201317 lines \u00D7 2): .github/scripts/evals/aggregate_unified_compare.py:599-615 | .github/scripts/evals/aggregate_unified_compare.py:622-637 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/evals/aggregate_unified_compare.py"},"region":{"startLine":599}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f985b192157f91f641e183fd71f8e3b0a2349fca3df04264dd5857cf7f172f8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201317 lines \u00D7 2): libs/code/deepagents_code/agent.py:745-759 | libs/code/deepagents_code/agent.py:784-800 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/agent.py:745\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/agent.py"},"region":{"startLine":745}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf01c5c982cbd5433ce4293f7e6f5ad3f631dcc03bd27ff627894b8b0c37ee74"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): libs/code/deepagents_code/main.py:4199-4215 | libs/code/deepagents_code/main.py:4551-4567 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/main.py:4199\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":4199}}}],"partialFingerprints":{"codehealthFindingId/v1":"c723a529c9c60dade71378bd464467528a967dc4c50cfb0b067d5fff0150ea30"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201316 lines \u00D7 5): libs/code/deepagents_code/ui.py:153-168 | libs/code/deepagents_code/ui.py:446-455 | libs/code/deepagents_code/ui.py:478-486 | libs/code/deepagents_code/ui.py:990-1001 | libs/code/deepagents_code/ui.py:1062-1071 \u2014 all 5 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/ui.py:153\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/ui.py"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ae512bb48c8b10e2acb7986a51e56909e7428ed89a5c269ac3b29b6163fd4e5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): libs/code/deepagents_code/mcp_login_service.py:322-337 | libs/code/deepagents_code/mcp_tools.py:2763-2778 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/mcp_login_service.py"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"7869bd5492f5d01ea59f89b44b98b64a512ebe2d458240854ca88eb6371d875f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201316 lines \u00D7 2): libs/code/deepagents_code/model_config.py:4612-4627 | libs/code/deepagents_code/model_config.py:4765-4779 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":4612}}}],"partialFingerprints":{"codehealthFindingId/v1":"287acae220a71c368d8c753981073ee132a6109b4f5a067762a02d5b0e8201fa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): libs/code/deepagents_code/skills/commands.py:275-290 | libs/code/deepagents_code/skills/commands.py:296-311 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/skills/commands.py"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"997c096a493a9d19aa7bfadede20419e478b500723b3d7dd756939e6aaff8d58"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): libs/deepagents/deepagents/middleware/filesystem.py:2333-2348 | libs/deepagents/deepagents/middleware/filesystem.py:2521-2536 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":2333}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e7ccd8931c1b59c12cce3dc927cf53dcf8a46c40285ead8a7c0c86259303741"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): libs/deepagents/deepagents/middleware/filesystem.py:2818-2833 | libs/deepagents/deepagents/middleware/filesystem.py:2864-2879 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":2818}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fb84dd4fe8cdb5f6468faad2b695d6a2b68d45e7affc91857f977576b4a2cf2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): libs/deepagents/deepagents/middleware/filesystem.py:3749-3764 | libs/deepagents/deepagents/middleware/filesystem.py:3790-3805 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":3749}}}],"partialFingerprints":{"codehealthFindingId/v1":"d724a51c6dbe2d7ff95a02e5e89b814f831480047ea6e9bfbe584f06d7d7c66c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): libs/talon/deepagents_talon/channels/discord.py:1161-1177 | libs/talon/deepagents_talon/channels/slack.py:1052-1067 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. Note first that the copies are not typed on the same thing: the declarations holding them bind \u0060state\u0060 to \u0060_DiscordConnectionState\u0060 in one and \u0060_SlackConnectionState\u0060 in another, and the duplicated lines use it. The extracted unit therefore needs a parameter type that fits BOTH \u2014 their common supertype where they have one, or a new abstraction over them where they do not \u2014 and settling that is the step that comes BEFORE the extraction above. Where the two types are deliberately unrelated, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060libs/talon/deepagents_talon/channels/discord.py:1158\u0060 calls \u0060log_debug_event\u0060 and \u0060libs/talon/deepagents_talon/channels/slack.py:1049\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/channels/discord.py"},"region":{"startLine":1161}}}],"partialFingerprints":{"codehealthFindingId/v1":"038c958c0cd2ad3cac3621cd846b5cc3d937c51e0736571ff45e56f243b5d55a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201315 lines \u00D7 6): libs/code/deepagents_code/model_config.py:4136-4145 | libs/code/deepagents_code/model_config.py:4387-4395 | libs/code/deepagents_code/model_config.py:4561-4570 | libs/code/deepagents_code/model_config.py:6053-6067 | libs/code/deepagents_code/model_config.py:6686-6695 | libs/code/deepagents_code/model_config.py:6923-6931 \u2014 all 6 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/model_config.py:4561\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":4136}}}],"partialFingerprints":{"codehealthFindingId/v1":"da160580aa539e427ff8a6657802ec87988d162247810dc91f76386da27f9e14"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201315 lines \u00D7 6): libs/deepagents/deepagents/middleware/filesystem.py:2047-2060 | libs/deepagents/deepagents/middleware/filesystem.py:2086-2099 | libs/deepagents/deepagents/middleware/filesystem.py:2317-2331 | libs/deepagents/deepagents/middleware/filesystem.py:2356-2370 | libs/deepagents/deepagents/middleware/filesystem.py:2411-2425 | libs/deepagents/deepagents/middleware/filesystem.py:2453-2467 \u2014 all 6 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":2047}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3e9638a005bc5d05c8460c4f5f553f2fadeef1a319ea701fc0d5e3495d3298a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201315 lines \u00D7 5): libs/code/deepagents_code/model_config.py:4672-4686 | libs/code/deepagents_code/model_config.py:6329-6343 | libs/code/deepagents_code/model_config.py:6397-6408 | libs/code/deepagents_code/model_config.py:6626-6637 | libs/code/deepagents_code/model_config.py:6672-6683 \u2014 all 5 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":4672}}}],"partialFingerprints":{"codehealthFindingId/v1":"333d17e872b94a521b53d64722505c188ea68d4096b672f91fdfd5c1c89e2a9c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201315 lines \u00D7 4): libs/code/deepagents_code/ui.py:378-388 | libs/code/deepagents_code/ui.py:654-664 | libs/code/deepagents_code/ui.py:841-851 | libs/code/deepagents_code/ui.py:1007-1021 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/ui.py"},"region":{"startLine":378}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e46ad25ef12bcb612b779302f7c8c0d7dba2cc4c386d514ca0b612c329fa230"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 3): libs/code/deepagents_code/_git.py:452-466 | libs/code/deepagents_code/_git.py:583-597 | libs/code/deepagents_code/_git.py:654-668 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/_git.py:452\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/_git.py"},"region":{"startLine":452}}}],"partialFingerprints":{"codehealthFindingId/v1":"35c4fec7a262bc000753e9f71cf8d096908d26e327b557a8f43f0097f40699a6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 3): libs/code/deepagents_code/app.py:32448-32462 | libs/code/deepagents_code/client/launch/server_manager.py:418-432 | libs/code/deepagents_code/client/launch/server_manager.py:605-619 \u2014 there are 3 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 3 sites; resolving a subset leaves the remainder to drift apart. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/app.py:32448\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":32448}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac9188d8630d163bee736499a47f8b8ac1b6239dc5c904d73a5aa8a3788104fa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201315 lines \u00D7 2): libs/code/deepagents_code/_repository_bounds.py:321-333 | libs/code/deepagents_code/_repository_bounds.py:382-396 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/_repository_bounds.py:382\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/_repository_bounds.py"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d55b991d82d1f9dfb7f776b78f64a1a216d29c596fb7e68375659d2272dc5b6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): libs/code/deepagents_code/media_utils.py:254-268 | libs/code/deepagents_code/media_utils.py:333-347 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/media_utils.py"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"a491eb1d37539aa198f533ea3df4529fe1cf6a9d509df3f8c0a116a8cf3aef1d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201315 lines \u00D7 2): libs/code/deepagents_code/plugins/adapters/skills_middleware.py:629-643 | libs/code/deepagents_code/plugins/adapters/skills_middleware.py:673-684 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/plugins/adapters/skills_middleware.py"},"region":{"startLine":629}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcee3ce1fc581670c382febe9513180d881b3e61ab70bf351c3db8699d9a2c9b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): libs/code/deepagents_code/tui/modals/plugin_manager/state.py:151-165 | libs/code/deepagents_code/tui/modals/plugin_manager/state.py:193-207 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/modals/plugin_manager/state.py"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"8822161dbdd082935678ebae39fb9de43db47fa91b43edd0458637b681ae1481"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): libs/deepagents/deepagents/middleware/filesystem.py:2062-2076 | libs/deepagents/deepagents/middleware/filesystem.py:2101-2115 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":2062}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fb8d8d3c58b3279d71de0954705dda4222a058681ad4decdafc3246f78784a2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201315 lines \u00D7 2): libs/deepagents/deepagents/middleware/filesystem.py:2496-2510 | libs/deepagents/deepagents/middleware/filesystem.py:2536-2549 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":2496}}}],"partialFingerprints":{"codehealthFindingId/v1":"f19abe82256858d21e1a6a5b5fc191af10186cdff1e0a4c40db9a26179853374"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201315 lines \u00D7 2): libs/deepagents/deepagents/middleware/summarization.py:1610-1623 | libs/deepagents/deepagents/middleware/summarization.py:1751-1765 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/summarization.py"},"region":{"startLine":1610}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a9c483944fb0ae0a3920743dc1106bb781911d6a89761e767bdb0c4e244c0b2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): libs/deepagents/deepagents/middleware/summarization.py:1629-1643 | libs/deepagents/deepagents/middleware/summarization.py:1768-1782 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/summarization.py"},"region":{"startLine":1629}}}],"partialFingerprints":{"codehealthFindingId/v1":"e06b827505d9d14f610c3bfc518b5fa6317c37a6fb9221a9f38aa3e6264c0e86"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): libs/talon/deepagents_talon/channels/discord.py:785-799 | libs/talon/deepagents_talon/channels/slack.py:691-705 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/talon/deepagents_talon/channels/discord.py:785\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/channels/discord.py"},"region":{"startLine":785}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd003c1635b1dfd015afc329d983f82c68e2d1225ba790141cd6260309ac8f39"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201315 lines \u00D7 2): libs/talon/deepagents_talon/channels/discord.py:1642-1655 | libs/talon/deepagents_talon/channels/telegram.py:1382-1396 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/channels/discord.py"},"region":{"startLine":1642}}}],"partialFingerprints":{"codehealthFindingId/v1":"663c6a500cdeca8a8a71ada6401b979dae41eec5c02ebf34e6a1365194c40b7c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): libs/code/deepagents_code/_git.py:98-111 | libs/code/deepagents_code/_git.py:147-160 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/_git.py"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f520283ea1aa0f1c4746b3533dee387cbd1391d0390bffec40f09b59a956f67"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): libs/code/deepagents_code/goal_rubric.py:967-980 | libs/code/deepagents_code/goal_rubric.py:1000-1014 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/goal_rubric.py:967\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/goal_rubric.py"},"region":{"startLine":967}}}],"partialFingerprints":{"codehealthFindingId/v1":"633880222365c3ca03eed4f69b885ff2228ebba7b5821c08ea0ba178c93f3805"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 2): libs/code/deepagents_code/tui/widgets/messages.py:3447-3459 | libs/code/deepagents_code/tui/widgets/messages.py:3637-3650 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/tui/widgets/messages.py:3637\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/messages.py"},"region":{"startLine":3447}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab9d2f04d39d3da38ecaaa4989ec26a4f866c8ad88fb08355d763665ed752fe0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): libs/code/deepagents_code/tui/widgets/notification_detail.py:218-231 | libs/code/deepagents_code/tui/widgets/update_available.py:255-268 \u2014 before extracting anything, compare \u0060libs/code/deepagents_code/tui/widgets/notification_detail.py\u0060 and \u0060libs/code/deepagents_code/tui/widgets/update_available.py\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 50 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/notification_detail.py"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd06386e0155e7638dd4fb8a8fef8080f69af131eced3a28a6621e04ba07fbbe"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): libs/deepagents/deepagents/backends/composite.py:534-547 | libs/deepagents/deepagents/backends/composite.py:596-609 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/composite.py"},"region":{"startLine":534}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1b7100879b799d9f1c1c9b61c856f93c167b686bb3166689abc2d2c09992044"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): libs/deepagents/deepagents/middleware/summarization.py:1306-1319 | libs/deepagents/deepagents/middleware/summarization.py:1383-1396 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/summarization.py"},"region":{"startLine":1306}}}],"partialFingerprints":{"codehealthFindingId/v1":"81aab3875a60abcfdd40dfca535a5896e9c95764b86263615611f7c9204d8998"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 4): libs/deepagents/deepagents/middleware/filesystem.py:2311-2323 | libs/deepagents/deepagents/middleware/filesystem.py:2350-2362 | libs/deepagents/deepagents/middleware/filesystem.py:2498-2510 | libs/deepagents/deepagents/middleware/filesystem.py:2537-2549 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":2311}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4fba893317627531fdfef6bac682ba60cd79ef690f429a8b760f683232f86f7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201313 lines \u00D7 2): libs/acp/deepagents_acp/server.py:686-697 | libs/acp/deepagents_acp/server.py:724-736 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/acp/deepagents_acp/server.py:724\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/acp/deepagents_acp/server.py"},"region":{"startLine":686}}}],"partialFingerprints":{"codehealthFindingId/v1":"21fdbbd61141c9aab5a631a0ae4276fb00bfcc9ce81d1ef367ff31dd509bdd13"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201313 lines \u00D7 2): libs/code/deepagents_code/plugins/commands_cli.py:60-69 | libs/code/deepagents_code/plugins/commands_cli.py:78-90 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/plugins/commands_cli.py:78\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/plugins/commands_cli.py"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfbb0087c7eba7b07a631dfc5bc835762e36e4e7445969ffb395b86a425de872"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): libs/code/deepagents_code/skills/commands.py:578-590 | libs/code/deepagents_code/skills/commands.py:729-741 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/skills/commands.py:578\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/skills/commands.py"},"region":{"startLine":578}}}],"partialFingerprints":{"codehealthFindingId/v1":"4483bcc185786cb8ea926c8d4cf2a6ac8c4ce84b7bb45867799ef6a05044c285"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201313 lines \u00D7 2): libs/code/deepagents_code/tui/modals/cost_breakdown.py:114-124 | libs/code/deepagents_code/tui/widgets/mcp_viewer.py:605-617 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/tui/modals/cost_breakdown.py:114\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/modals/cost_breakdown.py"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"cafc86c47b07344256d7cfdab3aeb4eb8d8fbad3841b62c7561b664a1486e023"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201313 lines \u00D7 2): libs/code/deepagents_code/tui/modals/plugin_manager/content.py:206-218 | libs/code/deepagents_code/tui/modals/plugin_manager/content.py:242-250 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/modals/plugin_manager/content.py"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"d55f52d63bbe0ab404abe33b620730223ab932521e52a7807c96141747f58168"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): libs/code/deepagents_code/tui/widgets/messages.py:4414-4427 | libs/code/deepagents_code/tui/widgets/messages.py:4434-4446 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/messages.py"},"region":{"startLine":4414}}}],"partialFingerprints":{"codehealthFindingId/v1":"948995eeefcec7de0179a0dd287f1dd6d8fc1515e7619f358049bec20c64d587"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): libs/code/deepagents_code/ui.py:121-133 | libs/code/deepagents_code/ui.py:987-999 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/ui.py:121\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/ui.py"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbd956a37375761d35f73a124fd58ac1e41e4690f5d0620e2cf720db048518b2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): libs/code/deepagents_code/ui.py:498-510 | libs/code/deepagents_code/ui.py:534-546 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/ui.py"},"region":{"startLine":498}}}],"partialFingerprints":{"codehealthFindingId/v1":"f68a37ac7cfd12f0516ecb5cc9c4283960cfe8a9396ac550948f3c4a7b087141"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): libs/deepagents/deepagents/middleware/filesystem.py:2333-2345 | libs/deepagents/deepagents/middleware/filesystem.py:2372-2384 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":2333}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1f8dfe71666206c2b70b265823636308947873d0f27431a3814d190171a5a05"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): libs/deepagents/deepagents/middleware/filesystem.py:2427-2439 | libs/deepagents/deepagents/middleware/filesystem.py:2469-2481 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":2427}}}],"partialFingerprints":{"codehealthFindingId/v1":"eba0016a59dcc3bb58fadbb58193ee05ea0dbac075cdffb4e1b85603f5114205"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): libs/deepagents/deepagents/middleware/filesystem.py:2521-2533 | libs/deepagents/deepagents/middleware/filesystem.py:2562-2574 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":2521}}}],"partialFingerprints":{"codehealthFindingId/v1":"7db58c1c22eb38cb92e2cbb1c79361a5ed53e073a41ac024cd7dd59329b7632d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): libs/deepagents/deepagents/middleware/skills.py:1200-1212 | libs/deepagents/deepagents/middleware/skills.py:1246-1258 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/skills.py"},"region":{"startLine":1200}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4294a39c98bb5eb9b7b0b5c93762792e9a36beec8bddd097a2cc9d2f1950187"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3): libs/acp/deepagents_acp/utils.py:225-236 | libs/acp/deepagents_acp/utils.py:238-249 | libs/acp/deepagents_acp/utils.py:259-270 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/acp/deepagents_acp/utils.py"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d54d42e541fb2ca0403157d3767e50168416cee0b14fa54d346cf814288d62d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): .github/scripts/evals/aggregate_shards.py:773-784 | .github/scripts/evals/aggregate_shards.py:828-839 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060.github/scripts/evals/aggregate_shards.py:773\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/evals/aggregate_shards.py"},"region":{"startLine":773}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e54e5d47b7327c256e229116490421c0ee7897eaf5587b2b21ecd0724ae5d6d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 2): libs/code/deepagents_code/app.py:14047-14058 | libs/code/deepagents_code/app.py:14315-14325 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060libs/code/deepagents_code/app.py:14059\u0060 calls \u0060styled\u0060, \u0060TStyle\u0060 and \u0060libs/code/deepagents_code/app.py:14326\u0060 does not \u2014 after which the two agree again for 4 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":14047}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec71e516898401513e924fce978d9191d926e42007844e46142b2f1a88be7e1c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): libs/code/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py:327-338 | libs/code/examples/skills/skill-creator/scripts/init_skill.py:279-290 \u2014 before extracting anything, compare \u0060libs/code/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py\u0060 and \u0060libs/code/examples/skills/skill-creator/scripts/init_skill.py\u0060 as WHOLE FILES: 96% of the shorter file\u0027s lines also appear in the other, so this reads as one file having been copied from the other rather than as a helper waiting to be extracted. The 2 duplicated block(s) this scan matched between them are fragments of that copy, not the extent of it \u2014 treat the file pair as the unit. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py"},"region":{"startLine":327}}}],"partialFingerprints":{"codehealthFindingId/v1":"baccd0c8868d6c1d9c49fdd913b791315fce07cd5a298547539c9edfa33a073b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201312 lines \u00D7 2): libs/code/deepagents_code/client/commands/config.py:850-861 | libs/code/deepagents_code/client/commands/config.py:889-898 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/client/commands/config.py"},"region":{"startLine":850}}}],"partialFingerprints":{"codehealthFindingId/v1":"1db98a235c176b7d5f98aa6204ee71f8de17f6d172ea5d73a31c03eef3993792"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201312 lines \u00D7 2): libs/code/deepagents_code/config.py:6858-6869 | libs/code/deepagents_code/model_config.py:3715-3724 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/config.py"},"region":{"startLine":6858}}}],"partialFingerprints":{"codehealthFindingId/v1":"15a606ceeaeb2fe83e13545bf7f2ca43df5245d745036a558599397ece4ce6e6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): libs/code/deepagents_code/main.py:1798-1809 | libs/code/deepagents_code/main.py:1811-1823 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":1798}}}],"partialFingerprints":{"codehealthFindingId/v1":"53b5b974aadefefeb56404e6f7c5eb449311f6a73382ba6c58dd070d151ee7f9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): libs/code/deepagents_code/main.py:2246-2257 | libs/code/deepagents_code/skills/commands.py:1022-1033 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":2246}}}],"partialFingerprints":{"codehealthFindingId/v1":"93dad9d7cda08a27138948e4b88505db3aecbe2ae93eb01f74ecbbe1fb2889e2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): libs/code/deepagents_code/main.py:6551-6562 | libs/code/deepagents_code/main.py:6565-6576 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/main.py:6551\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":6551}}}],"partialFingerprints":{"codehealthFindingId/v1":"df7f9a4a4a29d8bf14a4d994d938ec34125cc45ce8caa3338a7076dcb02b920b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): libs/code/deepagents_code/tui/widgets/messages.py:3434-3445 | libs/code/deepagents_code/tui/widgets/messages.py:3621-3632 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/tui/widgets/messages.py:3621\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060libs/code/deepagents_code/tui/widgets/messages.py:3433\u0060 calls \u0060_compact_line_gutter\u0060 and \u0060libs/code/deepagents_code/tui/widgets/messages.py:3619\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/messages.py"},"region":{"startLine":3434}}}],"partialFingerprints":{"codehealthFindingId/v1":"f99420560466ac889b4c32130603250e82eb94827ba73491fc419a15922b7e8c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201312 lines \u00D7 2): libs/code/deepagents_code/tui/widgets/messages.py:3440-3449 | libs/code/deepagents_code/tui/widgets/messages.py:3589-3600 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/tui/widgets/messages.py:3440\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060libs/code/deepagents_code/tui/widgets/messages.py:3601\u0060 calls \u0060join\u0060 and \u0060libs/code/deepagents_code/tui/widgets/messages.py:3450\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/messages.py"},"region":{"startLine":3440}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bd16fad7d5e5a35ede12441c81122ef6c6cc4ae8baa8f43379fcb16275aef97"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): libs/code/deepagents_code/tui/widgets/thread_selector.py:1764-1775 | libs/code/deepagents_code/tui/widgets/thread_selector.py:1937-1948 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/tui/widgets/thread_selector.py:1764\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/thread_selector.py"},"region":{"startLine":1764}}}],"partialFingerprints":{"codehealthFindingId/v1":"4981ac4bc16c8b751c485f8c2b27f1df31b4676398d9c8ab53c3c214a3a623e0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): libs/deepagents/deepagents/backends/composite.py:509-520 | libs/deepagents/deepagents/backends/composite.py:571-582 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/composite.py"},"region":{"startLine":509}}}],"partialFingerprints":{"codehealthFindingId/v1":"49ac54fc68d1885a2b52a86bb69ef38a758125aa98f78aa89ebc844c7fcf037c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): libs/deepagents/deepagents/backends/composite.py:635-646 | libs/deepagents/deepagents/backends/composite.py:678-689 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/composite.py"},"region":{"startLine":635}}}],"partialFingerprints":{"codehealthFindingId/v1":"eafcddd2bdc55db33e6d032fe833d7a58f7b6641812615ede83339dd5460fd24"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): libs/deepagents/deepagents/backends/sandbox.py:1929-1940 | libs/deepagents/deepagents/backends/sandbox.py:1984-1995 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/deepagents/deepagents/backends/sandbox.py:1929\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/sandbox.py"},"region":{"startLine":1929}}}],"partialFingerprints":{"codehealthFindingId/v1":"437c46177c348aafa33a6a2b3c727db5e09ed4baf762b594bb65a34bf228e50a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): libs/deepagents/deepagents/backends/store.py:388-399 | libs/deepagents/deepagents/backends/store.py:415-426 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/store.py"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"1edafffcbaf7016c4be15abe93a7600516df858f8c32355dde39f23a21fa9379"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): libs/deepagents/deepagents/middleware/filesystem.py:3767-3778 | libs/deepagents/deepagents/middleware/filesystem.py:3808-3819 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":3767}}}],"partialFingerprints":{"codehealthFindingId/v1":"8025d07228b2e02cf30b1bb1b46aa3844b73ecf2fea29a0c10e7288c7ae06f3a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): libs/evals/harbor_adapters/contextbench/main.py:106-117 | libs/evals/harbor_adapters/drbench/main.py:185-196 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/evals/harbor_adapters/contextbench/main.py"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b82879d63121a0b9b8502884454239c72d87f0bf3425fc7a6fcdb129377dc99"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6\u201311 lines \u00D7 3): libs/deepagents/deepagents/backends/sandbox.py:1307-1312 | libs/deepagents/deepagents/backends/sandbox.py:1957-1967 | libs/deepagents/deepagents/backends/sandbox.py:2010-2017 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/deepagents/deepagents/backends/sandbox.py:1957\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/sandbox.py"},"region":{"startLine":1307}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bf014efbd47623aa59d74d0ee35b8f87ded50577a35bc91345471034b206e73"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): libs/deepagents/deepagents/backends/state.py:240-250 | libs/deepagents/deepagents/backends/store.py:498-508 | libs/deepagents/deepagents/backends/store.py:539-549 \u2014 before extracting anything, compare \u0060libs/deepagents/deepagents/backends/state.py\u0060 and \u0060libs/deepagents/deepagents/backends/store.py\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 54 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/state.py"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d71c68112c96c3ad4fee9528144744f13b0339b32eb07e6e2a993d50eab4ae5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): libs/evals/deepagents_evals/cli.py:270-280 | libs/evals/deepagents_evals/cli.py:400-410 | libs/evals/scripts/run_trials.py:281-291 \u2014 there are 3 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 3 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/evals/deepagents_evals/cli.py"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"d58cf81d2266a7298843388ffdf8bb20739bb329d933c308f757acae4456b93d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): libs/code/deepagents_code/_repository_bounds.py:298-308 | libs/code/deepagents_code/_repository_bounds.py:364-376 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/_repository_bounds.py:364\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/_repository_bounds.py"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"71feb528e07e02ed544e5c92177c9fc57fbcb91c6243a9a991133fb7e9f181dc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): libs/code/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py:211-221 | libs/deepagents/deepagents/middleware/skills.py:427-437 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"a27126ae7f1f9d696508c4d4f6e847b9054bbf54901ad9802785a3fc64417898"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): libs/code/deepagents_code/client/commands/extras.py:252-262 | libs/code/deepagents_code/client/commands/extras.py:364-374 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/client/commands/extras.py"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fbff965bf669fef46a07d81a13e0c0e6b6ec83b05162ec2d5c0e9271ab453cc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): libs/code/deepagents_code/main.py:1405-1415 | libs/code/deepagents_code/main.py:4166-4176 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060libs/code/deepagents_code/main.py:4165\u0060 calls \u0060add\u0060 and \u0060libs/code/deepagents_code/main.py:1403\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":1405}}}],"partialFingerprints":{"codehealthFindingId/v1":"e66e6beff049ae7114995cec21e8d1e8d2dec93e29a93e40b15194ca4196c692"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201311 lines \u00D7 2): libs/code/deepagents_code/tool_display.py:239-249 | libs/code/deepagents_code/tool_display.py:287-296 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/tool_display.py:239\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tool_display.py"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"b08c51d6e1be166ded722b307101c5808308062d832f0441424f3581297ea52b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): libs/deepagents/deepagents/backends/composite.py:522-532 | libs/deepagents/deepagents/backends/composite.py:584-594 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/composite.py"},"region":{"startLine":522}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f6214e26f7933a52cedaaceaa2384d35d87d0e666da08e1f900aab56fc71625"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): libs/deepagents/deepagents/backends/context_hub.py:316-326 | libs/deepagents/deepagents/backends/context_hub.py:401-411 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/context_hub.py"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"34561614bb0df535bdd63c527e39b5db4e47db2e8ecbcef96310f7508935129c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): libs/deepagents/deepagents/middleware/memory.py:301-311 | libs/deepagents/deepagents/middleware/memory.py:335-345 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/memory.py"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2f0cd2c8fa1a5f7591eda82b905591b1d8b4e4175ab4cad2aeaf50d195590bc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): libs/partners/quickjs/langchain_quickjs/_repl.py:572-582 | libs/partners/quickjs/langchain_quickjs/_repl.py:654-664 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/partners/quickjs/langchain_quickjs/_repl.py"},"region":{"startLine":572}}}],"partialFingerprints":{"codehealthFindingId/v1":"002b1c3308ffdb39b84ffb74c65d4a874d3555e2b48e1e2ea24c290dc47acaf6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 10): libs/code/deepagents_code/model_config.py:4135-4144 | libs/code/deepagents_code/model_config.py:4386-4394 | libs/code/deepagents_code/model_config.py:4560-4568 | libs/code/deepagents_code/model_config.py:4713-4721 | libs/code/deepagents_code/model_config.py:4787-4795 | libs/code/deepagents_code/model_config.py:6052-6060 | libs/code/deepagents_code/model_config.py:6346-6354 | libs/code/deepagents_code/model_config.py:6410-6418 | libs/code/deepagents_code/model_config.py:6685-6694 | libs/code/deepagents_code/model_config.py:6922-6930 \u2014 all 10 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":4135}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c8d4089000168792a526889fa72d47216e26dc667dee0616aa1812e2d46fdbc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): libs/code/deepagents_code/ui.py:121-134 | libs/code/deepagents_code/ui.py:944-953 | libs/code/deepagents_code/ui.py:988-999 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/ui.py:121\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/ui.py"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4109c9848d2b218b1e6a10ef7cab4481bb292a5fc6498b400213b7afa76604c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): .github/scripts/checks/raise_langchain_minimums.py:169-178 | .github/scripts/release/check_dep_freshness.py:312-321 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/checks/raise_langchain_minimums.py"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"c80b389e30d25625e579864f361819e0b4111945309945d3b6123844a21c1433"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u201310 lines \u00D7 2): libs/code/deepagents_code/agent.py:531-538 | libs/code/deepagents_code/goal_rubric.py:1670-1679 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/agent.py"},"region":{"startLine":531}}}],"partialFingerprints":{"codehealthFindingId/v1":"2952bcc123d03d47ad4e6601186b7c31864ea20ba2e968ea9dabf4a7e304bfaa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): libs/code/deepagents_code/app.py:15922-15931 | libs/code/deepagents_code/app.py:17013-17022 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060libs/code/deepagents_code/app.py:15920\u0060 calls \u0060_cancel_goal_proposal_worker\u0060, \u0060_cancel_pending_goal_review\u0060 and \u0060libs/code/deepagents_code/app.py:17012\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":15922}}}],"partialFingerprints":{"codehealthFindingId/v1":"c75c29b83e59c56794fbfc44b1af6adb34d663f2382b4c71a8fb0b5650a79198"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): libs/code/deepagents_code/main.py:1360-1369 | libs/code/deepagents_code/main.py:4078-4087 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note first that the copies are not typed on the same thing: \u0060Style\u0060 names \u0060prompt_toolkit.styles\u0060 in one and \u0060rich.style\u0060 in another \u2014 different types that share a simple name, which is why the text matched. A single extracted unit cannot be given a parameter type that fits both, so unifying those types (or introducing a shared abstraction over them) is the step that has to come BEFORE the extraction above; if they are deliberately separate, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":1360}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a87ead705dbb8b6ddfc25d24f9717515fc3790b1a61b1340cf0d6374b587ab4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 2): libs/code/deepagents_code/model_retry.py:1209-1218 | libs/code/deepagents_code/model_retry.py:1265-1273 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_retry.py"},"region":{"startLine":1209}}}],"partialFingerprints":{"codehealthFindingId/v1":"904041affa99255fc69845ddd67bba7adbc61bd82ca731d6f7e69aeaa9df749f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u201310 lines \u00D7 2): libs/code/deepagents_code/tui/widgets/messages.py:3880-3886 | libs/code/deepagents_code/tui/widgets/messages.py:3897-3906 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on. Note first that the copies are not typed on the same thing: the declarations holding them bind \u0060is_preview\u0060 to \u0060bool\u0060 in one and \u0060bool = False\u0060 in another, and the duplicated lines use it. The extracted unit therefore needs a parameter type that fits BOTH \u2014 their common supertype where they have one, or a new abstraction over them where they do not \u2014 and settling that is the step that comes BEFORE the extraction above. Where the two types are deliberately unrelated, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060libs/code/deepagents_code/tui/widgets/messages.py:3896\u0060 calls \u0060split\u0060 and \u0060libs/code/deepagents_code/tui/widgets/messages.py:3878\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/messages.py"},"region":{"startLine":3880}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8cc7df1f5fc095ff26a72bc0bbe66b0e1805f037de1c49694176616d6d4d1d0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): libs/code/deepagents_code/tui/widgets/notification_detail.py:192-201 | libs/code/deepagents_code/tui/widgets/update_available.py:229-238 \u2014 before extracting anything, compare \u0060libs/code/deepagents_code/tui/widgets/notification_detail.py\u0060 and \u0060libs/code/deepagents_code/tui/widgets/update_available.py\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 50 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Note first that the copies are not typed on the same thing: the declarations holding them bind \u0060idx\u0060 to \u0060markup=False) for\u0060 in one and \u0060markup=False) changelog = _ChangelogOption() self._options.append(changelog) yield changelog for\u0060 in another, and the duplicated lines use it. The extracted unit therefore needs a parameter type that fits BOTH \u2014 their common supertype where they have one, or a new abstraction over them where they do not \u2014 and settling that is the step that comes BEFORE the extraction above. Where the two types are deliberately unrelated, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060libs/code/deepagents_code/tui/widgets/update_available.py:226\u0060 calls \u0060_ChangelogOption\u0060 and \u0060libs/code/deepagents_code/tui/widgets/notification_detail.py:191\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/notification_detail.py"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"46c0b15922237521562de6b28ce04646b710667eaac7170817b2facdcf8cd2c8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): libs/deepagents/deepagents/backends/store.py:609-618 | libs/deepagents/deepagents/backends/store.py:622-636 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/store.py"},"region":{"startLine":609}}}],"partialFingerprints":{"codehealthFindingId/v1":"a648a8f29a155b8cb622d13cfafb6568ac590652a9768316fbe00b0c0718c1c6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): libs/deepagents/deepagents/middleware/_overflow_clip.py:164-173 | libs/deepagents/deepagents/middleware/_overflow_clip.py:197-206 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/_overflow_clip.py"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c35e226e30d274d7248ebd5e52809120995e410603cb5d27c5392127e2eab1b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): libs/deepagents/deepagents/middleware/summarization.py:1477-1486 | libs/deepagents/deepagents/middleware/summarization.py:1508-1517 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/summarization.py"},"region":{"startLine":1477}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bd179ac4da7eaa50c80001c284f501467adc6279637445fad319da958cfb0d4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 4): libs/code/deepagents_code/ui.py:426-438 | libs/code/deepagents_code/ui.py:474-482 | libs/code/deepagents_code/ui.py:572-580 | libs/code/deepagents_code/ui.py:959-972 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/ui.py"},"region":{"startLine":426}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfb59a6078ec7603986d10109b22a194112f964f7bc513c9db760816838677bd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): libs/code/deepagents_code/extras_info.py:126-134 | libs/deepagents/deepagents/_version.py:100-108 \u2014 before extracting anything, compare \u0060libs/code/deepagents_code/extras_info.py\u0060 and \u0060libs/deepagents/deepagents/_version.py\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 81 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/extras_info.py"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4be735d9369da341e57472c3ec194a1730066ffefb683e93191bd92b2085b20"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): libs/code/deepagents_code/tui/widgets/_links.py:156-164 | libs/code/deepagents_code/tui/widgets/_links.py:234-243 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/_links.py"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e6a51186e0a2239eb28d021c9fe912d3cb6b19e8a342ee3291130e17e3ec6b2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): libs/code/deepagents_code/tui/widgets/mcp_viewer.py:467-475 | libs/code/deepagents_code/tui/widgets/mcp_viewer.py:482-490 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/tui/widgets/mcp_viewer.py:467\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060libs/code/deepagents_code/tui/widgets/mcp_viewer.py:491\u0060 calls \u0060sanitize_control_chars\u0060 and \u0060libs/code/deepagents_code/tui/widgets/mcp_viewer.py:476\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/mcp_viewer.py"},"region":{"startLine":467}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bc53cab69563a9a6bc25bca190f434257cba725c6735539d6beaf0cdba0097a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): libs/code/deepagents_code/tui/widgets/thread_selector.py:1747-1755 | libs/code/deepagents_code/tui/widgets/thread_selector.py:1923-1931 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/thread_selector.py"},"region":{"startLine":1747}}}],"partialFingerprints":{"codehealthFindingId/v1":"a832630fa0b16a2d6d83f06c8180189ce359649fbb5521a5151ceab15cd3e9c0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): libs/code/deepagents_code/unicode_security.py:533-541 | libs/code/deepagents_code/unicode_security.py:557-565 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. Note first that the copies are not typed on the same thing: the declarations holding them bind \u0060prefix\u0060 to \u0060str = \u0022\u0022\u0060 in one and \u0060str\u0060 in another, and the duplicated lines use it. The extracted unit therefore needs a parameter type that fits BOTH \u2014 their common supertype where they have one, or a new abstraction over them where they do not \u2014 and settling that is the step that comes BEFORE the extraction above. Where the two types are deliberately unrelated, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/unicode_security.py"},"region":{"startLine":533}}}],"partialFingerprints":{"codehealthFindingId/v1":"f73c1b36727c70d54ecb6bf4079e43319a2b6b93905d1348a15cdb8685d990b7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u20139 lines \u00D7 2): libs/deepagents/deepagents/backends/sandbox.py:1803-1811 | libs/deepagents/deepagents/backends/sandbox.py:1819-1825 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/sandbox.py"},"region":{"startLine":1803}}}],"partialFingerprints":{"codehealthFindingId/v1":"51e0dfe32da36a2051a6898f7b031ede8163e4ca0aa6bd13a4bd95cbc47eaed9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u20139 lines \u00D7 2): libs/talon/deepagents_talon/host.py:2355-2363 | libs/talon/deepagents_talon/host.py:2402-2409 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/talon/deepagents_talon/host.py:2355\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/host.py"},"region":{"startLine":2355}}}],"partialFingerprints":{"codehealthFindingId/v1":"324a26819a444009b4b13d6318383cd99065c0414cff7627982a06242315ef87"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): .github/scripts/release/check_dep_freshness.py:391-398 | .github/scripts/release/check_wheel_dep_freshness.py:932-939 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/release/check_dep_freshness.py"},"region":{"startLine":391}}}],"partialFingerprints":{"codehealthFindingId/v1":"06303902ba8c3774bf88e515e557810519755f4c28a237a9fd1ce17aa6d8e24c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u20138 lines \u00D7 2): libs/code/deepagents_code/model_api.py:137-144 | libs/code/deepagents_code/model_api.py:217-223 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/model_api.py:137\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_api.py"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"c003d10ddbef2c3704ef2aeaa8c63d426e16ed03a80b8a55c0e58c39f13e919b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): libs/code/deepagents_code/plugins/adapters/skills_middleware.py:386-393 | libs/code/deepagents_code/plugins/adapters/skills_middleware.py:413-420 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/plugins/adapters/skills_middleware.py"},"region":{"startLine":386}}}],"partialFingerprints":{"codehealthFindingId/v1":"294db35a87993770e2fff90025765a0cf78aa10629a43b60f33091d271e61968"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): libs/deepagents/deepagents/backends/composite.py:648-655 | libs/deepagents/deepagents/backends/composite.py:691-698 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/composite.py"},"region":{"startLine":648}}}],"partialFingerprints":{"codehealthFindingId/v1":"f36c1ce3098194aae97b5ffebc0b644eed5c0fd99a6d41038b5e927af1f39ea1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): libs/deepagents/deepagents/backends/composite.py:983-990 | libs/deepagents/deepagents/backends/composite.py:1012-1019 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/composite.py"},"region":{"startLine":983}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9e4326c46f674ee485d52817d8ad4af213e87cda99f3a319af94aff494476a0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): libs/code/deepagents_code/main.py:4177-4183 | libs/code/deepagents_code/main.py:4519-4525 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":4177}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cf0befc538ec6098a69e70096ec02149eb71ac70da6364d616f57fb255eb70a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): libs/deepagents/deepagents/middleware/async_subagents.py:1254-1260 | libs/deepagents/deepagents/middleware/async_subagents.py:1265-1271 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/deepagents/deepagents/middleware/async_subagents.py:1254\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/async_subagents.py"},"region":{"startLine":1254}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcef1eb64709a570a66e4536072bb41f5ad4c736b90194625246067e1fbbbfcb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): libs/deepagents/deepagents/middleware/filesystem.py:2513-2519 | libs/deepagents/deepagents/middleware/filesystem.py:2552-2560 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":2513}}}],"partialFingerprints":{"codehealthFindingId/v1":"48e4034987ef69e0f34c44ecf20b008dbbd4353f152738ef4ca9ebb932c9cdb3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): libs/code/deepagents_code/client/non_interactive.py:1118-1123 | libs/code/deepagents_code/client/non_interactive.py:1134-1139 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/code/deepagents_code/client/non_interactive.py:1118\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/client/non_interactive.py"},"region":{"startLine":1118}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9182a5a288fa8459bb1aa306791f012fa62a9251ae79eafd2b4f50d33c72f09"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): libs/code/deepagents_code/client/non_interactive.py:1124-1129 | libs/code/deepagents_code/client/non_interactive.py:1140-1145 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/client/non_interactive.py"},"region":{"startLine":1124}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb7629b4bb1c6cf0f498466d0b8e3b3d107f766b3ed93ea2102a4ff8c7760522"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): libs/code/deepagents_code/plugins/adapters/skills_middleware.py:320-325 | libs/code/deepagents_code/plugins/adapters/skills_middleware.py:355-360 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/plugins/adapters/skills_middleware.py"},"region":{"startLine":320}}}],"partialFingerprints":{"codehealthFindingId/v1":"7eedda3099e000baa4f1b78d8023b813cf5cd5daa0f6841fc755c05f407ab17e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): libs/deepagents/deepagents/backends/filesystem.py:524-530 | libs/deepagents/deepagents/backends/filesystem.py:1478-1483 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060libs/deepagents/deepagents/backends/filesystem.py:519\u0060 calls \u0060except\u0060, \u0060WriteResult\u0060 and \u0060libs/deepagents/deepagents/backends/filesystem.py:1475\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/filesystem.py"},"region":{"startLine":524}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc9e3cf4edf3cd3e2d04c63de708175ee892a2325578cb738a5b3b5948c1bcc0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): .github/scripts/checks/raise_langchain_minimums.py:168-173 | .github/scripts/release/check_dep_freshness.py:311-316 | .github/scripts/release/check_release_deps.py:564-568 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/checks/raise_langchain_minimums.py"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec5b411cbb0d9be5d38713aed78df393e906443172af4be124e81a230cd20687"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): .github/scripts/evals/aggregate_shards.py:590-598 | .github/scripts/evals/aggregate_shards.py:601-605 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060.github/scripts/evals/aggregate_shards.py:590\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/evals/aggregate_shards.py"},"region":{"startLine":590}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7e55b8f1d5d0dc5a572fc5bec86ce757f3c02bacb91fd3d6563aebb7eed451a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): libs/acp/examples/local_context.py:340-344 | libs/code/deepagents_code/local_context.py:679-684 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060libs/acp/examples/local_context.py:340\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/acp/examples/local_context.py"},"region":{"startLine":340}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcf73f9704554980c5abb808dfdbe3a221693df9cbd43888935bea8e87bbae4e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): libs/deepagents/deepagents/backends/store.py:575-579 | libs/deepagents/deepagents/backends/store.py:590-594 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/store.py"},"region":{"startLine":575}}}],"partialFingerprints":{"codehealthFindingId/v1":"0856d0e49e20a20353e77cb1ddc83c056ba0df629e56ff8e1aa78ab9e2068448"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): libs/deepagents/deepagents/middleware/filesystem.py:3424-3428 | libs/deepagents/deepagents/middleware/filesystem.py:3479-3483 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":3424}}}],"partialFingerprints":{"codehealthFindingId/v1":"dba3aec34ff4db01ecac3e31d6299caebc0a465f1913147eed5ca53b146b85ba"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): libs/evals/scripts/run_trials.py:198-202 | libs/evals/scripts/run_trials.py:206-210 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/evals/scripts/run_trials.py"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"87a60ca899e8093396fa689f3865150666410aff5b8fd729392dd7ffca09d396"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): .github/scripts/evals/aggregate_shards.py:129-139 | .github/scripts/evals/aggregate_unified.py:107-117 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/evals/aggregate_shards.py"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"268949709ef05fa26c0e0974a12e31776e14dd8a0e9fb3aca43e9c86263ff95d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): .github/scripts/evals/aggregate_shards.py:143-157 | .github/scripts/evals/aggregate_unified.py:64-79 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/evals/aggregate_shards.py"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"54356f5c38c19a3bb27d30e47fb2566f802baaf366a484b483f1a1d1b4d3c546"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): .github/scripts/evals/aggregate_unified.py:666-674 | libs/evals/deepagents_evals/trial_summary.py:7-20 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/evals/aggregate_unified.py"},"region":{"startLine":666}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e911b7e85bfc50fda8189b586471934520204ddfa0dbc4bcf9ab3c9748f3626"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): libs/acp/deepagents_acp/utils.py:127-148 | libs/code/deepagents_code/config.py:4271-4295 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/acp/deepagents_acp/utils.py"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fcd6ce92013823a3455cc544858463c16bd576e1642b6305513c6206b73aa7a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 6): libs/code/deepagents_code/config.py:4500-4509 | libs/code/deepagents_code/config.py:4513-4527 | libs/code/deepagents_code/config.py:4531-4546 | libs/code/deepagents_code/config.py:4550-4566 | libs/code/deepagents_code/cost_tracking.py:723-742 | libs/code/deepagents_code/tui/widgets/_links.py:63-72 \u2014 there are 6 copies across 3 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 6 sites; resolving a subset leaves the remainder to drift apart. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/config.py"},"region":{"startLine":4500}}}],"partialFingerprints":{"codehealthFindingId/v1":"66a48e06b09f4c4286204ad155a83bac842aa08514660f747747b8598129556a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): libs/code/deepagents_code/extras_info.py:46-65 | libs/deepagents/deepagents/_version.py:25-44 \u2014 before extracting anything, compare \u0060libs/code/deepagents_code/extras_info.py\u0060 and \u0060libs/deepagents/deepagents/_version.py\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 81 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/extras_info.py"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb6cc06b39db3197c41e650d89c0075828596cdf56f6917f55087e12f38cea4b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): libs/code/deepagents_code/extras_info.py:167-173 | libs/deepagents/deepagents/_version.py:126-132 \u2014 before extracting anything, compare \u0060libs/code/deepagents_code/extras_info.py\u0060 and \u0060libs/deepagents/deepagents/_version.py\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 81 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/extras_info.py"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"60c222bfac1964d05996eb3b59f22afcb1a7dfb44170757b9420674a5dabc7c2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 6): libs/code/deepagents_code/tui/modals/cold_cache.py:87-96 | libs/code/deepagents_code/tui/widgets/notification_center.py:191-200 | libs/code/deepagents_code/tui/widgets/notification_center.py:249-258 | libs/code/deepagents_code/tui/widgets/notification_detail.py:72-81 | libs/code/deepagents_code/tui/widgets/update_available.py:60-69 | libs/code/deepagents_code/tui/widgets/update_available.py:107-116 \u2014 before extracting anything, compare \u0060libs/code/deepagents_code/tui/widgets/notification_detail.py\u0060 and \u0060libs/code/deepagents_code/tui/widgets/update_available.py\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 50 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060libs/code/deepagents_code/tui/modals/cold_cache.py:82\u0060 calls \u0060choice\u0060 and \u0060libs/code/deepagents_code/tui/widgets/update_available.py:104\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/modals/cold_cache.py"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"84ca10aee3f0350bd6deda8db4a5ff5658c52ca9e8fcad275c978c68fd790eb5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 8): libs/code/deepagents_code/tui/widgets/agent_selector.py:226-230 | libs/code/deepagents_code/tui/widgets/auth.py:424-428 | libs/code/deepagents_code/tui/widgets/auth.py:1242-1246 | libs/code/deepagents_code/tui/widgets/codex_auth.py:408-412 | libs/code/deepagents_code/tui/widgets/effort_selector.py:152-156 | libs/code/deepagents_code/tui/widgets/launch_init.py:182-186 | libs/code/deepagents_code/tui/widgets/launch_init.py:340-344 | libs/code/deepagents_code/tui/widgets/theme_selector.py:177-181 \u2014 there are 8 copies across 6 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 8 sites; resolving a subset leaves the remainder to drift apart. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060libs/code/deepagents_code/tui/widgets/auth.py:1237\u0060 calls \u0060on_leave\u0060 and \u0060libs/code/deepagents_code/tui/widgets/agent_selector.py:223\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/agent_selector.py"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cc854ec66ef426d4aa91fb30ca29b78addd3b842252b9b79c89e362cc4f4f1b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): libs/code/deepagents_code/tui/widgets/notification_detail.py:55-64 | libs/code/deepagents_code/tui/widgets/update_available.py:43-52 \u2014 before extracting anything, compare \u0060libs/code/deepagents_code/tui/widgets/notification_detail.py\u0060 and \u0060libs/code/deepagents_code/tui/widgets/update_available.py\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 50 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/notification_detail.py"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"baa3148473566749c5e2c160e1947d0685d046142291894154dbd66f2195fec3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): libs/code/deepagents_code/tui/widgets/notification_detail.py:84-89 | libs/code/deepagents_code/tui/widgets/update_available.py:72-77 \u2014 before extracting anything, compare \u0060libs/code/deepagents_code/tui/widgets/notification_detail.py\u0060 and \u0060libs/code/deepagents_code/tui/widgets/update_available.py\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 50 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/notification_detail.py"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"87c5a7ca99e39160a3ea2e35192cce59fad2be17183844c6b33eada901dd6135"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): libs/deepagents/deepagents/_tools.py:14-26 | libs/deepagents/deepagents/middleware/_tool_exclusion.py:26-31 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. Note first that the copies are not typed on the same thing: the declarations holding them bind \u0060tool\u0060 to \u0060BaseTool | Callable | dict[str, Any]\u0060 in one and \u0060BaseTool | dict[str, str]\u0060 in another, and the duplicated lines use it. The extracted unit therefore needs a parameter type that fits BOTH \u2014 their common supertype where they have one, or a new abstraction over them where they do not \u2014 and settling that is the step that comes BEFORE the extraction above. Where the two types are deliberately unrelated, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/_tools.py"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dea73f76e9f3b6d1304e4cc9e392034c2de0eaf89788ff9fb3274d6db9419bc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): libs/deepagents/deepagents/middleware/_message_eviction.py:177-196 | libs/deepagents/deepagents/middleware/filesystem.py:1773-1791 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. Note first that the copies are not typed on the same thing: the declarations holding them bind \u0060message\u0060 to \u0060ToolMessage\u0060 in one and \u0060HumanMessage\u0060 in another, and the duplicated lines use it. The extracted unit therefore needs a parameter type that fits BOTH \u2014 their common supertype where they have one, or a new abstraction over them where they do not \u2014 and settling that is the step that comes BEFORE the extraction above. Where the two types are deliberately unrelated, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/_message_eviction.py"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"82a3ab1a1ccf88982399a0c628682b035aeb5f9ca2e2161f57620ccc3c7eb22c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): libs/talon/deepagents_talon/channels/discord.py:806-811 | libs/talon/deepagents_talon/channels/slack.py:712-717 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/channels/discord.py"},"region":{"startLine":806}}}],"partialFingerprints":{"codehealthFindingId/v1":"f128a4f7d202ca7fb685b0c56810031e77d97104d9feaf5f1a542d65773f25d9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): libs/code/deepagents_code/plugins/manifest.py:40-55 | libs/code/deepagents_code/plugins/marketplace.py:495-503 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/plugins/manifest.py"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd6e95450a29ee28f2ab3f09b17a7307b03b4d75d55f2f7813ac78180ebcbbdf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): libs/code/deepagents_code/tui/textual_adapter.py:1533-1547 | libs/code/deepagents_code/update_check.py:958-965 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/textual_adapter.py"},"region":{"startLine":1533}}}],"partialFingerprints":{"codehealthFindingId/v1":"5527d4427663494151cc56f2c10cfe45a85eda4db20c256bfbe3a1051632d312"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): libs/code/deepagents_code/tui/widgets/mcp_login.py:219-224 | libs/code/deepagents_code/tui/widgets/update_progress.py:187-192 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/mcp_login.py"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"c92aff7a079c9b4f507508b5ff9b23356ae8393fff88824e5af51f260f2b980a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): libs/talon/deepagents_talon/pairing.py:828-834 | libs/talon/deepagents_talon/tool_approvals.py:62-68 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/pairing.py"},"region":{"startLine":828}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8cb4f8cf6a372078618ad6364dfe0d0bd6bfdc1ced21467f8c8b1757088aed0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): libs/code/deepagents_code/tool_display.py:345-349 | libs/code/deepagents_code/tool_display.py:350-354 | libs/code/deepagents_code/tool_display.py:355-359 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tool_display.py"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a49a480047997357d4c956dbd3e695fcfc86cd231a0581a2117347d02228489"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): libs/deepagents/deepagents/middleware/filesystem.py:3435-3441 | libs/deepagents/deepagents/middleware/filesystem.py:3490-3496 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":3435}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3b47d38e1c5ff1df4a32fb8ebc13a0ca2afee5f2b5cd1befc045f42214680db"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (29\u201332 lines \u00D7 2): examples/deep_research/research_agent/tools.py:46-77 | examples/nvidia_deep_agent/src/tools.py:46-74 \u2014 before extracting anything, compare \u0060examples/deep_research/research_agent/tools.py\u0060 and \u0060examples/nvidia_deep_agent/src/tools.py\u0060 as WHOLE FILES: 95% of the shorter file\u0027s lines also appear in the other, so this reads as one file having been copied from the other rather than as a helper waiting to be extracted. The 2 duplicated block(s) this scan matched between them are fragments of that copy, not the extent of it \u2014 treat the file pair as the unit. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"examples/deep_research/research_agent/tools.py"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"72d0725451136de35923b1e60245a432ef241eaa1c94f8cdebbe3c17c6fa32f7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25\u201327 lines \u00D7 2): examples/llm-wiki/ingest.py:82-108 | examples/llm-wiki/ingest.py:126-150 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060examples/llm-wiki/ingest.py:82\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"examples/llm-wiki/ingest.py"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5d0ce8296a7a547c025042879d7ed37e26051193c0d817238e804da45bd32d4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201318 lines \u00D7 2): examples/llm-wiki/ingest.py:225-242 | examples/llm-wiki/lint.py:45-55 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060examples/llm-wiki/ingest.py:225\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"examples/llm-wiki/ingest.py"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"e626a36f429d142d22e11da9fbcf31c556f502ca78ec3821e04b265129878b16"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): examples/better-harness/better_harness/runners.py:75-83 | examples/better-harness/better_harness/runners.py:252-260 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"examples/better-harness/better_harness/runners.py"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae056fecb4194d55c52a25777d45a83c0cf40c230fdf9c7e83b6b6d41f84809b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): examples/deep_research/research_agent/tools.py:17-35 | examples/nvidia_deep_agent/src/tools.py:17-35 \u2014 before extracting anything, compare \u0060examples/deep_research/research_agent/tools.py\u0060 and \u0060examples/nvidia_deep_agent/src/tools.py\u0060 as WHOLE FILES: 95% of the shorter file\u0027s lines also appear in the other, so this reads as one file having been copied from the other rather than as a helper waiting to be extracted. The 2 duplicated block(s) this scan matched between them are fragments of that copy, not the extent of it \u2014 treat the file pair as the unit. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"examples/deep_research/research_agent/tools.py"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"52a7658f56d42dc60cc651b6fbaae229487dfd7988a977070f47e801ed2409d4"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: deepagents: deepagents: abstractness 0.01, instability 0.00, distance 0.99 \u2014 zone of pain \u2014 concrete and depended on by 9 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"7eb3597de7176a82d005b1e647f7d7f11a61cc859765442e81f9592bb98f5adb"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: BaseSandbox (LCOM4 13): BaseSandbox\u0027s methods fall into 13 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 13 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/sandbox.py"},"region":{"startLine":1587}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d23841ba1814b094cc03a2c4b9eb2ae243c179185bb8a9ad01bb750949ec309"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: ChatTextArea (LCOM4 11): ChatTextArea\u0027s methods fall into 11 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 11 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/chat_input.py"},"region":{"startLine":572}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f948966be80d6110e5c783a20fb475e5980ee4f500db8168aee316f46002b6d"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: DeepAgentsApp (LCOM4 8): DeepAgentsApp\u0027s methods fall into 8 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 8 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":3222}}}],"partialFingerprints":{"codehealthFindingId/v1":"369293428e64511cfa75fd49d868c7d1f2cbcddeca7a34eef08561b21524ab6c"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: FileTokenStorage (LCOM4 6): FileTokenStorage\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/mcp_auth.py"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"c47316c136dfddf7a24bb728188125c5dafd2464e044cfb46bb2f964583f913f"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: VehicleControlAPI (LCOM4 4): VehicleControlAPI\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/evals/tests/evals/data/bfcl_apis/vehicle_control.py"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f24a8ac21ccfbd5b758805eeaf8e25554c0d2b1db3b54aff3c384228d753c03"}},{"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":"a727994898d35498c171982451ef44a704dccae958dc7798ae7e9a593352a6e1"},"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"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"c207b06ad3f7e7665dbfa4d0682a85022c677202e4b2b20e1341284496523a21"},"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"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/app.py: libs/code/deepagents_code/app.py changed 212 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 124 in DeepAgentsApp._handle_command at line 17494. 114 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-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/app.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":17494}}}],"partialFingerprints":{"codehealthFindingId/v1":"1193ad6611246c26de5084f2120436148687375a91e94231a84683736c707537"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/tui/textual_adapter.py: libs/code/deepagents_code/tui/textual_adapter.py changed 35 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 380 in textual_adapter.execute_task_textual at line 1797. 14 of those changes were fix/bug commits, and the other 21 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/tui/textual_adapter.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/textual_adapter.py"},"region":{"startLine":1797}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb0a9633c639fdce5ef232bde199e9e8454bd7d037f826bbe9c01b846cf0ee7d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/main.py: libs/code/deepagents_code/main.py changed 63 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 194 in main.cli_main at line 5335. 23 of those changes were fix/bug commits, and the other 40 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/main.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/main.py"},"region":{"startLine":5335}}}],"partialFingerprints":{"codehealthFindingId/v1":"f054d244da6a8db4a905671f4a5f9d3baacab515a0b7a4f90f7f639a1b2d4558"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/agent.py: libs/code/deepagents_code/agent.py changed 54 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 113 in agent.create_cli_agent at line 2524. 23 of those changes were fix/bug commits, and the other 31 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/agent.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/agent.py"},"region":{"startLine":2524}}}],"partialFingerprints":{"codehealthFindingId/v1":"b63f07aa7d6c554cd906051f6e1a05a657ac220ac0a0bb7c031b686823a66aef"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/config.py: libs/code/deepagents_code/config.py changed 65 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 55 in config.create_model at line 6767. 24 of those changes were fix/bug commits, and the other 41 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/config.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/config.py"},"region":{"startLine":6767}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6edbfb0887df70dee5bcd5ab3673c382ef4cd01450c26af5d434a291668423a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/client/non_interactive.py: libs/code/deepagents_code/client/non_interactive.py changed 33 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 53 in non_interactive._run_agent_loop at line 2121. 13 of those changes were fix/bug commits, and the other 20 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/client/non_interactive.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/client/non_interactive.py"},"region":{"startLine":2121}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f44d90a577648e1795d2889f5ece772a5c29c5fe54bcbbe9a26332babe70bd2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/auto_mode.py: libs/code/deepagents_code/auto_mode.py changed 34 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 48 in AutoModeHITLMiddleware.awrap_model_call at line 3215. 20 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-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/auto_mode.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/auto_mode.py"},"region":{"startLine":3215}}}],"partialFingerprints":{"codehealthFindingId/v1":"83bb9123ceeddb2ed9e7e52cd73ce8405d36bf2827ce1536b427d71181e5c4a5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/config_manifest.py: libs/code/deepagents_code/config_manifest.py changed 57 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in ConfigOption.__post_init__ at line 716. 16 of those changes were fix/bug commits, and the other 41 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/config_manifest.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/config_manifest.py"},"region":{"startLine":716}}}],"partialFingerprints":{"codehealthFindingId/v1":"4569b9c4ea31a8b2edffd2507a141ccb55f475c610297d7162981ed1c4c04ab3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/talon/deepagents_talon/runtime.py: libs/talon/deepagents_talon/runtime.py changed 44 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in DeepAgentRuntime._create_graph at line 433. 14 of those changes were fix/bug commits, and the other 30 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/talon/deepagents_talon/runtime.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/runtime.py"},"region":{"startLine":433}}}],"partialFingerprints":{"codehealthFindingId/v1":"02e8d8084e72affa6450c6dbe23f5c0250f0b960847d897fefd6b53670920183"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/tui/widgets/model_selector.py: libs/code/deepagents_code/tui/widgets/model_selector.py changed 28 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 41 in ModelSelectorScreen._update_display at line 1310. 5 of those changes were fix/bug commits, and the other 23 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/tui/widgets/model_selector.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/model_selector.py"},"region":{"startLine":1310}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc94808ac76f100ce6c2cfee317c4eed74389a894b5f895040959992576bf9a0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/model_config.py: libs/code/deepagents_code/model_config.py changed 31 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 35 in model_config._discover_available_models at line 1562. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/model_config.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":1562}}}],"partialFingerprints":{"codehealthFindingId/v1":"613761d37f1b643c8dc94f9d3e7be2fd96be166d6c2be0b00ec35bd774495447"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/deepagents/deepagents/graph.py: libs/deepagents/deepagents/graph.py changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 59 in graph.create_deep_agent at line 278. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/deepagents/deepagents/graph.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/graph.py"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"2efae59d3cd2b3862e08ad903de85175b76067ac63d2a30a2da0db28b1523d9c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/tui/widgets/chat_input.py: libs/code/deepagents_code/tui/widgets/chat_input.py changed 22 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 33 in ChatTextArea._on_key at line 1239. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/tui/widgets/chat_input.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/chat_input.py"},"region":{"startLine":1239}}}],"partialFingerprints":{"codehealthFindingId/v1":"45346781e40c51af6d70ab0bb59d6734b74c2d48ac89934a13889f420bb3243e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/sessions.py: libs/code/deepagents_code/sessions.py changed 18 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 36 in sessions.list_threads_command at line 2180. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/sessions.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/sessions.py"},"region":{"startLine":2180}}}],"partialFingerprints":{"codehealthFindingId/v1":"cec4576deb7bb9ea3a849b361a89b4ea5490fac08e1b82769968985cc6cc457f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/cost_tracking.py: libs/code/deepagents_code/cost_tracking.py changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 40 in CostTrackingMiddleware._charge at line 3054. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/cost_tracking.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/cost_tracking.py"},"region":{"startLine":3054}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1326f501c4801d8c6a094c0dcbc6aa04c4ed100f747569c703c89f52215eb53"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/configuration/providers.py: libs/code/deepagents_code/configuration/providers.py changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 47 in providers.coerce_toml_value at line 268. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/configuration/providers.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/configuration/providers.py"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"49d80a6a9d938e6943f54a0ad870ef0f3ffa4b80c50a1a66967bd4ab243e8673"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/deepagents/deepagents/middleware/filesystem.py: libs/deepagents/deepagents/middleware/filesystem.py changed 26 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in FilesystemMiddleware.__init__ at line 1891. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/deepagents/deepagents/middleware/filesystem.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/filesystem.py"},"region":{"startLine":1891}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e9b19fb0d9e80a796c4567e613040c347fc5161abe8f62537db7fc3f5717d6a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/tui/widgets/messages.py: libs/code/deepagents_code/tui/widgets/messages.py changed 32 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in ToolCallMessage._restore_deferred_state at line 2172. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/tui/widgets/messages.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/messages.py"},"region":{"startLine":2172}}}],"partialFingerprints":{"codehealthFindingId/v1":"76ca59e1afbea8c03c3beece1463adde604bc116770747b73b1fa9768365b208"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/mcp_tools.py: libs/code/deepagents_code/mcp_tools.py changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 46 in mcp_tools.resolve_and_load_mcp_tools at line 2565. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/mcp_tools.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/mcp_tools.py"},"region":{"startLine":2565}}}],"partialFingerprints":{"codehealthFindingId/v1":"ded5d76d8e4be85bb514ad6e89c092002ec83c0d68c3914ac1b261bda3b2e9cd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/server_graph.py: libs/code/deepagents_code/server_graph.py changed 29 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in server_graph._make_graphs_in_environment at line 416. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/server_graph.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/server_graph.py"},"region":{"startLine":416}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e51c5e33963d51455c82d33611499c8de9215e9c17d0bcffb5b214ba195577d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/update_check.py: libs/code/deepagents_code/update_check.py changed 18 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in update_check.perform_upgrade at line 2495. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/update_check.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/update_check.py"},"region":{"startLine":2495}}}],"partialFingerprints":{"codehealthFindingId/v1":"824e8b6697da9b45bb2159f4cd319561521d55b6319e70257f591768c5d47eed"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/offload_api.py: libs/code/deepagents_code/offload_api.py changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in offload_api.workspace at line 242. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/offload_api.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/offload_api.py"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"a81710ee2b71d323904d4882c12e27c61431240965e7ad10e3a1b13aecc935f7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/configurable_model.py: libs/code/deepagents_code/configurable_model.py changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in configurable_model._build_overrides at line 379. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/configurable_model.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/configurable_model.py"},"region":{"startLine":379}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad4b669f2b57b2e601ccf6d5e12d202d97f73ec2c1a8d5281b8a6fbd9388c885"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/talon/deepagents_talon/mcp.py: libs/talon/deepagents_talon/mcp.py changed 17 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in mcp._remote_connection at line 828. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/talon/deepagents_talon/mcp.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/mcp.py"},"region":{"startLine":828}}}],"partialFingerprints":{"codehealthFindingId/v1":"d700d1d4f2c91bd778af06448ee7862a4bbf10d24c0ec1c91d4f6379085c9f0e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/tui/widgets/message_store.py: libs/code/deepagents_code/tui/widgets/message_store.py changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in MessageData.to_widget at line 360. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/tui/widgets/message_store.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/message_store.py"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"67d04ca56c567a653475baec2eb7e41e98792dc43a8cdc3b962c258fe7f71f2a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/_session_stats.py: libs/code/deepagents_code/_session_stats.py changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 26 in _session_stats.record_message_usage at line 934. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/_session_stats.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/_session_stats.py"},"region":{"startLine":934}}}],"partialFingerprints":{"codehealthFindingId/v1":"f38a492219e0202a349f2f758b682f1f8ada153d9821d2eea48705877571bdeb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/client/remote_client.py: libs/code/deepagents_code/client/remote_client.py changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in RemoteAgent.astream at line 793. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/client/remote_client.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/client/remote_client.py"},"region":{"startLine":793}}}],"partialFingerprints":{"codehealthFindingId/v1":"51a7d3e45f4a1175ec14eae4b11a0986c420cd2a19206131a78219aed6ee44ae"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/tui/widgets/auth.py: libs/code/deepagents_code/tui/widgets/auth.py changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 31 in AuthPromptScreen.compose at line 757. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/tui/widgets/auth.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/auth.py"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf66e98ef2475d38efba192bb61a189ed351c9c734d98a222033eb4757ff32fd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/talon/deepagents_talon/channels/slack.py: libs/talon/deepagents_talon/channels/slack.py changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in _SlackSdkGateway.thread_context at line 527. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/talon/deepagents_talon/channels/slack.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/channels/slack.py"},"region":{"startLine":527}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0f6d8d7814a5df1c284cb3078308fc4fc0a1ce529bdad2afb9125d267ac3503"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/tui/modals/plugin_manager/__init__.py: libs/code/deepagents_code/tui/modals/plugin_manager/__init__.py changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 31 in PluginManagerScreen._refresh_view at line 451. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/tui/modals/plugin_manager/__init__.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/modals/plugin_manager/__init__.py"},"region":{"startLine":451}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca41d5a6cb891a50f83b224059ea580effc179d38f5ce99b3c6c9035a07887a8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/talon/deepagents_talon/channels/whatsapp_bridge/bridge.js: libs/talon/deepagents_talon/channels/whatsapp_bridge/bridge.js changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 47 in bridge.handle at line 581. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/talon/deepagents_talon/channels/whatsapp_bridge/bridge.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/channels/whatsapp_bridge/bridge.js"},"region":{"startLine":581}}}],"partialFingerprints":{"codehealthFindingId/v1":"a472697e7f5ef6a2cc96981336c8e853374ead14fcef5a5b0cdb408dfec36c25"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/hooks/server_middleware.py: libs/code/deepagents_code/hooks/server_middleware.py changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in ServerHooksMiddleware._after_model at line 601. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/hooks/server_middleware.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/hooks/server_middleware.py"},"region":{"startLine":601}}}],"partialFingerprints":{"codehealthFindingId/v1":"f11a50c376b045d1e8692522f7cc0741674aa20c8d58555d2faa57bcb52bbd74"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/acp/deepagents_acp/server.py: libs/acp/deepagents_acp/server.py changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 41 in AgentServerACP.prompt at line 948. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/acp/deepagents_acp/server.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/acp/deepagents_acp/server.py"},"region":{"startLine":948}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb2b909ef5391b1fa3cd77b6808adc41efe29b97c8fbe03d8c63aeffd31cbfda"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/offload_middleware.py: libs/code/deepagents_code/offload_middleware.py changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in CLICompactionMiddleware._summarization_for_runtime at line 1330. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/offload_middleware.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/offload_middleware.py"},"region":{"startLine":1330}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f4be231069beb0b6279db914e21ea5c6d18aaf2c317eb7fd4957d764aeea8a8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/talon/deepagents_talon/cron/jobs.py: libs/talon/deepagents_talon/cron/jobs.py changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in CronJobStore.edit_job at line 977. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/talon/deepagents_talon/cron/jobs.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/cron/jobs.py"},"region":{"startLine":977}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7db2d457292ecc0f5e3223f55f781ec93d849e0e130b5ae15a7ce5653d29fb2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/tui/widgets/welcome.py: libs/code/deepagents_code/tui/widgets/welcome.py changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 33 in WelcomeBanner._build_banner at line 445. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/tui/widgets/welcome.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/welcome.py"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"9eab0e8d40bfe6e86fc16234c44835cac4f3bb5a02c286acb918376fd24b0c20"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/tui/widgets/thread_selector.py: libs/code/deepagents_code/tui/widgets/thread_selector.py changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in thread_selector._format_column_value at line 307. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/tui/widgets/thread_selector.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/thread_selector.py"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"e904b8839aa57da5e4e010b0cde28426afefcd6c568b1eb4dd7a3429941b4834"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/ask_user.py: libs/code/deepagents_code/ask_user.py changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in ask_user._parse_answers at line 117. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/ask_user.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/ask_user.py"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"2851a11656bb235ab7a53ea0ba4f0a593b174bdeed8d1b15e076b3a023884cf4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: .github/scripts/evals/unified_prep.py: .github/scripts/evals/unified_prep.py changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in unified_prep.main at line 527. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- .github/scripts/evals/unified_prep.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/evals/unified_prep.py"},"region":{"startLine":527}}}],"partialFingerprints":{"codehealthFindingId/v1":"93017610bef82637be86b23ad6b021db402e6d440c5c6d6f6d52be759d1e549d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/_server_config.py: libs/code/deepagents_code/_server_config.py changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in ServerConfig.__post_init__ at line 748. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/_server_config.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/_server_config.py"},"region":{"startLine":748}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dd0996657b241159076b95996c05b344e92fb6ad3d6c8d2bc3e855471aa90ba"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: .github/scripts/checks/raise_langchain_minimums.py: .github/scripts/checks/raise_langchain_minimums.py changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in raise_langchain_minimums._run at line 628. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- .github/scripts/checks/raise_langchain_minimums.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/checks/raise_langchain_minimums.py"},"region":{"startLine":628}}}],"partialFingerprints":{"codehealthFindingId/v1":"9892f58989f41388d55c4ac4e2a7e4930d78f7bb4a45793805d56c77046951eb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/configuration/service.py: libs/code/deepagents_code/configuration/service.py changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in service.managed_policy_violations at line 290. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/configuration/service.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/configuration/service.py"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"65d9199f533f9aa0781c750d199f8250cae12b717fbdf4b6020c8026f1e9b4da"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: .github/scripts/release/build_release_notes.py: .github/scripts/release/build_release_notes.py changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 35 in build_release_notes.collect_contributors at line 981. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- .github/scripts/release/build_release_notes.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/release/build_release_notes.py"},"region":{"startLine":981}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbcb31aeff2c9d208c0d1ec0df536a746dc8936f3b55f3389955e4dc878b3b62"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/deepagents/deepagents/backends/sandbox.py: libs/deepagents/deepagents/backends/sandbox.py changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in sandbox._build_grep_cmd at line 973. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/deepagents/deepagents/backends/sandbox.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/sandbox.py"},"region":{"startLine":973}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b0e0aa5c7c9501aba8b96c53d1cbdaf53300a0370992e5d75eed836140ea965"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/skills/commands.py: libs/code/deepagents_code/skills/commands.py changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in commands._list at line 147. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/skills/commands.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/skills/commands.py"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9e8cfe57c5f2eebc019e29fe07c591c36473f5134695afe57b1025c2398a8da"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/talon/deepagents_talon/store_archive.py: libs/talon/deepagents_talon/store_archive.py changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in StoreConversationArchive.text_entries at line 389. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/talon/deepagents_talon/store_archive.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/store_archive.py"},"region":{"startLine":389}}}],"partialFingerprints":{"codehealthFindingId/v1":"89bbae09a6c3ede407ad5e03e1fa3f9908fe9fed90959ecb05a60c0c5b99c708"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/cold_cache.py: libs/code/deepagents_code/cold_cache.py changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in cold_cache.resolve_prompt_cache_policy at line 815. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/cold_cache.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/cold_cache.py"},"region":{"startLine":815}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9f7c70dbcff3509f97a442e5a67f200701b28e03f99e4cda81f49a30ad8807b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/talon/deepagents_talon/channels/whatsapp.py: libs/talon/deepagents_talon/channels/whatsapp.py changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in whatsapp._parse_message at line 839. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/talon/deepagents_talon/channels/whatsapp.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/channels/whatsapp.py"},"region":{"startLine":839}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ffd449af4f4835796a36ea39818afacf96e78d92d6761371a9b6bb58a54f942"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/talon/deepagents_talon/background.py: libs/talon/deepagents_talon/background.py changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in BackgroundSubagents.awrap_tool_call at line 200. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/talon/deepagents_talon/background.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/background.py"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b1b88560dd6fc973fc1f641737c8a95bb67e70a639d7aa850f04ea6d0f0584c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: .github/scripts/evals/aggregate_unified.py: .github/scripts/evals/aggregate_unified.py changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 35 in aggregate_unified.read_leaf at line 147. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- .github/scripts/evals/aggregate_unified.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/evals/aggregate_unified.py"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d639f29dabc192a499eedfb446ac95f4bc8e19078c5ffaadd0367e82f794783"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/theme.py: libs/code/deepagents_code/theme.py changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 26 in theme._load_user_themes at line 517. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/theme.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/theme.py"},"region":{"startLine":517}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf3b67e14ee877346ffac946348263741c47b14dba64c6c839df3d9939cccbd3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/deepagents/deepagents/backends/filesystem.py: libs/deepagents/deepagents/backends/filesystem.py changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in FilesystemBackend.glob at line 1320. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/deepagents/deepagents/backends/filesystem.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/filesystem.py"},"region":{"startLine":1320}}}],"partialFingerprints":{"codehealthFindingId/v1":"a692193452fc9c9663d6188ffef25195617fe330a017e5d46f2434f3b805a254"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/mcp_login_service.py: libs/code/deepagents_code/mcp_login_service.py changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in mcp_login_service.resolve_mcp_config 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-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/mcp_login_service.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/mcp_login_service.py"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"93f5ac73644cfda7e6e7685031ddc3638393da45ee8cdcea2e22b2bc044dc24c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py: libs/code/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in quick_validate.validate_skill at line 20. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfa2dcbf488c8c2547a75f30301be061362db16131ee0007d102817c25428cdd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/plugins/manifest.py: libs/code/deepagents_code/plugins/manifest.py changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in manifest.load_manifest at line 256. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/plugins/manifest.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/plugins/manifest.py"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbd629c44492dcbe1f7b6aa42115b3529bdf6b743350dc7c4f26f0a7d573a6db"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/talon/deepagents_talon/history_profiles.py: libs/talon/deepagents_talon/history_profiles.py changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in history_profiles._validate_profile at line 234. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/talon/deepagents_talon/history_profiles.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/history_profiles.py"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"1036656904d4fd63bac36605c0044699c997714fbb2e742ed6981f44b06ee442"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/plugins/discovery.py: libs/code/deepagents_code/plugins/discovery.py changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in discovery.auto_update_plugins at line 338. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/plugins/discovery.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/plugins/discovery.py"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e7ab31607a63d65c937c16af222ccda630143a2e5b3ff1637e225a143b627b9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/hooks/runner.py: libs/code/deepagents_code/hooks/runner.py changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in runner.run_command_handler at line 46. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/hooks/runner.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/hooks/runner.py"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"21dbfa033411024e388faeb28dc4087e8d1b0ba97bf39bbc09c63bebde3ae438"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/integrations/sandbox_config.py: libs/code/deepagents_code/integrations/sandbox_config.py changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in SandboxConfig.load at line 111. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/integrations/sandbox_config.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/integrations/sandbox_config.py"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a56ebc7455e39f8cd8dcf684352fed6b3b18e244c6f6fc9c00b3b242aa37216"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: .github/scripts/evals/aggregate_shards.py: .github/scripts/evals/aggregate_shards.py changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in aggregate_shards.main at line 675. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- .github/scripts/evals/aggregate_shards.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/scripts/evals/aggregate_shards.py"},"region":{"startLine":675}}}],"partialFingerprints":{"codehealthFindingId/v1":"c863c0aba26a7b9421d9033c5eea29afe4e3ac5c3eb5904ccec11895e70a7a0d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/btw.py: libs/code/deepagents_code/btw.py changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in BtwOperation._resolve_context at line 474. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/btw.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/btw.py"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"210084b8864d2d10956a7cc3a02ba9240a6528fdaaf5d9ba47cb14b84c2b7e1a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/tui/widgets/diff.py: libs/code/deepagents_code/tui/widgets/diff.py changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in diff._compose_diff_content at line 817. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/tui/widgets/diff.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/diff.py"},"region":{"startLine":817}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed6f38f70c5cc95324fcdedb3ee89357dacbe21658c30d67196e18d3569c0e1b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: libs/code/deepagents_code/configuration/provider.py: libs/code/deepagents_code/configuration/provider.py changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in CliProvider._coerce at line 177. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/configuration/provider.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/configuration/provider.py"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b743eff8d0ae1af3bfe18d3b495c9adf4ec1df1542697b735c1ddcbbcd45732"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/deepagents/deepagents/backends/utils.py: libs/deepagents/deepagents/backends/utils.py changed 12 times in last 90 days and 11 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 11 (its worst body is utils.grep_matches_from_files at line 1091), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(sdk): skip binary files in in-memory \u0060grep\u0060 (#7032)\u201D; \u201Cfix(sdk): bound tool offload paths and abbreviate long IDs (#6519)\u201D; \u201Cfix(sdk): preserve legacy large-result templates behind deprecation (#5568)\u201D; \u201Cfix(sdk): explain truncation markers only when preview omits lines (#5563)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/deepagents/deepagents/backends/utils.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/utils.py"},"region":{"startLine":1091}}}],"partialFingerprints":{"codehealthFindingId/v1":"58a42726c62a5f57bf5d2334eb506b314857392835ce5282d184d7c96bde3d81"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/code/deepagents_code/tui/widgets/debug_console.py: libs/code/deepagents_code/tui/widgets/debug_console.py changed 13 times in last 90 days and 7 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 12 (its worst body is _DebugLogView.render_line at line 459), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(code): move debug MCP server details into a modal (#6720)\u201D; \u201Cfix(code): refresh token and cost breakdown while open (#6520)\u201D; \u201Cfix(code): wrap debug logs before the scrollbar (#6219)\u201D; \u201Cfix(code): order debug console log filters (#6217)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/tui/widgets/debug_console.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/debug_console.py"},"region":{"startLine":459}}}],"partialFingerprints":{"codehealthFindingId/v1":"7161ba00352b506a3b48ccad8b8d20f58a8a6c75d34a1077b50b46335f07d75d"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/talon/deepagents_talon/mcp_auth.py: libs/talon/deepagents_talon/mcp_auth.py changed 12 times in last 90 days and 7 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 11 (its worst body is mcp_auth.extract_loopback_oauth_callback_url at line 1126), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(talon): identify MCP OAuth requests with a user agent (#6981)\u201D; \u201Cfix(talon): close a url swap past the MCP auto-approve guard (#6173)\u201D; \u201Cfix(talon): stop losing MCP refresh tokens on a refresh response (#6172)\u201D; \u201Cfix(talon): harden the MCP OAuth device flow and credential paths (#6170)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/talon/deepagents_talon/mcp_auth.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/mcp_auth.py"},"region":{"startLine":1126}}}],"partialFingerprints":{"codehealthFindingId/v1":"63d37f4199131155960336d19cb9fceec8b0a9e153c10a61f38479a934abf972"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/deepagents/deepagents/backends/state.py: libs/deepagents/deepagents/backends/state.py changed 6 times in last 90 days and 6 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 6 (its worst body is StateBackend.glob at line 292), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(sdk): reject text edits of binary files (#7069)\u201D; \u201Cfix(sdk): reset stale encoding on text overwrite (#6737)\u201D; \u201Cfix(sdk): tag binary \u0060StateBackend.upload_files\u0060 content as base64 (#6551)\u201D; \u201Cfix(sdk): report UTF-8 byte sizes (#6258)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/deepagents/deepagents/backends/state.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/state.py"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"70631364cf19393e2f7e39396f5e30a22bf8c01176947bd9dea3b82c83fec2dd"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/talon/deepagents_talon/history_vectors.py: libs/talon/deepagents_talon/history_vectors.py changed 6 times in last 90 days and 6 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 13 (its worst body is HistoryVectorIndex.close at line 105), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(talon): index only visible conversation text (#6358)\u201D; \u201Cfix(talon): persist history vector deduplication (#6357)\u201D; \u201Cfix(talon): bound the vector rebuild, break the import cycle, pin postgres (#6165)\u201D; \u201Cfix(talon): surface indexing failures and bound the indexing worker (#6163)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/talon/deepagents_talon/history_vectors.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/history_vectors.py"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce231484570bf309016b8651a7c329d3998d7c35721c04ec33a9e42b8076c7fd"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/code/deepagents_code/tui/widgets/auto_mode_notice.py: libs/code/deepagents_code/tui/widgets/auto_mode_notice.py changed 8 times in last 90 days and 5 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 4 (its worst body is auto_mode_notice.build_auto_mode_notice_body at line 60), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(code): complete ASCII UI fallbacks (#5930)\u201D; \u201Cfix(code): show Auto first-enable notice as pre-confirmation (#5686)\u201D; \u201Cfix(code): simplify classifier notice copy (#5691)\u201D; \u201Cfix(code): remove review failure approval copy (#5687)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/tui/widgets/auto_mode_notice.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/auto_mode_notice.py"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"b274d48455ad70b2f067c5bda2620264bc0e10c3007c4ccfe0c6545663080517"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/code/deepagents_code/_textual_patches.py: libs/code/deepagents_code/_textual_patches.py changed 6 times in last 90 days and 5 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 10 (its worst body is _textual_patches._word_bounds at line 302), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(code): extend triple-click selection across blocks (#6819)\u201D; \u201Cfix(code): complete ASCII UI fallbacks (#5930)\u201D; \u201Cfix(code): extend text selection with \u0060Shift\u0060 \u002B \u0060click\u0060 (#5732)\u201D; \u201Cfix(code): hide chat input cursor while unfocused (#5258)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/_textual_patches.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/_textual_patches.py"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"390d4d1eca495600db194c045e277853f2679e1cf98e689c1f5d3c3b0f515ae1"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/deepagents/deepagents/backends/store.py: libs/deepagents/deepagents/backends/store.py changed 5 times in last 90 days and 5 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 9 (its worst body is StoreBackend._convert_store_item_to_file_data at line 170), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(sdk): reject text edits of binary files (#7069)\u201D; \u201Cfix(sdk): reset stale encoding on text overwrite (#6737)\u201D; \u201Cfix(sdk): report UTF-8 byte sizes (#6258)\u201D; \u201Cfix(sdk): surface sandbox glob failures instead of reporting no matches (#5566)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/deepagents/deepagents/backends/store.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/store.py"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"8204b0c0b47675d40c6d5181b4db0d6053bd79f24e639d472cbfeb8bc04bbf71"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/deepagents/deepagents/middleware/_message_eviction.py: libs/deepagents/deepagents/middleware/_message_eviction.py changed 5 times in last 90 days and 5 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 5 (its worst body is _message_eviction._offload_tool_message_content at line 260), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(sdk): preserve resolved tool-result paths (#6968)\u201D; \u201Cfix(sdk): bound tool offload paths and abbreviate long IDs (#6519)\u201D; \u201Cfix(sdk): disclose per-line clipping in large-result previews (#5564)\u201D; \u201Cfix(sdk): explain truncation markers only when preview omits lines (#5563)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/deepagents/deepagents/middleware/_message_eviction.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/_message_eviction.py"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bded84689d502d3bc6162d60792df1665e4c3051aefe727245483b3b042c4dc"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/talon/deepagents_talon/history_adapters.py: libs/talon/deepagents_talon/history_adapters.py changed 5 times in last 90 days and 5 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 8 (its worst body is BoundedEmbeddings._bridge at line 169), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(talon): fix local voice transcription and embedding retries (#6255)\u201D; \u201Cfix(talon): persist local model downloads (#6137)\u201D; \u201Cfix(talon): share one optional-driver loader and close provider clients (#6164)\u201D; \u201Cfix(talon): make remote embedding settings explicit and search non-blocking (#6133)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/talon/deepagents_talon/history_adapters.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/history_adapters.py"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a9c2e16e45b4074c3acfcddac70ead4942575c7c284cbd97f958fc8e0b91804"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/code/deepagents_code/integrations/sandbox_factory.py: libs/code/deepagents_code/integrations/sandbox_factory.py changed 7 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 13 (its worst body is _DaytonaProvider.get_or_create at line 490), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(code): clean up new sandboxes when setup fails (#6475)\u201D; \u201Cfix(code): resolve project policy per workspace (#6064)\u201D; \u201Cfix(code): isolate LangSmith auth and workspace tracing (#6061)\u201D; \u201Cfix(code): scope project dotenv to workspaces (#5980)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/integrations/sandbox_factory.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/integrations/sandbox_factory.py"},"region":{"startLine":490}}}],"partialFingerprints":{"codehealthFindingId/v1":"24e2d560741714e4d2705fdf82aeaf75a651c93c7a15be805fbe433c0aeab779"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/deepagents/deepagents/middleware/rubric.py: libs/deepagents/deepagents/middleware/rubric.py changed 7 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 13 (its worst body is RubricMiddleware.__init__ at line 559), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(sdk): preserve parent rubric during parallel subagent calls (#6849)\u201D; \u201Cfix(sdk): enforce full criterion coverage in \u0060RubricMiddleware\u0060 (#5234)\u201D; \u201Cfix(sdk): diagnose rubric grader structured output errors (#4938)\u201D; \u201Cfix(sdk): include HTTP status in rubric grader errors (#4967)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/deepagents/deepagents/middleware/rubric.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/rubric.py"},"region":{"startLine":559}}}],"partialFingerprints":{"codehealthFindingId/v1":"b873de6e4685f3a1ffebbaf33361eeaa39dbf71527804a24140e4b9621467a3c"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/code/deepagents_code/tui/widgets/approval.py: libs/code/deepagents_code/tui/widgets/approval.py changed 7 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 9 (its worst body is ApprovalMenu._get_command_display at line 237), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(code): show bound workspace in shell approvals (#5966)\u201D; \u201Cfix(code): simplify Auto fallback copy (#5670)\u201D; \u201Cfix(code): make reject-with-feedback discoverable in approval menu (#5260)\u201D; \u201Cfix(code): make Auto mode generally available (#4957)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/tui/widgets/approval.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/approval.py"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"9557c97dc7caafc21e901ce31f6409644d806e20de5f10206718cb89e759bc3c"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/code/deepagents_code/tui/widgets/subagent_panel.py: libs/code/deepagents_code/tui/widgets/subagent_panel.py changed 6 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 10 (its worst body is SubagentPanel._handle_finish at line 419), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(code): collapse idle subagents and reopen new work (#6782)\u201D; \u201Cfix(code): preserve dispatch timers across interrupt replays (#6722)\u201D; \u201Cfix(code): complete ASCII UI fallbacks (#5930)\u201D; \u201Cfix(code): clear dynamic subagents on next turn (#5437)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/tui/widgets/subagent_panel.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/subagent_panel.py"},"region":{"startLine":419}}}],"partialFingerprints":{"codehealthFindingId/v1":"aba00529e5caca826119fd594cf86698bcf0be9615659a26d9417d0e5602f139"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/talon/deepagents_talon/archive_saver.py: libs/talon/deepagents_talon/archive_saver.py changed 6 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 8 (its worst body is ConversationSaver._messages at line 210), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(talon): share Slack channel conversation archives across threads (#6665)\u201D; \u201Cfix(talon): let scheduled jobs read their origin chat\u0027s history (#6583)\u201D; \u201Cfix(talon): index only visible conversation text (#6358)\u201D; \u201Cfix(talon): persist history vector deduplication (#6357)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/talon/deepagents_talon/archive_saver.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/archive_saver.py"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"c91759622bc226070d5e2e7d00321e2fc88bc8328015115d8b3b69129194cb8a"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/evals/deepagents_harbor/langgraph_project/langgraph_agent.py: libs/evals/deepagents_harbor/langgraph_project/langgraph_agent.py changed 6 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 9 (its worst body is langgraph_agent._apply_glm_5_2_reasoning_default at line 126), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(evals): migrate Harbor to \u0060langchain.mcp\u0060 (#6391)\u201D; \u201Cfix(evals): use dcode runtime state in Harbor (#5872)\u201D; \u201Cfix(evals): inherit Harbor task working directory (#5281)\u201D; \u201Cfix(evals): pin virtual_mode=False in the Harbor bare adapter (#5008)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/evals/deepagents_harbor/langgraph_project/langgraph_agent.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/evals/deepagents_harbor/langgraph_project/langgraph_agent.py"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"33e26d81f6cc10011e06cce2c453a372e5ffe5adf8377ee37c8ad3027a4512aa"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/code/deepagents_code/model_retry.py: libs/code/deepagents_code/model_retry.py changed 5 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 13 (its worst body is model_retry._extract_status_code at line 259), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(code): surface actionable Groq tool-limit errors (#6996)\u201D; \u201Cfix(code): reconcile cache expiry during model requests (#6763)\u201D; \u201Cfix(code): retry bare \u0060openai.APIError\u0060 raised mid-stream (#6499)\u201D; \u201Cfix(code): retry interrupted model streams (#5905)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/model_retry.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_retry.py"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"f72210a42bc6566a0fd4211a69cd4ee0c72e6420ce2fafbb4f6eb4d2dea4222f"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/code/deepagents_code/tools.py: libs/code/deepagents_code/tools.py changed 5 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 8 (its worst body is tools._validate_url at line 98), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(code): isolate LangSmith auth and workspace tracing (#6061)\u201D; \u201Cfix(code): scope project dotenv to workspaces (#5980)\u201D; \u201Cfix(code): trim \u0060web_search\u0060 and \u0060fetch_url\u0060 tool descriptions (#5016)\u201D; \u201Cfix(code): put field descriptions on first-party tool schemas (#5019)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/tools.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tools.py"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"2acf33ff8e380cdef0cab51a6ac29bddcbbfc3beec53e78931c73cd2088167cb"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/deepagents/deepagents/backends/context_hub.py: libs/deepagents/deepagents/backends/context_hub.py changed 4 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 13 (its worst body is ContextHubBackend.grep at line 596), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(sdk): make \u0060ContextHubBackend.glob\u0060 honor \u0060path\u0060 (#6998)\u201D; \u201Cfix(sdk): surface sandbox glob failures instead of reporting no matches (#5566)\u201D; \u201Cfix(sdk): make \u0060BackendProtocol.glob\u0060 recursive for bare patterns (#5026)\u201D; \u201Cfix(sdk): batch concurrent \u0060ContextHubBackend\u0060 mutations (#5471)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/deepagents/deepagents/backends/context_hub.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/context_hub.py"},"region":{"startLine":596}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6e7ae7a82f8b13267b58684853375a3fc1fd60a9ea971a111ee68f65e9bef98"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/code/deepagents_code/tui/widgets/prompt_search.py: libs/code/deepagents_code/tui/widgets/prompt_search.py changed 4 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 9 (its worst body is PromptSearchPanel._rebuild_options at line 451), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(code): hide unavailable prompt search hints (#6543)\u201D; \u201Cfix(code): replace composer with prompt search and prevent query feedback (#6346)\u201D; \u201Cfix(code): align prompt clipboard word deletion (#6345)\u201D; \u201Cfix(code): make prompt clipboard Tab insert (#5820)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/tui/widgets/prompt_search.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/prompt_search.py"},"region":{"startLine":451}}}],"partialFingerprints":{"codehealthFindingId/v1":"ede5314da1fc8f100dc5d7d7feed92ebceab5d87625a4ca98b6d19bef5d00b21"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/code/deepagents_code/workspace.py: libs/code/deepagents_code/workspace.py changed 4 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 9 (its worst body is workspace._canonical_directory at line 143), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(code): separate access-policy compatibility from runtime identity (#6386)\u201D; \u201Cfix(code): diagnose workspace binding and runtime refusals (#6384)\u201D; \u201Cfix(code): resolve project policy per workspace (#6064)\u201D; \u201Cfix(code): refuse a second sandbox workspace (#5979)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/workspace.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/workspace.py"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"743c553ed8c70a87985486c2e78076ffb77aecdf4db8abd94b1d16b98f254b8c"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/talon/deepagents_talon/store_archive_index.py: libs/talon/deepagents_talon/store_archive_index.py changed 4 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 10 (its worst body is StoreVectorArchive.rows at line 62), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(talon): index only visible conversation text (#6358)\u201D; \u201Cfix(talon): persist history vector deduplication (#6357)\u201D; \u201Cfix(talon): bound the vector rebuild, break the import cycle, pin postgres (#6165)\u201D; \u201Cfix(talon): bound archive scans, query embeddings, and deletion markers (#6162)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/talon/deepagents_talon/store_archive_index.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/store_archive_index.py"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"beb273e462cb6161eadabe0ce04bfb8cba4bb9263c52d6e58ed2fce8e07287ab"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/code/deepagents_code/tui/widgets/cwd_switch.py: libs/code/deepagents_code/tui/widgets/cwd_switch.py changed 4 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 7 (its worst body is CwdSwitchPromptScreen._body_text at line 137), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(code): confirm server restart for workspace switch (#6178)\u201D; \u201Cfix(code): complete ASCII UI fallbacks (#5930)\u201D; \u201Cfix(code): clarify project hooks trust prompt and stop prompting for user hooks (#5426)\u201D; \u201Cfix(code): refresh hooks after cwd switches (#5249)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/tui/widgets/cwd_switch.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/cwd_switch.py"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bc97ca16b8af0801d1e1f18880e11caca121c0fc3c0b8364a1153942306dfac"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/code/deepagents_code/tui/widgets/autocomplete.py: libs/code/deepagents_code/tui/widgets/autocomplete.py changed 5 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 14 (its worst body is SlashCommandController._score_command at line 213), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(code): support non-ASCII file names in \u0060@\u0060 mentions (#7023)\u201D; \u201Cfix(code): add \u0060/resume\u0060 alias and rank alias matches (#6988)\u201D; \u201Cfix(code): keep prompt recall out of file picker (#6494)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/tui/widgets/autocomplete.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/autocomplete.py"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8c673f39cab873584af605d777b89dae028656e576250bf65a9871bc669ffe2"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/talon/deepagents_talon/archive.py: libs/talon/deepagents_talon/archive.py changed 5 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 6 (its worst body is archive.build_search_page at line 69), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(talon): resume history search past the scan budget (#6740)\u201D; \u201Cfix(talon): validate archive pagination arguments (#6442)\u201D; \u201Cfix(talon): bound the vector rebuild, break the import cycle, pin postgres (#6165)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/talon/deepagents_talon/archive.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/archive.py"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"04959b11b72f2c1b8ad788bed9b0cef55b2d428d3ecfa929aaaa6be8b161f7ad"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/code/deepagents_code/offload.py: libs/code/deepagents_code/offload.py changed 5 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 7 (its worst body is offload._delete_expired_archive at line 286), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(code): sweep expired history archives at startup (#5751)\u201D; \u201Cfix(code): require \u0060AGENTS.md\u0060 marker for \u0060/agent\u0060 discovery (#5076)\u201D; \u201Cfix(code): omit \u0060plugins/\u0060 and \u0060conversation_history/\u0060 from \u0060/agent\u0060 picker (#4991)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/offload.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/offload.py"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"b78963ab4252291d5144ca5f7529668895d5cdd70b6306ff1bf754b3e5b7a068"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/code/deepagents_code/tui/widgets/notification_center.py: libs/code/deepagents_code/tui/widgets/notification_center.py changed 5 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 9 (its worst body is NotificationCenterScreen.reload at line 967), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(code): remove notification settings expand flicker and trailing disclosure glyph (#5734)\u201D; \u201Cfix(code): standardize modal navigation hints (#5699)\u201D; \u201Cfix(code): preload auth UI before notification handoff (#5697)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/tui/widgets/notification_center.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/notification_center.py"},"region":{"startLine":967}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c8f854280fcc7c4fd87df668686aa8c7bc12e88ac4ba9bd9a4e2565fe874e0f"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/talon/deepagents_talon/cron/scheduler.py: libs/talon/deepagents_talon/cron/scheduler.py changed 4 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 8 (its worst body is PersistentCronScheduler._run_due_job at line 133), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(talon): deliver background subagents launched by a scheduled job (#6228)\u201D; \u201Cfix(talon): treat trailing [SILENT] as a suppression marker (#6110)\u201D; \u201Cfix(talon): keep the cron ticker alive through a failed tick (#6087)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/talon/deepagents_talon/cron/scheduler.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/cron/scheduler.py"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4711b037da4f306e26dbad7c83efefef69f86d7eb5614ebcbbeafa234479f07"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/code/deepagents_code/tui/widgets/agent_selector.py: libs/code/deepagents_code/tui/widgets/agent_selector.py changed 4 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 11 (its worst body is AgentSelectorScreen.action_set_default at line 257), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(code): standardize modal navigation hints (#5699)\u201D; \u201Cfix(code): require \u0060AGENTS.md\u0060 marker for \u0060/agent\u0060 discovery (#5076)\u201D; \u201Cfix(code): consistent modal backdrop dimming for selectors (#4990)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/tui/widgets/agent_selector.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/agent_selector.py"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"49df0c1f08231305d2817f52641d2074e47efc461a54c964c4f2ab1c350c52cc"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/code/deepagents_code/tui/widgets/_inline_prompt.py: libs/code/deepagents_code/tui/widgets/_inline_prompt.py changed 4 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 8 (its worst body is InlinePromptTextArea._on_key at line 160), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(code): keep rapid typing visible (#5424)\u201D; \u201Cfix(code): indent wrapped ask-user choices and add selection styling (#5442)\u201D; \u201Cfix(code): toast when media is dropped into a free-text question (#5099)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/tui/widgets/_inline_prompt.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/_inline_prompt.py"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"692f3a999738964c33644f13d234e36432a9d4c4208ba080d457bb498c1e79d4"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/code/deepagents_code/_debug.py: libs/code/deepagents_code/_debug.py changed 3 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 8 (its worst body is _debug._debug_directory at line 386), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(code): align file and console debug log formatting (#6426)\u201D; \u201Cfix(code): isolate debug logs by thread (#5921)\u201D; \u201Cfix(code): capture stdio MCP server stderr into the logger (#5610)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/_debug.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/_debug.py"},"region":{"startLine":386}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4adc6dc95711ef67c4ad8f22564f74deede0e674d522b38c1bac21f2e87a4e1"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/code/deepagents_code/tui/widgets/effort_selector.py: libs/code/deepagents_code/tui/widgets/effort_selector.py changed 3 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 5 (its worst body is EffortSelectorScreen.compose at line 99), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(code): expose unknown reasoning effort (#6241)\u201D; \u201Cfix(code): standardize modal navigation hints (#5699)\u201D; \u201Cfix(code): consistent modal backdrop dimming for selectors (#4990)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/code/deepagents_code/tui/widgets/effort_selector.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/effort_selector.py"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5874e4d1396a4e66fcf6a29c6206d3a4d69858ec4cb217f3b2842b76ae06c10"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: libs/talon/deepagents_talon/history_embeddings.py: libs/talon/deepagents_talon/history_embeddings.py changed 3 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 6 (its worst body is HistoryEmbeddings.aembed_documents at line 114), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(talon): fix local voice transcription and embedding retries (#6255)\u201D; \u201Cfix(talon): persist local model downloads (#6137)\u201D; \u201Cfix(talon): stop HistoryEmbeddings defaulting to Qwen\u0027s query prefix (#6134)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 12:40:25 -04:00\u0027 --until=\u00272026-10-20 12:40:25 -04:00\u0027 --full-history --no-merges -- libs/talon/deepagents_talon/history_embeddings.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/history_embeddings.py"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0f6fcbe92e4cc5e3424b552b5b895ac89c1821c9e007fa09eb3d8fa1e7b92f6"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #1: If anonymized user #1 becomes unavailable, 95 significant file(s) lose their only recent owner: libs/code/deepagents_code/update_check.py, libs/code/deepagents_code/tui/widgets/chat_input.py, libs/code/deepagents_code/auto_mode.py, libs/code/deepagents_code/cost_tracking.py, libs/code/deepagents_code/tui/widgets/thread_selector.py, libs/code/deepagents_code/mcp_auth.py, libs/code/deepagents_code/tui/widgets/auth.py, libs/code/deepagents_code/goal_rubric.py (\u002B87 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ac31eca9d8e814978fa5cf2cb61eb7423c3dc0eb9c368bfde8a8f2ec9daf706c"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #2: If anonymized user #2 becomes unavailable, 19 significant file(s) lose their only recent owner: libs/code/deepagents_code/hooks/manager.py, libs/code/deepagents_code/hooks/reducer.py, libs/code/deepagents_code/hooks/trust.py, libs/code/deepagents_code/hooks/client_lifecycle.py, libs/code/deepagents_code/hooks/snapshot.py, libs/code/deepagents_code/hooks/runtime.py, libs/code/deepagents_code/plugins/adapters/mcp.py, libs/code/deepagents_code/extensions/registry.py (\u002B11 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ebbcbfb831defa6fd90e14be63baa63874a909fbd851aef46a1570c184ede3fe"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #3: If anonymized user #3 becomes unavailable, 5 significant file(s) lose their only recent owner: libs/talon/deepagents_talon/channels/whatsapp.py, libs/talon/deepagents_talon/observability.py, libs/talon/deepagents_talon/speech.py, libs/talon/deepagents_talon/authorization.py, libs/talon/deepagents_talon/messaging.py. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"b5f7a74a2d9084c87b1783c1151f45e7df3f7d74183a295ce19bb418fd250ff0"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #4: If anonymized user #4 becomes unavailable, 3 significant file(s) lose their only recent owner: libs/talon/deepagents_talon/cron/scheduler.py, libs/talon/deepagents_talon/timezones.py, libs/talon/deepagents_talon/clock.py. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"00ceaeae1c8e0335a8f50c0e663337a551625960767f3f43accf6642995ae8d6"}},{"ruleId":"D16","level":"note","message":{"text":"Further sole-owners (lower concentration): 3 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 (126 single-owned of 370 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; 370 of the 465 production source files in this repository met that bar). They are anonymized user #5 (2 file(s)), anonymized user #6 (1 file(s)), anonymized user #7 (1 file(s)) \u2014 spread or document their files in the same way, at lower priority than the named off-boarding risks above. The files folded here: libs/evals/deepagents_clbench/system/system.py, libs/evals/deepagents_evals/tau3_subset.py, libs/partners/quickjs/langchain_quickjs/_snapshot.py, libs/partners/daytona/langchain_daytona/sandbox.py."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6eac528f2429e724e1a97ed868f79eefbcf1888dab4af9a9e673429369bb5b2f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: ## [TODO: Replace with the first main section based on chosen structure] \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"4dff398c6871f6121024d3fcda373d863950e7a1032e172cd023b861ae15f11f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: ## [TODO: Replace with the first main section based on chosen structure] \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/examples/skills/skill-creator/scripts/init_skill.py"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea1d63ec805ac0ac3f412c18eb727da4330f9b056b59e1ed18c155f7abf7bdb1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Add actual script logic here \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad44ef68aa1e91b8be0f1661f193d0be15cbabe8055e6cd1481944a7a8f037ca"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Add actual script logic here \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/examples/skills/skill-creator/scripts/init_skill.py"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"8734245a675636cce0b8162d2529336042461c3925908add12fdcd98f34588c8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # Search for 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":"libs/deepagents/tests/unit_tests/backends/test_local_shell_backend.py"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6fa29fa7bb7eeb956b8abe63a86146e5937982d9068d0456b98ce127cc28321"}},{"ruleId":"D20","level":"note","message":{"text":"No ADRs found: No ADRs found. No recognised ADR directory (\u0060docs/adr/\u0060, \u0060docs/decisions/\u0060, \u0060adr/\u0060, \u0060docs/rfcs/\u0060, an \u0060ADR0001/\u0060 folder, or their siblings) exists anywhere in this tree. What was searched, so you can tell an empty log from a search that missed one: every directory under the tree (build output, dependencies and VCS metadata excepted), for a document that is either any non-index page inside a recognised ADR directory, whatever its name and however deeply nested (\u0060docs/adr/use-postgres.md\u0060, \u0060docs/adr/2024/0001-x.md\u0060); or a file anywhere whose name is ADR-shaped (\u00600001-use-postgres.md\u0060, \u0060adr-012-caching.md\u0060); or, when neither turned anything up, a document carrying the decision-record signature (an \u0022Architecture Decision Record\u0022 heading, or Status / Context / Decision / Consequences as section headings). A decision log that clears none of these \u2014 unnumbered files outside any recognised directory, without those headings \u2014 is not seen by this check and this row is then wrong. If that is your case, say so rather than renaming anything; otherwise, consider recording architectural decisions in \u0060docs/adr/\u0060."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d2bea044ff79d7d275f5a91a6e2f548586178eaf480274c33960ad020c854631"}},{"ruleId":"D22","level":"warning","message":{"text":"Inconsistent session lifecycle naming and parameter structure. \u0060new_session\u0060 creates a session and returns a response, while \u0060load_session\u0060 retrieves an existing one. However, \u0060load_session\u0060 requires the \u0060session_id\u0060 as an explicit argument, whereas \u0060new_session\u0060 does not return the ID in its signature (implied in response). More critically, the naming convention \u0060new_\u0060 vs \u0060load_\u0060 is inconsistent with standard CRUD patterns (e.g., \u0060create\u0060/\u0060get\u0060 or \u0060init\u0060/\u0060restore\u0060). Additionally, \u0060new_session\u0060 accepts \u0060mcp_servers\u0060 as a parameter to configure the new session, but \u0060load_session\u0060 also accepts \u0060mcp_servers\u0060, implying that loading a session might override or merge MCP configurations, which is a subtle behavioral inconsistency not reflected in the naming.: Unify session management under a consistent lifecycle pattern. Consider renaming \u0060new_session\u0060 to \u0060create_session\u0060 and \u0060load_session\u0060 to \u0060restore_session\u0060 or \u0060get_session\u0060. Ensure that if \u0060mcp_servers\u0060 is a configuration parameter for creation, it should be clearly documented whether it applies to restoration (likely it should be ignored or merged explicitly). Alternatively, use a single \u0060manage_session\u0060 operation with an action enum. (signatures: libs.acp.deepagents_acp.server.AgentServerACP.new_session(self, cwd: str, ...) | libs.acp.deepagents_acp.server.AgentServerACP.load_session(self, cwd: str, session_id: str, ...))"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"5402380d2dbf033bcc41b0f73220f4f2d7e6a3788a30e559b1935180c3417988"}},{"ruleId":"D22","level":"warning","message":{"text":"Duplicate intent with inconsistent return types and naming. \u0060read_git_branch_from_filesystem\u0060 and \u0060read_git_branch_via_subprocess\u0060 perform the same logical operation (reading the current git branch) but use different mechanisms. The naming \u0060from_filesystem\u0060 vs \u0060via_subprocess\u0060 exposes implementation details rather than intent. Furthermore, their return types differ: the filesystem version returns \u0060str | None\u0060 (allowing for \u0027no branch\u0027 state), while the subprocess version returns \u0060str\u0060 (likely raising an exception or returning a default on failure). This inconsistency forces callers to handle different error states for the same logical outcome.: Abstract these into a single public method, e.g., \u0060get_current_branch(path: str | Path) -\u003E str | None\u0060, which internally chooses the best strategy (filesystem first, then subprocess) and handles errors consistently. Expose only the unified interface. (signatures: libs.code.deepagents_code._git.read_git_branch_from_filesystem(path: str | Path): str | None | libs.code.deepagents_code._git.read_git_branch_via_subprocess(path: str | Path): str)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"69336b144f36bfd74e852651894c33b19d947f8dc8534ee3191ec48f126fc411"}},{"ruleId":"D22","level":"warning","message":{"text":"Same inconsistency as branch reading. Duplicate intent with implementation-specific naming (\u0060from_filesystem\u0060 vs \u0060via_subprocess\u0060) and inconsistent return types (\u0060str | None\u0060 vs \u0060str\u0060). This pattern repeats for \u0060read_git_remote_url\u0060 as well.: Unify into \u0060get_current_commit_sha(path: str | Path) -\u003E str | None\u0060 and \u0060get_remote_url(path: str | Path) -\u003E str | None\u0060, hiding the implementation strategy from the public API. (signatures: libs.code.deepagents_code._git.read_git_commit_sha_from_filesystem(path: str | Path): str | None | libs.code.deepagents_code._git.read_git_commit_sha_via_subprocess(path: str | Path): str)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4a37a8c872c2fb9757ac464f919b798531341cc034c8cf633ba7a3d78261d8e6"}},{"ruleId":"D26","level":"note","message":{"text":"Projects may be oversized for their cohesion: 3 of 12 project(s) overshoot their size bounds, lowering Project Cohesion to 5.0/10. The most over is \u0060libs/code\u0060 (187997 LoC, 1045 module-visible types across 24 directories). Review these for cohesion \u2014 draw the boundary inside the module first (group each responsibility into its own package or directory and keep the cross-boundary members non-public), since splitting a published package moves types between packages and breaks consumers."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d5a94650dc74886a0f1f08eb9fb6775f1fc395279ef7e901c970c9d26f767a72"}},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d5b8f11381d61a58459ffc7c595fd52d09c03c711894a63a9578043d2338412b"},"taxa":[{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A08:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3bbc237beffae1e41ba0e31360bf6b1102a86a2d1c2cda51e94b5c1752805002"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A01:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"fc1753a4974b6a8782d65acfeb645f6d12cc075d45b0b1feb436c94447279ddf"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A01:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"482e3b19efd040fb2215efbc5e65f5b9996234817368c5a9198eb89910e46231"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2d3172a6bef6a95e53d7deb8d756aaff293df50193f6be633cee695772e8475f"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A01:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7e8b156e5630c8defe13d9a8d179709a69098e18fe651419a86f8e08452a79d3"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A01:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b3711fb06cf5378ab4d0c7ee3edc3a9defff1eeea86abca7da447956ef4108b8"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A01:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7761ae968398e7b8590ffdf5898a88fc9ba38f3f2ff07a267b1044aaf9df0ee3"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A01:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2d59d93eff742793e49a8ba684b380faeff2b7b4661583f7f68b4c48d7346da2"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A01:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"879d7bfdf50d8e31ac38e1472c22ded8c84bd1277f6ac88e7ad85206e1c1da0e"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A01:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b13e7d745d18d668484fe071bba7a74eb2d21bf6f1e2b1726f4264c2b9887987"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A01:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"997b3c736f142ee7ba0033e5a24b9bce2b600c34b8bd9c5f522d003d30e9e552"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A01:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2a9f172ed206d9a67f2a1a3eedccfb5be757c68e222b8ca4238fd61d8c431c6b"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A01:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"28f221595d2588d570217c1f76f17da9d6db7a860f7d2666ee528653b069dbfc"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A01:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d12ee6860baee9a7c35c8a7a39e48f99601dd3a10ae503421ba99dbdc774445f"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A01:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8da8ed8f4a04a94b55733c9dbc631fba29d5b9ca6fc3250fe1a1444f02a54398"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A01:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"834b2484476e7283b369681204960f3695cbb2d3f2713b8006d890221c10d094"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A01:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f16e0306c99cff9af3a6450032c64a3863c5cc19002753203808d39140496021"},"taxa":[{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8b9c830ed113b615d20922c10e108b2896ff619e902f6a0af7a10bb8bfc05e55"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f1b966c70d2e5f6ab697ac6d268d54938c60e802d8ea58ea6ff9cb7e10a35f70"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1d1ef58699950ed9b62b44686e0a22df52de2af03347f4c2d2962e4be1e16f14"},"taxa":[{"id":"CWE-77","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-4","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"858e7774019317ed7b21227441ef9a4cd39c48fbd037aa27590e181643b0c496"},"taxa":[{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"baf820cb96860a0cf55c98fa5eb663b20a3f1c93932ecb4c5e89f152bb919d2c"},"taxa":[{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c9f6adcb05fad186a398916ff147eab103acd9bbdcf140c571c89b10637103f8"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A01:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5da74ae28a340be2f1f153cebb30e3f83c4756de524198068757ed880a21354f"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e58f41c4eb1de4d9eede32f1f3de3fa9442d475a90864f5d8d491d118feef055"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3af5238b0728be56b9df4c7d5c6df42f82616773e617f0bc8df66136a53369fa"},"taxa":[{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A08:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1ede6ebb463da6f1439ff53c0e548a7bd28e0d47ce09285bc3d4724cf496dd0b"},"taxa":[{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A08:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"25a88f3ddb2f645aeb024d7bdd11ed82c06ecea54b95c9373339e6d2af9ce15a"},"taxa":[{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A08:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ce9eaef3e276514403766dd32d46c69e0d672021af4c9699851111951790e55b"},"taxa":[{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A08:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"87ab72115d0271ebabe9f021a12c61127286722317205f37dd5b06fd52f46cdd"},"taxa":[{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A08:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"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":"caf8f8fe047afcb43573807dcdf976e4dba5d90e94fc4415a04a4d467d1ad813"},"taxa":[{"id":"CWE-611","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A02:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"377eb2a59e373721b01c3e25dff90336fa570de6bd38d6aecc54889084f03d70"},"taxa":[{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"218d03145f23c79c4a7a1d930ea90b3f337eb52243c14474040be415ef59d8f5"},"taxa":[{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d7fbb9ca052692469ece555f1e99c7c97788c09e1bf634ac682af581ba7395db"},"taxa":[{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e769aac6f038a2b5790672cc26ec496cc0a74c5971049e094431b6ecfef4f8b6"},"taxa":[{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"20e96398e7d0b3dc9739053c20ab3409af5fcf58f3f7413131cc5525ec8d9167"},"taxa":[{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"03288dfcdda44db8259af9b9d4df4c129ae19a4a7c29880205983acb7ec77f48"},"taxa":[{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c134b9d30ded8b926939574af55b5fb0783243be04c9d2e6dca90767fc0782c3"},"taxa":[{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"210d5d9b7c8531b02378043ec4333d72b3c8c9ec3c73388d37bd351b5691b42c"},"taxa":[{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0042819e18fc380573c8f20580881e9fcb66604c2c8f886482f4038261415e6d"},"taxa":[{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"94823c93befc15c6b3c373135a304604d57b3bfabe275865fb174af6dc6e2a20"},"taxa":[{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3bf77345b4147eb9cb5434ffda1b91985c9dad186b408d6e5447ed3f54dec285"},"taxa":[{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"59df39b085313886ea056d03ca6c75ff7310525eb2b64247c018d24fa0ca4967"},"taxa":[{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"50ee1409fa22a0f647b1564a531b2d2c23d77db167257a05c1f6567e6bc46305"},"taxa":[{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4aee313d75903fe916eed50bd67ffc60ca28081518b49ed2e37a18d126069909"},"taxa":[{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1c0aad3964ac4d0511828527a47972a0e859b544b63c22d3ef00ddbdd6d0ae68"},"taxa":[{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"139335d320de9f682ef9eb4868280a8feced1f1d17d8886834267b061580a116"},"taxa":[{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e5b553538c8a0f1c4084b910c88c579a8cc3ddfe4f61205a90f203fb33692ed5"},"taxa":[{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f8bd16141fc16ab1e38a9db2dd47dfd82e3d2bc9566f13874d4dd10b04b798c6"},"taxa":[{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"2b60a8d57a87d851c1e352ccf5295f5f0a90b3f73874e08d67e32e660fb1790b"},"taxa":[{"id":"CWE-939","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":"87d0ec3fcb86fff9352d3ebb6dee0cdf69aecb46e19f346c1af26bc11145e148"},"taxa":[{"id":"CWE-939","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":"5e49450f6b249ce2462094a572854d48206245c8c5994f7d9b3863f043e27831"},"taxa":[{"id":"CWE-939","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":"a63e47b5e7c835eeb5cd936383c6d2d7b24c49796a322afcb59568f9cf7aec70"},"taxa":[{"id":"CWE-939","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":"68fcd80136d1dc2eb3b89feb20db8fc904df9c7b1c80166dc9283bed14182943"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"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":"93506902a785bc3a53c26bfaf64a34cd55c087adac99103b688b1b627c04cd63"},"taxa":[{"id":"CWE-939","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":"6dcb19b11c4bc9bafecd588c926d7d7dc4317a1a3e9ef6dd142f5241abf5a55a"},"taxa":[{"id":"CWE-939","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":"ccd104eb57e71265854c8e9dfc6caf706614b3a8129e9250a81e06106e6c1434"},"taxa":[{"id":"CWE-939","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":"79ad90715c5dd6d86ce3406b6dd1f88cb699ba7fa99e415e110559408afabd0b"},"taxa":[{"id":"CWE-939","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":"156147ee9bc99dff25b5132b07697a29fc08024d0b8add8c9f2f4d2dabab97c9"},"taxa":[{"id":"CWE-939","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":"6e30808b13e5d0b77a51ee8e7bae4d46df4ffb5e33d0ec8454e07453cb44fbd6"},"taxa":[{"id":"CWE-939","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":"4e3203ea5061f471c059035aadcb18ae19076de33edd26dbad124528afd9c2d4"},"taxa":[{"id":"CWE-939","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9f95f2b39eb96edc37fb176fd0130ab91b5f58e077056e5d895564c7729afb69"},"properties":{"dependency":{"package":"nltk","version":"3.10.3","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","PYSEC-2026-3740"],"reachability":{"kind":"test-or-tooling","file":"libs/evals/tests/evals/memory_agent_bench/data_utils.py","line":118}}}},{"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":"161966ca922f9544cb483348164e655342b929622962a66da31fdd277a4ae1ee"},"properties":{"dependency":{"package":"aiohttp","version":"3.14.3","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"production","file":"libs/evals/deepagents_harbor/langsmith.py","line":27}}}},{"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":"bc031478379d040c60e6ed49f613f28d8be9c6361ad0e7598a7f5b7ae08f7451"}},{"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":"276bd71b78e63cc19bf0d963d2c0636426e1bb371649b073a1e211f5f85b9ca1"}},{"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":"86c0a018d1d600ed0a4973f0e319e047e215a58bc2b48bdc7d165b412467457f"}},{"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":"d373f87712afc6e2dd0e9207bd17cdd7233fe5a819caf79caf6e0336a8c0a188"}},{"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":"dd5e354feb0e37f1bad70f25f1df5a03589a232e629b3a76ac99a4d86ec58523"}},{"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":"7cbf43c98a0e4adf17c5ea3f670e6aa20743d5fb2a332b65d8c0cf2e8e01cd3a"}},{"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":"00797e4bba4e7e4dd230bfe79f33121920c64a2f3746268505bdd2b7538a8004"}},{"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":"7858a16651a66ad4b12c848cc997d08de106e26db184df52b3381b338c9ad9d5"}},{"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":"ae072c72ab6fa62147a5440fd9e7f033ed02cb02b930035ac685688aac334d67"}},{"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":"35ba8ce4fac0ae94ff02c983ae2b2ef964a838905445678f38183dafabe34398"}},{"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":"29eef7a57055d41ae173d5d3205efb7a66657e2325c9e1e38da6c43d6cce7fb4"}},{"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":"2cdf993a022b574d3b9bdd45f81332ea94713b8ae7dc92e7134cd94f37c4eafa"}},{"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":"86147cee92ca0b70d38a2fe1d22df6241aaa16b8da1969fd8076a4d113c62e0b"}},{"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":"cf97377f9db2b7ca52fde9ec03de4bf02021ad2befff6e2ada2a8705d1aa817e"}},{"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":"3df637e60add224f9c2f5911a8c2eb737c14fa7b63f01e971b9db4f592ba8c1d"}},{"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":"794bab5b07e8c41bbf7727a0a89193698ee980686572c3cc9cb2983c831f846c"}},{"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":"9aba33540307b21f9c051f38e0a1839b59bb34bc0c7308e7503ada93c56d5e00"}},{"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":"415f9dac952206979a7a9df93bb87a1163730d0096178f46e13f5aaf0401e2a3"}},{"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":"bdb94bf41f5330ae11e2477339b8d329d7e808b97aa879da34c8b9dde12f556a"}},{"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":"3809f749981f5edfc6d228b4e251e0ad2f7124da3608e33bcc7c304558d30c61"}},{"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":"81b0f851f4201c8976deeaf6adef42c07b2369f6fe18d349eec7a71559f60111"}},{"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":"74f0102604e8549647135adc840a1d90c023ada03613e9a01aa7a1d1ae8df499"}},{"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":"08476bd1e4794bb332f6bd61e8ea5a94c3f306d960597c42a282bba6e935da87"}},{"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":"7811c8158da98bdbb010c7eba1720185a0b4e150a7797d2e5a31dcb201c76c80"}},{"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":"e849062a767573af2220a9991be724a81b56d01433503c4fce4f223e6c082fad"}},{"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":"53b405727886c6e9b02876c5671b0260d2c495c741f5258140ef442c945b025a"}},{"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":"c00411c9eb38f1e353a83dba05e8f81eb2a84b034656f66f950aabef9048714d"}},{"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":"4271e44c8ad6df06fd2a75027ac3e0126dc68bba1546598b66bb42a2940ded05"}},{"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":"83cd08559d66a049fede657ad58a90ae4431826a44e3a6d5783b6ea44479e3fd"}},{"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":"c0c7d296c0551b8807b7a7a241a1bf4642f0e165687d79e79a154a4f98c50ca4"}},{"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":"dd1712f3c3b7c3b1d3cac8dc8d2ab43f38e6ccd9a3328a647c52d014e3c729e2"}},{"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":"715ea034c666afec565106d66368666172cf503d9ab36be831abace0c8526200"}},{"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":"8a7c446e4eb24cccf9d85b4926ae388703ddb74797314b2c0f85dac51039654b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"70f25037883628bca5b6eeb2efed7a441da1ddedf6ce1e14e1078c97b8f46279"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"0ab7d0b3f9ecbd151d0cf026de4973fda959f20e65d337583f41820008e9e3b9"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"707a24b63a502a2c7354c5b2575490656b89320603d43406e5bf6464e98d891d"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"153ff98213dd4d504e0cf9692da4a64cdf197bbfc8735e38e9c642fae2520a7e"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"8e7cefc537575c11ac205ec7f9fa9de828132c0f73c3b19c54aedd9e8365c0b7"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"f7154c93fd0b4e9db4cea06036b83e06131000f92c4ae11cc33c1f7fef7b8b55"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"b9cdd2af0f4b2328293fe12b55df54c23925da7d19acd0ebc1125ccd36d82f52"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"a36487bec3a517a27baadc47b220d051cc413ec31ff6d60549b5515a0538d9d8"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"f409dc962c0eeaabdb8dedf4687de85b7023a059361bb5e3e10de18c8f72568b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"2cc17f0dd2ee72a45f993278c5ae2ac38535545268c80ddbf218e41646f05e74"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"13c1a246d183f3b142b8f2878497a12fe09c6235e8f6e9d56346698ac3949d18"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"e2f8dfb8a16f0089f7d2db65bb25122720f490b771a03587354a64b8b14faed8"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"2ed98da2e4ebf5526c142eb142beaa4d00e793d6258414c654d97d0364120674"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"3f6aa32a0364d0990f45a1fa128c5f0a2ae42fe9c4bffb365a3595741248fd35"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"ef9d6a45e762fc8fadde288daaec158a07cc57c209e7e7c640b6482208368ac8"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"770e20a6def820e3eaa01caa478197d9ec8f643e58a00c66fbc6fa1a2764033c"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"8ab8260e3d32c7feedc739a9190b256b432e03294e7348a52a110dc40d45d91a"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"ac45ffba11cf3dbf9f57589b7369b29dd4fa8e4b7f0d14c9d29fca0c82fa3841"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"07ad9a66cc672838b619270a206af8f5c280d4f11b02d63e5c677de8e168a701"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"f909a0a9c95597f1295b90266d296fd547d76d7fc4610ba9c9412d0d9715eca0"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"31549fadca85955b2e9fb6987262ad791cb90e8b81c4cb47e0447702aa049ec7"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"525748c30c5c418e4c774041c218df60e3f662be2ed5828a9e7e08bf64c6416a"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"daea2df1720b2a91eb057af1f6320a986dd9b6966908360bd029d8b24b92ba26"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"073bcbb01ed9492e1b0831dc8b33b838235a54231ffcb75c832d8e78cf1baa76"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"3313890863ce50a811fff8df4af5e721d5b5eb464b49ccb8570c143454c95756"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"188038554c8ae7a7f7af60fc1b42cf88aca9b96e36b3bfd738772838435577ee"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"932e56cb45ce3d1a1b80484ec3c6baaf2f6cc7ff8e9d8cbf8293cecb850099d6"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"851590baf90e5bcb5d1c8177531bd820fbe42d4fa1715603454f7bd608442b30"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"8f5bdf162cb32a2551180934949fe1771c8f3ad4696df82ebe82ca35c25ca899"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"00ad4bc56f876b1356a1179d65ae5811403a2ee430c2dbf1af7d14e1698ccf71"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"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":"30c7ce5d26428524f99166295868354bf632d991f81ff28cceeb7a48bf2355aa"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D34","level":"note","message":{"text":"Orphaned files with no living knowledge: 2 of 370 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; 370 of the 465 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: libs/partners/vercel/langchain_vercel_sandbox/sandbox.py, libs/partners/runloop/langchain_runloop/provider.py. Attach the read to the next change that touches one of them: have a second person review that change, and leave behind a short comment or test recording what the file is for, so the knowledge comes back at the cost of a change you were making anyway."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ce861fd78f6935114d3a342cb90ad25870f984e1042954fcbbe27c0e23be3658"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/partners/vercel/langchain_vercel_sandbox/sandbox.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bc6cc6e2c5d32519e4114c69bfc870699c904db646012582581ffdea9163033"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/partners/runloop/langchain_runloop/provider.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6144fcbfe6bac0d5cd48a7c7ca249705b9d8659d8c9d3feb4aa4fa454a0bb16"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: _server_config.py \u2194 ui.py: \u0060libs/code/deepagents_code/_server_config.py\u0060 and \u0060libs/code/deepagents_code/ui.py\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 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 \u00604f34c51d\u0060 feat(code): add \u0060/summarization-model\u0060 (#5884); \u00604379a463\u0060 fix(code): defer the recursion limit to the LangGraph server (#5882); \u006094962a5f\u0060 feat(code): raise agent recursion limit to 2000 and make it configura\u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/_server_config.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc71244b165a7b0f76c3563cf9ceca52e2087cd99803b8e76b040a9bf8f85ddb"}},{"ruleId":"D36","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"eb00976a698a5d68999b7ee6d27206fd374e916853e7ff1ead5eed42386f043f"},"taxa":[{"id":"CICD-SEC-9","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d657599f6f99da1927d3377533dfc0888b34c4d84aa7d5579841fd72d0e39bce"},"taxa":[{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D36","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4f1e7684f8281bd255ddef97105c7055c2ebae06964c8745716b83e174debe83"}},{"ruleId":"M2","level":"note","message":{"text":"No ADRs: No Architecture Decision Records found \u2014 no conventional ADR directory, no numbered \u0060NNNN-title\u0060 documents in any markup this check reads, and nothing ADR-shaped by content. Design rationale recorded elsewhere (a design-notes tree, a mailing list, pull-request discussion) is not visible to this check and is not re-findable per decision, so a future maintainer cannot ask why one choice was made and get an answer."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"670b3d6e36a756d63097d0dfbf90afd5fc761308800b9354894a07c3f4e4aa14"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: libs/acp/README.md changes into \u0060deepagents/libs/acp\u0060, but no such folder exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/acp/README.md"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1008e119e14ce60a435716b96a9f4547042b02172df8904fe7c68c0def2793d"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: libs/talon/README.md names \u0060cron/jobs.json\u0060, but no file or folder \u0060cron/jobs.json\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/README.md"},"region":{"startLine":844}}}],"partialFingerprints":{"codehealthFindingId/v1":"09a829ad1c6772f72653757fe12074813d69daaf0e15225a1535fec482bd1894"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: libs/evals/datasets/context-retrieval-evals/README.md names \u0060tests/judge.py\u0060, but no file or folder \u0060tests/judge.py\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/evals/datasets/context-retrieval-evals/README.md"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c330f296fda6187877e953f0afbe253e58a1ec74d995f0b51c0562664475a40"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: libs/evals/datasets/context-retrieval-evals/README.md names \u0060environment/files/\u0060, but no file or folder \u0060environment/files\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/evals/datasets/context-retrieval-evals/README.md"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"244ab0d78066225cbe8805f4b8a0db0aa84c205005f273c3986f93b8dcc3eef3"}},{"ruleId":"P2","level":"note","message":{"text":"Logging is not universal: Only 7/9 runnable modules use logging (modules with no entry point or server are excluded \u2014 they are libraries a runnable module hosts). Silent: \u0060libs/acp\u0060, \u0060libs/talon/deepagents_talon/channels/whatsapp_bridge\u0060."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"91a94e21d6d4d0e6a2003f94505b0b02b157176f0b24c4820f3f82b4447a97fe"}},{"ruleId":"P3","level":"note","message":{"text":"No SAST: No static application security testing detected. For this repository\u0027s stack, add bandit, \u0060semgrep --config=p/python\u0060, or CodeQL\u0027s python pack as a CI step. What was searched, so you can tell an absence from a miss: the 935415 CI workflow file(s) in this repository, and the scanner and linter configuration checked in beside them. A scan that runs outside CI, one configured in your forge\u0027s web UI rather than in a committed file, or a tool whose name is none of those this check carries, is not seen \u2014 if that is your case the row is wrong, and saying so is more useful than adding a second scanner."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6e54424179c892f03ef2fd003130ac4bd43f39bbf3b1ca0a0143e25acb80ec87"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060fs.writeFileSync\u0060 in \u0060downloadMessageMedia\u0060 blocks the event loop until it finishes \u2014 a blocking call inside async code stalls the event loop \u2014 every other request waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/channels/whatsapp_bridge/bridge.js"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"549e5781c7d15f02c049ab7a80181a4bc92eeb918e4dc8d753a60830690d0446"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060widString(message.from) || widString(data.from)\u0060 appears character-identically in 2 files \u2014 libs/talon/deepagents_talon/channels/whatsapp_bridge/bridge.js, libs/talon/deepagents_talon/channels/whatsapp_bridge/id_compat.js. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/channels/whatsapp_bridge/bridge.js"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"963ef3f979d8efbd0dbbf306eae911a198b3911e404286e4ed326aace86debc8"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060widString(message.to) || widString(data.to)\u0060 appears character-identically in 2 files \u2014 libs/talon/deepagents_talon/channels/whatsapp_bridge/bridge.js, libs/talon/deepagents_talon/channels/whatsapp_bridge/id_compat.js. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/channels/whatsapp_bridge/bridge.js"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a3e41be275af709c77c60cf78fb1f14347eb81c81c64524299c772d5c96fecc"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060active is not None and not active.done()\u0060 appears character-identically in 3 files \u2014 libs/code/deepagents_code/app.py, libs/code/deepagents_code/configuration/providers.py, libs/talon/deepagents_talon/host.py. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":29414}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8e8c57d53f2afc0ed0fa67cbebc4b4ade1700ac428459c3fa57e96841833a40"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060cached is not None and cached[0] == cache_key\u0060 appears character-identically in 2 files \u2014 libs/code/deepagents_code/model_config.py, libs/code/deepagents_code/offload_middleware.py. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":1554}}}],"partialFingerprints":{"codehealthFindingId/v1":"02e1d59de84fe060a3636ba2d3bf91b2ad954234712651c3f47a0002b7567f03"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060config.history_uri or config.checkpoint_path.as_uri()\u0060 appears character-identically in 2 files \u2014 libs/talon/deepagents_talon/history_backends.py, libs/talon/deepagents_talon/history_vector_backends.py. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/history_backends.py"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"01f28eaa5f8c79f786edb66e7800103ace196f3dddcd6983223572ef5154e479"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060context.project_root or context.user_cwd\u0060 appears character-identically in 2 files \u2014 libs/code/deepagents_code/hooks/trust.py, libs/code/deepagents_code/main.py. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/hooks/trust.py"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"90da0430083759b1f7c8171b2b3912520b33a55c8781f436d5775ae0ce12ff80"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060current is not None and current.cells == max_height\u0060 appears character-identically in 2 files \u2014 libs/code/deepagents_code/tui/widgets/launch_init.py, libs/code/deepagents_code/tui/widgets/model_selector.py. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/launch_init.py"},"region":{"startLine":567}}}],"partialFingerprints":{"codehealthFindingId/v1":"87fa54e1f6d85d62e3a754cb3d75cda34a5b00a579718293f3887cd117bcf669"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060current.__cause__ or current.__context__\u0060 appears character-identically in 2 files \u2014 libs/code/deepagents_code/mcp_auth.py, libs/code/deepagents_code/model_retry.py. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/mcp_auth.py"},"region":{"startLine":2057}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab3affc1f2e9b85a71c875879ec598baf5467fc6f4710ad6bfab864f44d25007"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060decision.stop_reason or \u0022Permission stopped by hook\u0022\u0060 appears character-identically in 2 files \u2014 libs/code/deepagents_code/hooks/client_lifecycle.py, libs/code/deepagents_code/hooks/permissions.py. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/hooks/client_lifecycle.py"},"region":{"startLine":315}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b5787d3514d66618ea40bff8684ec48fda9054474f23b239e1dd4f9d0e73b70"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060enabled is not None and not isinstance(enabled, bool)\u0060 appears character-identically in 2 files \u2014 libs/code/deepagents_code/model_config.py, libs/deepagents/deepagents/profiles/harness/harness_profiles.py. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":3621}}}],"partialFingerprints":{"codehealthFindingId/v1":"8898eabdd58ae077ff2fc9ec1246085bf1be2ae1d7014d64978c1b9cde94ab6b"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060event.key == \u0022backspace\u0022 and self._delete_placeholder_token(backwards=True)\u0060 appears character-identically in 2 files \u2014 libs/code/deepagents_code/tui/widgets/_inline_prompt.py, libs/code/deepagents_code/tui/widgets/chat_input.py. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/_inline_prompt.py"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"35de3bdc69e106f1ae5047e1ac7a036dc6df796b08f56754d50cdc807dfe7450"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060expected is not None and expected \u003E max_bytes\u0060 appears character-identically in 3 files \u2014 libs/talon/deepagents_talon/channels/discord.py, libs/talon/deepagents_talon/channels/slack.py, libs/talon/deepagents_talon/channels/telegram.py. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/channels/discord.py"},"region":{"startLine":1642}}}],"partialFingerprints":{"codehealthFindingId/v1":"85e0ab65b88f8b997ba3547e1d04dbee36e04890300ef0e64ecd7d2d4f8819ee"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060future is not None and not future.done()\u0060 appears character-identically in 2 files \u2014 libs/code/deepagents_code/app.py, libs/code/deepagents_code/tui/widgets/mcp_login.py. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":11632}}}],"partialFingerprints":{"codehealthFindingId/v1":"313283e4667efa3ad42c58917ebbc7f9579ac371d7454122f51e2536e5812501"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060generation and re.fullmatch(r\u0022[a-f0-9]{64}\u0022, generation) is None\u0060 appears character-identically in 2 files \u2014 libs/talon/deepagents_talon/config.py, libs/talon/deepagents_talon/history_vector_backends.py. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/config.py"},"region":{"startLine":249}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bd912a62c4c89026a72d93a8d2f70616066c5f92e2fb3f1a166c14c01431287"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060getattr(tool, \u0022func\u0022, None) or getattr(tool, \u0022coroutine\u0022, None)\u0060 appears character-identically in 2 files \u2014 libs/partners/quickjs/langchain_quickjs/_prompt.py, libs/partners/quickjs/langchain_quickjs/_repl.py. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/partners/quickjs/langchain_quickjs/_prompt.py"},"region":{"startLine":502}}}],"partialFingerprints":{"codehealthFindingId/v1":"31a232b7fde3cf332b230c872f6c080ff7294b5dfdaa62b884f7ec6b8275a14c"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060headers is not None and not isinstance(headers, dict)\u0060 appears character-identically in 2 files \u2014 libs/code/deepagents_code/config.py, libs/code/deepagents_code/mcp_tools.py. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/config.py"},"region":{"startLine":6011}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fb9df4a4bea1b91f9fec9cd375d3d9dffce4b60762b968e829b3e6cc67b1e45"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060host == \u0022slack.com\u0022 or host.endswith(\u0022.slack.com\u0022)\u0060 appears character-identically in 4 files \u2014 libs/code/deepagents_code/mcp_config.py, libs/code/deepagents_code/mcp_providers/slack.py, libs/talon/deepagents_talon/channels/slack.py, libs/talon/deepagents_talon/mcp_auth.py. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/mcp_config.py"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef89a211d724bf495b0bcff162bfe75529afab6c9c21bcd817fcf95b47dc2dfe"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060isinstance(block, dict) and block.get(\u0022type\u0022) == \u0022text\u0022\u0060 appears character-identically in 2 files \u2014 libs/code/deepagents_code/_testing_models.py, libs/deepagents/deepagents/profiles/harness/_nvidia_nemotron_3_ultra.py. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/_testing_models.py"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f39aaee62d9639516341a7359ebd5e0bcb74d703ae3e75e5df589be5551b44a"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060isinstance(channel, str) and isinstance(chat, str)\u0060 appears character-identically in 2 files \u2014 libs/talon/deepagents_talon/archive_saver.py, libs/talon/deepagents_talon/runtime.py. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/archive_saver.py"},"region":{"startLine":315}}}],"partialFingerprints":{"codehealthFindingId/v1":"76b3aad5c25d538c7e07fcdbf744e768ba11058968217ee495216a12b05b100e"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060isinstance(data, dict) and data.get(\u0022type\u0022) == \u0022model_attempt\u0022\u0060 appears character-identically in 2 files \u2014 libs/code/deepagents_code/client/non_interactive.py, libs/code/deepagents_code/tui/textual_adapter.py. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/client/non_interactive.py"},"region":{"startLine":1617}}}],"partialFingerprints":{"codehealthFindingId/v1":"b08077cd61a59a571501c1f7690aad71f855774240352ab12cf5627fdcfb2eee"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060isinstance(data, dict) and data.get(\u0022type\u0022) == \u0022model_retry\u0022\u0060 appears character-identically in 2 files \u2014 libs/code/deepagents_code/client/non_interactive.py, libs/code/deepagents_code/tui/textual_adapter.py. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/client/non_interactive.py"},"region":{"startLine":1621}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebe3ba3940f0344470021b68868a8e9b2d76b8051903f477e148c32204846c49"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060isinstance(k, str) and isinstance(v, str)\u0060 appears character-identically in 2 files \u2014 libs/code/deepagents_code/update_check.py, libs/deepagents/deepagents/middleware/_skill_tools.py. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/update_check.py"},"region":{"startLine":1190}}}],"partialFingerprints":{"codehealthFindingId/v1":"44fe6e92363dcdcf46b2246e8f06b503422c146f94e073aa884d4590043a42e1"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060isinstance(key, str) and isinstance(value, str)\u0060 appears character-identically in 3 files \u2014 libs/code/deepagents_code/auto_mode.py, libs/talon/deepagents_talon/mcp.py, libs/talon/deepagents_talon/mcp_config.py. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/auto_mode.py"},"region":{"startLine":4020}}}],"partialFingerprints":{"codehealthFindingId/v1":"bac8c7d1c6d755e603fd32d8d5e010bd2eaa07448f99795cee61449b9e3a5989"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060isinstance(message, AIMessage) and message.tool_calls\u0060 appears character-identically in 2 files \u2014 libs/code/deepagents_code/hooks/server_middleware.py, libs/talon/deepagents_talon/store_archive.py. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/hooks/server_middleware.py"},"region":{"startLine":1503}}}],"partialFingerprints":{"codehealthFindingId/v1":"a290e9237759ba9e4c3363f478dba888d80da800b86656a1a8f40a18c0ebb023"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060isinstance(raw, int) and not isinstance(raw, bool) and raw \u003E= 0\u0060 appears character-identically in 2 files \u2014 libs/code/deepagents_code/config.py, libs/code/deepagents_code/configuration/providers.py. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/config.py"},"region":{"startLine":3010}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2f859e0c48e64774e31c0497a505a2acde213da1aaad6a8b43f4b9f7058ccdc"}},{"ruleId":"X17","level":"warning","message":{"text":"Recursive walk over a caller-supplied document has no depth cap: \u0060iter_string_values\u0060 is public and takes \u0060data: dict[str, Any]\u0060 from its caller, and it calls itself at line 537 (\u0060iter_string_values\u0060) with a piece of \u0060data\u0060 \u2014 and nowhere in \u0060iter_string_values\u0060 is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the value it is handed, so the nesting of the caller\u0027s document \u2014 not this code \u2014 decides how deep the stack goes. Python\u0027s parsers accept far more nesting than its stack allows: \u0060json.loads\u0060 turns 3,000 bytes of brackets into 1,500 levels and \u0060xml.etree.ElementTree\u0060 parses tens of thousands, while a walk like this one raises \u0060RecursionError\u0060 once it passes the interpreter\u0027s default limit of 1,000 frames. Wherever that exception lands, the work fails: a request errors, and outside any \u0060try\u0060 the worker or the program exits with it. Raising \u0060sys.setrecursionlimit\u0060 only moves the number the document has to beat. Thread a depth argument through \u0060iter_string_values\u0060 and reject the value past a fixed maximum, or rewrite the descent with an explicit stack."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/unicode_security.py"},"region":{"startLine":537}}}],"partialFingerprints":{"codehealthFindingId/v1":"c995eadcbd18f3edd21b58371b18695b3c4662e693a3efbc8e4dc1fb1eb3283e"}},{"ruleId":"X17","level":"warning","message":{"text":"Recursive walk over a caller-supplied document has no depth cap: \u0060resolve_auto_classifier_timeout_with_source\u0060 is public and takes \u0060toml_data: dict[str, Any] | None\u0060 from its caller, and it calls itself at line 1598 (\u0060resolve_auto_classifier_timeout_with_source\u0060) with a piece of \u0060toml_data\u0060 \u2014 and nowhere in \u0060resolve_auto_classifier_timeout_with_source\u0060 is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the value it is handed, so the nesting of the caller\u0027s document \u2014 not this code \u2014 decides how deep the stack goes. Python\u0027s parsers accept far more nesting than its stack allows: \u0060json.loads\u0060 turns 3,000 bytes of brackets into 1,500 levels and \u0060xml.etree.ElementTree\u0060 parses tens of thousands, while a walk like this one raises \u0060RecursionError\u0060 once it passes the interpreter\u0027s default limit of 1,000 frames. Wherever that exception lands, the work fails: a request errors, and outside any \u0060try\u0060 the worker or the program exits with it. Raising \u0060sys.setrecursionlimit\u0060 only moves the number the document has to beat. Thread a depth argument through \u0060resolve_auto_classifier_timeout_with_source\u0060 and reject the value past a fixed maximum, or rewrite the descent with an explicit stack."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/config_manifest.py"},"region":{"startLine":1598}}}],"partialFingerprints":{"codehealthFindingId/v1":"f55da502b8d47f296a4dfcb2056f22e127406e6d09ed19b7b70fec6a244842ba"}},{"ruleId":"X17","level":"warning","message":{"text":"Recursive walk over a caller-supplied document has no depth cap: \u0060merge_toml_tables\u0060 is public, takes a document from its caller (line 1032) and hands it to \u0060_leaf_provenance\u0060, which calls itself at line 1238 (\u0060_leaf_provenance\u0060) with a piece of \u0060value\u0060 \u2014 and nowhere in \u0060_leaf_provenance\u0060 is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the value it is handed, so the nesting of the caller\u0027s document \u2014 not this code \u2014 decides how deep the stack goes. Python\u0027s parsers accept far more nesting than its stack allows: \u0060json.loads\u0060 turns 3,000 bytes of brackets into 1,500 levels and \u0060xml.etree.ElementTree\u0060 parses tens of thousands, while a walk like this one raises \u0060RecursionError\u0060 once it passes the interpreter\u0027s default limit of 1,000 frames. Wherever that exception lands, the work fails: a request errors, and outside any \u0060try\u0060 the worker or the program exits with it. Raising \u0060sys.setrecursionlimit\u0060 only moves the number the document has to beat. Thread a depth argument through \u0060_leaf_provenance\u0060 and reject the value past a fixed maximum, or rewrite the descent with an explicit stack."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/configuration/resolver.py"},"region":{"startLine":1238}}}],"partialFingerprints":{"codehealthFindingId/v1":"623a9138ca33bfbd4fd4eb6e2fc134b8d65e8fad43fa464394becf9536a466b8"}},{"ruleId":"X17","level":"warning","message":{"text":"Recursive walk over a caller-supplied document has no depth cap: \u0060redact_transcript_value\u0060 is public and takes \u0060value: object\u0060 from its caller, and it calls itself at line 614 (\u0060redact_transcript_value\u0060) with a piece of \u0060value\u0060 (and at line 620) \u2014 and nowhere in \u0060redact_transcript_value\u0060 is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the value it is handed, so the nesting of the caller\u0027s document \u2014 not this code \u2014 decides how deep the stack goes. Python\u0027s parsers accept far more nesting than its stack allows: \u0060json.loads\u0060 turns 3,000 bytes of brackets into 1,500 levels and \u0060xml.etree.ElementTree\u0060 parses tens of thousands, while a walk like this one raises \u0060RecursionError\u0060 once it passes the interpreter\u0027s default limit of 1,000 frames. Wherever that exception lands, the work fails: a request errors, and outside any \u0060try\u0060 the worker or the program exits with it. Raising \u0060sys.setrecursionlimit\u0060 only moves the number the document has to beat. Thread a depth argument through \u0060redact_transcript_value\u0060 and reject the value past a fixed maximum, or rewrite the descent with an explicit stack."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/hooks/transcript.py"},"region":{"startLine":614}}}],"partialFingerprints":{"codehealthFindingId/v1":"57c57e90890a04370c0f68129668ce69ef2bd05818a8dbb67afa1a548f0d47bc"}},{"ruleId":"X17","level":"warning","message":{"text":"Recursive walk over a caller-supplied document has no depth cap: \u0060substitute_json\u0060 is public and takes \u0060value: JsonValue\u0060 from its caller, and it calls itself at line 89 (\u0060substitute_json\u0060) with a piece of \u0060value\u0060 (and at line 99) \u2014 and nowhere in \u0060substitute_json\u0060 is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the value it is handed, so the nesting of the caller\u0027s document \u2014 not this code \u2014 decides how deep the stack goes. Python\u0027s parsers accept far more nesting than its stack allows: \u0060json.loads\u0060 turns 3,000 bytes of brackets into 1,500 levels and \u0060xml.etree.ElementTree\u0060 parses tens of thousands, while a walk like this one raises \u0060RecursionError\u0060 once it passes the interpreter\u0027s default limit of 1,000 frames. Wherever that exception lands, the work fails: a request errors, and outside any \u0060try\u0060 the worker or the program exits with it. Raising \u0060sys.setrecursionlimit\u0060 only moves the number the document has to beat. Thread a depth argument through \u0060substitute_json\u0060 and reject the value past a fixed maximum, or rewrite the descent with an explicit stack."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/plugins/substitution.py"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"3842cb3c48637e6979debbd2d2e64552a81b48a893ed43e3472447ba0e178bd4"}},{"ruleId":"X17","level":"warning","message":{"text":"Recursive walk over a caller-supplied document has no depth cap: \u0060json_value\u0060 is public and takes \u0060value: object\u0060 from its caller, and it calls itself at line 22 (\u0060json_value\u0060) with a piece of \u0060value\u0060 (and at line 31) \u2014 and nowhere in \u0060json_value\u0060 is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the value it is handed, so the nesting of the caller\u0027s document \u2014 not this code \u2014 decides how deep the stack goes. Python\u0027s parsers accept far more nesting than its stack allows: \u0060json.loads\u0060 turns 3,000 bytes of brackets into 1,500 levels and \u0060xml.etree.ElementTree\u0060 parses tens of thousands, while a walk like this one raises \u0060RecursionError\u0060 once it passes the interpreter\u0027s default limit of 1,000 frames. Wherever that exception lands, the work fails: a request errors, and outside any \u0060try\u0060 the worker or the program exits with it. Raising \u0060sys.setrecursionlimit\u0060 only moves the number the document has to beat. Thread a depth argument through \u0060json_value\u0060 and reject the value past a fixed maximum, or rewrite the descent with an explicit stack."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/plugins/_json.py"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7d56dfd593c8ee5b35e056f6ab9dbffa4ed0021659e767cf198e2402fab8921"}},{"ruleId":"X17","level":"warning","message":{"text":"Recursive walk over a caller-supplied document has no depth cap: \u0060coerce_tool_output_for_ptc\u0060 is public and takes \u0060value: Any\u0060 from its caller, and it calls itself at line 112 (\u0060coerce_tool_output_for_ptc\u0060) with a piece of \u0060value\u0060 (and at line 116) \u2014 and nowhere in \u0060coerce_tool_output_for_ptc\u0060 is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the value it is handed, so the nesting of the caller\u0027s document \u2014 not this code \u2014 decides how deep the stack goes. Python\u0027s parsers accept far more nesting than its stack allows: \u0060json.loads\u0060 turns 3,000 bytes of brackets into 1,500 levels and \u0060xml.etree.ElementTree\u0060 parses tens of thousands, while a walk like this one raises \u0060RecursionError\u0060 once it passes the interpreter\u0027s default limit of 1,000 frames. Wherever that exception lands, the work fails: a request errors, and outside any \u0060try\u0060 the worker or the program exits with it. Raising \u0060sys.setrecursionlimit\u0060 only moves the number the document has to beat. Thread a depth argument through \u0060coerce_tool_output_for_ptc\u0060 and reject the value past a fixed maximum, or rewrite the descent with an explicit stack."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/partners/quickjs/langchain_quickjs/_format.py"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dcbace8505cdf55e852b9ce15a9666e0416de423b231be7f71e2e49000d3119"}},{"ruleId":"X17","level":"warning","message":{"text":"Recursive walk over a caller-supplied document has no depth cap: \u0060coerce_tool_output_for_ptc\u0060 is public, takes a document from its caller (line 93) and hands it to \u0060_coerce_for_marshal\u0060, which calls itself at line 127 (\u0060_coerce_for_marshal\u0060) with a piece of \u0060value\u0060 (and at line 129, line 134) \u2014 and nowhere in \u0060_coerce_for_marshal\u0060 is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the value it is handed, so the nesting of the caller\u0027s document \u2014 not this code \u2014 decides how deep the stack goes. Python\u0027s parsers accept far more nesting than its stack allows: \u0060json.loads\u0060 turns 3,000 bytes of brackets into 1,500 levels and \u0060xml.etree.ElementTree\u0060 parses tens of thousands, while a walk like this one raises \u0060RecursionError\u0060 once it passes the interpreter\u0027s default limit of 1,000 frames. Wherever that exception lands, the work fails: a request errors, and outside any \u0060try\u0060 the worker or the program exits with it. Raising \u0060sys.setrecursionlimit\u0060 only moves the number the document has to beat. Thread a depth argument through \u0060_coerce_for_marshal\u0060 and reject the value past a fixed maximum, or rewrite the descent with an explicit stack."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/partners/quickjs/langchain_quickjs/_format.py"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"a43e5df9c4f227c8dc1eb1a9f05fe9d9f5b67e9fb4521f8b9275c232a02d1335"}},{"ruleId":"X17","level":"warning","message":{"text":"Recursive walk over a caller-supplied document has no depth cap: \u0060redact_for_logging\u0060 is public and takes \u0060value: object\u0060 from its caller, and it calls itself at line 455 (\u0060redact_for_logging\u0060) with a piece of \u0060value\u0060 (and at line 459) \u2014 and nowhere in \u0060redact_for_logging\u0060 is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the value it is handed, so the nesting of the caller\u0027s document \u2014 not this code \u2014 decides how deep the stack goes. Python\u0027s parsers accept far more nesting than its stack allows: \u0060json.loads\u0060 turns 3,000 bytes of brackets into 1,500 levels and \u0060xml.etree.ElementTree\u0060 parses tens of thousands, while a walk like this one raises \u0060RecursionError\u0060 once it passes the interpreter\u0027s default limit of 1,000 frames. Wherever that exception lands, the work fails: a request errors, and outside any \u0060try\u0060 the worker or the program exits with it. Raising \u0060sys.setrecursionlimit\u0060 only moves the number the document has to beat. Thread a depth argument through \u0060redact_for_logging\u0060 and reject the value past a fixed maximum, or rewrite the descent with an explicit stack."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/observability.py"},"region":{"startLine":455}}}],"partialFingerprints":{"codehealthFindingId/v1":"551748c448afbbd8d2a11d8c21a9b53d380c838594afddaa691dd1a4fec532c8"}},{"ruleId":"X23","level":"note","message":{"text":"Diagnostic log message is built whether or not it is wanted: \u0060debug\u0060 at line 2347 is called with an argument built by \u0060sorted(str(key) for key in payload_dict)\u0060 (line 2350), whose cost grows with the collection it walks. Python evaluates a call\u0027s arguments BEFORE entering the method, so that join/projection runs in full every time this line is reached \u2014 and then the level check inside the logger discards the string it produced, because debug is a level a shipped configuration normally leaves off. Nothing here decides beforehand whether the message is wanted: no \u0060isEnabledFor(logging.DEBUG)\u0060 test, no debug flag, no \u0060lambda\u0060 the logger calls only when the level is on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/model_config.py"},"region":{"startLine":2347}}}],"partialFingerprints":{"codehealthFindingId/v1":"96253bda68b5c4d3875f2c568a2dd18dc07b17b7515430b6746e2335adf8253c"}},{"ruleId":"X23","level":"note","message":{"text":"Diagnostic log message is built whether or not it is wanted: \u0060debug\u0060 at line 88 is called with an argument built by \u0060sorted(set(arguments) - set(cleaned))\u0060 (line 90), whose cost grows with the collection it walks. Python evaluates a call\u0027s arguments BEFORE entering the method, so that join/projection runs in full every time this line is reached \u2014 and then the level check inside the logger discards the string it produced, because debug is a level a shipped configuration normally leaves off. Nothing here decides beforehand whether the message is wanted: no \u0060isEnabledFor(logging.DEBUG)\u0060 test, no debug flag, no \u0060lambda\u0060 the logger calls only when the level is on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/mcp_middleware.py"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc3d59c1a7a0a2cf9372fb6e060760b99e0c3320581c4e6a85bac52b65d49a7a"}},{"ruleId":"X23","level":"note","message":{"text":"Diagnostic log message is built whether or not it is wanted: \u0060debug\u0060 at line 1403 is called with an argument built by \u0060sum(len(provider.models) for provider in providers)\u0060 (line 1408), whose cost grows with the collection it walks. Python evaluates a call\u0027s arguments BEFORE entering the method, so that join/projection runs in full every time this line is reached \u2014 and then the level check inside the logger discards the string it produced, because debug is a level a shipped configuration normally leaves off. Nothing here decides beforehand whether the message is wanted: no \u0060isEnabledFor(logging.DEBUG)\u0060 test, no debug flag, no \u0060lambda\u0060 the logger calls only when the level is on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/cost_tracking.py"},"region":{"startLine":1403}}}],"partialFingerprints":{"codehealthFindingId/v1":"2780f4a2b3f0af66e33e11694f0d37ffe9f83d093ebf7d60da17b7ec8cff02f8"}},{"ruleId":"X23","level":"note","message":{"text":"Diagnostic log message is built whether or not it is wanted: \u0060debug\u0060 at line 1123 is called with an argument built by \u0060\u0022\u2026\u0022.join(namespace)\u0060 (line 1125), whose cost grows with the collection it walks. Python evaluates a call\u0027s arguments BEFORE entering the method, so that join/projection runs in full every time this line is reached \u2014 and then the level check inside the logger discards the string it produced, because debug is a level a shipped configuration normally leaves off. Nothing here decides beforehand whether the message is wanted: no \u0060isEnabledFor(logging.DEBUG)\u0060 test, no debug flag, no \u0060lambda\u0060 the logger calls only when the level is on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/client/remote_client.py"},"region":{"startLine":1123}}}],"partialFingerprints":{"codehealthFindingId/v1":"47e26a8595456f36b6a2cd29e37a6bed65d27e8a24f67c8609aa948241bd8daa"}},{"ruleId":"X23","level":"note","message":{"text":"Diagnostic log message is built whether or not it is wanted: \u0060debug\u0060 at line 158 is called with an argument built by \u0060sorted(repr(entry) for entry in profile.excluded_middleware)\u0060 (line 161), whose cost grows with the collection it walks. Python evaluates a call\u0027s arguments BEFORE entering the method, so that join/projection runs in full every time this line is reached \u2014 and then the level check inside the logger discards the string it produced, because debug is a level a shipped configuration normally leaves off. Nothing here decides beforehand whether the message is wanted: no \u0060isEnabledFor(logging.DEBUG)\u0060 test, no debug flag, no \u0060lambda\u0060 the logger calls only when the level is on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/_excluded_middleware.py"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfe78b1f84df8be2136dc65ce7c863735ea237c75905e5fdb32f7a0b59a9b420"}},{"ruleId":"X28","level":"warning","message":{"text":"Index access outside its own emptiness guard: This condition tests \u0060results\u0060 for emptiness and then indexes it on a branch that test does not reach. \u0060results[0]\u0060 is evaluated whenever the guarded half is false \u2014 which includes the case the guard exists to anticipate, \u0060results\u0060 being empty \u2014 so an empty \u0060results\u0060 indexes position 0 of nothing and throws. This same condition already shows the intended bracketing at line 30767: \u0060results[1]\u0060 sits INSIDE the guard. Either the guard is load-bearing, in which case this access escapes it and crashes, or \u0060results\u0060 cannot be empty here, in which case the guard beside it is dead code \u2014 the condition is wrong under both readings. Move the parenthesis so the emptiness test brackets every access to \u0060results\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/app.py"},"region":{"startLine":30765}}}],"partialFingerprints":{"codehealthFindingId/v1":"50ba51a40ac7641c676adee0339b7f77bc815f227b0999083e0ff5d8304abe7d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/evals/scripts/analyze.py"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"a515454f4aa156e2d404fd7d7b86ee0f0154f9eb6bcc1b7f121052fd982ccaba"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_error)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/channels/whatsapp_bridge/bridge.js"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb5d70d3b10a853f521ba4920b5cc9f2d8e1ab895ba09242b44377636882608d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/channels/whatsapp_bridge/bridge.js"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"98eef17f56c8298be83344a36b7081b192be5846933da8f3febf6fe70447e70b"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/talon/deepagents_talon/channels/whatsapp_bridge/bridge.js"},"region":{"startLine":729}}}],"partialFingerprints":{"codehealthFindingId/v1":"41b211755c5065481615e873093a449dee7f7e82c259a19ade67f01c07d8d6f3"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on parse failure: \u0060_redact_url\u0060 returns \u0060\u0027[redacted URL]\u0027\u0060 when \u0060ValueError\u0060 is raised, with no log or raise \u2014 a malformed value silently becomes that default. Log the input or fail validation. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/auto_mode.py"},"region":{"startLine":748}}}],"partialFingerprints":{"codehealthFindingId/v1":"51e3192b1cd71e766b582ca93072b186874e7bd7e24780ed44866a7768f54f09"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on parse failure: \u0060_langsmith_runs_endpoint_urls_from\u0060 returns \u0060()\u0060 when \u0060(TypeError, ValueError)\u0060 is raised, with no log or raise \u2014 a malformed value silently becomes that default. Log the input or fail validation. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/config.py"},"region":{"startLine":5064}}}],"partialFingerprints":{"codehealthFindingId/v1":"13126caeafec2c2284a5f7895d5ebcb9811d754e5c1c3247fc108d15a6129fb1"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on parse failure: \u0060_endpoint_gateway_state\u0060 returns \u0060\u0027unknown\u0027\u0060 when \u0060ValueError\u0060 is raised, with no log or raise \u2014 a malformed value silently becomes that default. Log the input or fail validation. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/doctor.py"},"region":{"startLine":377}}}],"partialFingerprints":{"codehealthFindingId/v1":"d77d2d32cb832e74801920f90032bb1dae2b84728c74fc96ffdf8e7c0ddabc3b"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on parse failure: \u0060_run_adapter\u0060 returns \u00601\u0060 when \u0060(json.JSONDecodeError, UnicodeDecodeError)\u0060 is raised, with no log or raise \u2014 a malformed value silently becomes that default. Log the input or fail validation. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/hooks/migration.py"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c37d3ad142d6b2396c3c3fc5ca9f5ca0eeb6fd678cd414d6e6a7f5a80e5ef2a"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on parse failure: \u0060_redact_url\u0060 returns \u0060\u0027[redacted URL]\u0027\u0060 when \u0060ValueError\u0060 is raised, with no log or raise \u2014 a malformed value silently becomes that default. Log the input or fail validation. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/hooks/transcript.py"},"region":{"startLine":643}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae6e8aaf67d9fefa9ec2acf3fcce694ffdcf3df82a14f700843e46e677324ad7"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on parse failure: \u0060_current_index\u0060 returns \u00600\u0060 when \u0060ValueError\u0060 is raised, with no log or raise \u2014 a malformed value silently becomes that default. Log the input or fail validation. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/agent_selector.py"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5181bb7833260e7d88079ed7e0a1d61ff421a3c6b7191eec583aebfd1a5a5bd"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on parse failure: \u0060_scope_files_to_cwd\u0060 returns \u0060[]\u0060 when \u0060ValueError\u0060 is raised, with no log or raise \u2014 a malformed value silently becomes that default. Log the input or fail validation. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/code/deepagents_code/tui/widgets/autocomplete.py"},"region":{"startLine":841}}}],"partialFingerprints":{"codehealthFindingId/v1":"53df53a6a34c73d94def8b26857ae11f9d3b5350ff3485444a0d5fd6eec189fe"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on parse failure: \u0060_glob_search_files\u0060 returns \u0060\u0027No files found\u0027\u0060 when \u0060ValueError\u0060 is raised, with no log or raise \u2014 a malformed value silently becomes that default. Log the input or fail validation. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/backends/utils.py"},"region":{"startLine":1034}}}],"partialFingerprints":{"codehealthFindingId/v1":"8125c167e0eb20fca92214735842f2d9d73425a821e7cdfda9ccb02b6d085353"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on parse failure: \u0060_candidate_paths\u0060 returns \u0060[]\u0060 when \u0060(ValueError, OSError, RuntimeError)\u0060 is raised, with no log or raise \u2014 a malformed value silently becomes that default. Log the input or fail validation. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/_fs_interrupt.py"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"562c754213afa0982e0017e03292811a5e4aefa4601206e8667903bb6cab6f0a"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on parse failure: \u0060when\u0060 (in \u0060_make_exact_when_predicate\u0060) returns \u0060False\u0060 when \u0060ValueError\u0060 is raised, with no log or raise \u2014 a malformed value silently becomes that default. Log the input or fail validation. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/_fs_interrupt.py"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2ff38fb0f29e313fc41a61209880d7f634cc5488f26964a2d352cd40c3f112d"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on parse failure: \u0060when\u0060 (in \u0060_make_bulk_when_predicate\u0060) returns \u0060False\u0060 when \u0060ValueError\u0060 is raised, with no log or raise \u2014 a malformed value silently becomes that default. Log the input or fail validation. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/deepagents/deepagents/middleware/_fs_interrupt.py"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"d69db0bfd94253705a7fae8e139ec4545750f57cab0372ea46d45ec8f9f37d60"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060_langsmith_version\u0060 swallows every exception into \u0060return \u0027unknown\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"libs/evals/tests/evals/pytest_reporter.py"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"36ac76395751a229b7042f18c49da032527f0101fbfb6805e2a66898717af427"}}],"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-1357","guid":"e4d2e772-757e-0a5c-bd7d-77052949d866","name":"Reliance on Insufficiently Trustworthy Component","shortDescription":{"text":"Reliance on Insufficiently Trustworthy Component"},"helpUri":"https://cwe.mitre.org/data/definitions/1357.html"},{"id":"CWE-1395","guid":"800e09e7-c11a-8654-9fa6-86f398995fed","name":"Dependency on Vulnerable Third-Party Component","shortDescription":{"text":"Dependency on Vulnerable Third-Party Component"},"helpUri":"https://cwe.mitre.org/data/definitions/1395.html"},{"id":"CWE-16","guid":"659db3ea-affc-8453-8add-c1218fbfcb92","name":"Configuration","shortDescription":{"text":"Configuration"},"helpUri":"https://cwe.mitre.org/data/definitions/16.html"},{"id":"CWE-250","guid":"52ee12e8-390a-7351-b1e6-388afa694e54","name":"CWE-250","shortDescription":{"text":"CWE-250"},"helpUri":"https://cwe.mitre.org/data/definitions/250.html"},{"id":"CWE-259","guid":"ae9ad959-fbb6-9d5e-892d-3dca66da0b69","name":"Use of Hard-coded Password","shortDescription":{"text":"Use of Hard-coded Password"},"helpUri":"https://cwe.mitre.org/data/definitions/259.html"},{"id":"CWE-353","guid":"09d7e902-d4ee-f05d-ae6c-0a1554d0c18f","name":"Missing Support for Integrity Check","shortDescription":{"text":"Missing Support for Integrity Check"},"helpUri":"https://cwe.mitre.org/data/definitions/353.html"},{"id":"CWE-494","guid":"b8a65e0d-e459-4a55-a931-fc1136482375","name":"Download of Code Without Integrity Check","shortDescription":{"text":"Download of Code Without Integrity Check"},"helpUri":"https://cwe.mitre.org/data/definitions/494.html"},{"id":"CWE-506","guid":"401d6455-56e3-0552-9a39-f77461673e3f","name":"Embedded Malicious Code","shortDescription":{"text":"Embedded Malicious Code"},"helpUri":"https://cwe.mitre.org/data/definitions/506.html"},{"id":"CWE-532","guid":"1cd8877a-76e8-ce54-b40b-779af23364a0","name":"Insertion of Sensitive Information into Log File","shortDescription":{"text":"Insertion of Sensitive Information into Log File"},"helpUri":"https://cwe.mitre.org/data/definitions/532.html"},{"id":"CWE-611","guid":"1afbae66-ea29-2d59-aaa2-134e3ae2e85a","name":"Improper Restriction of XML External Entity Reference","shortDescription":{"text":"Improper Restriction of XML External Entity Reference"},"helpUri":"https://cwe.mitre.org/data/definitions/611.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":"Improper Neutralization of Special Elements used in a Command (\u0027Command Injection\u0027)","shortDescription":{"text":"Improper Neutralization of Special Elements used in a Command (\u0027Command Injection\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/77.html"},{"id":"CWE-78","guid":"2e31ceaf-c7ae-2e5e-9661-cfb1362789cf","name":"Improper Neutralization of Special Elements used in an OS Command (\u0027OS Command Injection\u0027)","shortDescription":{"text":"Improper Neutralization of Special Elements used in an OS Command (\u0027OS Command Injection\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/78.html"},{"id":"CWE-79","guid":"fd45580b-e8c4-fc5e-8c2f-aa8fab0b4dbf","name":"Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)","shortDescription":{"text":"Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/79.html"},{"id":"CWE-798","guid":"5e8f057d-fee3-995a-a0cb-9fc5b0d174d1","name":"Use of Hard-coded Credentials","shortDescription":{"text":"Use of Hard-coded Credentials"},"helpUri":"https://cwe.mitre.org/data/definitions/798.html"},{"id":"CWE-829","guid":"13c33925-97fb-5a5e-b40c-56d328b8a4d7","name":"Inclusion of Functionality from Untrusted Control Sphere","shortDescription":{"text":"Inclusion of Functionality from Untrusted Control Sphere"},"helpUri":"https://cwe.mitre.org/data/definitions/829.html"},{"id":"CWE-89","guid":"6d08fdad-37eb-c150-bbf0-d7d946863407","name":"Improper Neutralization of Special Elements used in an SQL Command (\u0027SQL Injection\u0027)","shortDescription":{"text":"Improper Neutralization of Special Elements used in an SQL Command (\u0027SQL Injection\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/89.html"},{"id":"CWE-937","guid":"16f316ae-415c-b354-a59b-1f7905f756e9","name":"Using Components with Known Vulnerabilities","shortDescription":{"text":"Using Components with Known Vulnerabilities"},"helpUri":"https://cwe.mitre.org/data/definitions/937.html"},{"id":"CWE-939","guid":"12397742-f2c4-8254-8012-482c3356c551","name":"CWE-939","shortDescription":{"text":"CWE-939"},"helpUri":"https://cwe.mitre.org/data/definitions/939.html"},{"id":"CWE-94","guid":"75e7f50c-6c2f-dd52-bf40-bf6c52b861fd","name":"Improper Control of Generation of Code (\u0027Code Injection\u0027)","shortDescription":{"text":"Improper Control of Generation of Code (\u0027Code Injection\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/94.html"}]},{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61","version":"2025","organization":"OWASP Foundation","informationUri":"https://top10.owasp.org/2025/","isComprehensive":false,"shortDescription":{"text":"The OWASP Top 10:2025 web application security risks."},"taxa":[{"id":"A01:2025","guid":"df693558-c822-0452-8f7b-4d53cb6bcc59","name":"Broken Access Control","shortDescription":{"text":"Broken Access Control"},"helpUri":"https://top10.owasp.org/2025/A01_2025-Broken_Access_Control/"},{"id":"A02:2025","guid":"668dee9e-41bc-6354-97d0-fdf8f40c50c1","name":"Security Misconfiguration","shortDescription":{"text":"Security Misconfiguration"},"helpUri":"https://top10.owasp.org/2025/A02_2025-Security_Misconfiguration/"},{"id":"A03:2025","guid":"168e227c-7735-2e57-bc6e-997affe644c5","name":"Software Supply Chain Failures","shortDescription":{"text":"Software Supply Chain Failures"},"helpUri":"https://top10.owasp.org/2025/A03_2025-Software_Supply_Chain_Failures/"},{"id":"A05:2025","guid":"87e86033-3231-8458-8e4a-5cb82743553a","name":"Injection","shortDescription":{"text":"Injection"},"helpUri":"https://top10.owasp.org/2025/A05_2025-Injection/"},{"id":"A07:2025","guid":"334ddd78-539d-d35c-83dd-253647eb7eaf","name":"Authentication Failures","shortDescription":{"text":"Authentication Failures"},"helpUri":"https://top10.owasp.org/2025/A07_2025-Authentication_Failures/"},{"id":"A08:2025","guid":"84b0c297-710e-9a5f-9335-936ecb260c36","name":"Software or Data Integrity Failures","shortDescription":{"text":"Software or Data Integrity Failures"},"helpUri":"https://top10.owasp.org/2025/A08_2025-Software_or_Data_Integrity_Failures/"},{"id":"A09:2025","guid":"78892bc9-3c98-495d-881c-8af1390d643c","name":"Security Logging \u0026 Alerting Failures","shortDescription":{"text":"Security Logging \u0026 Alerting Failures"},"helpUri":"https://top10.owasp.org/2025/A09_2025-Security_Logging_and_Alerting_Failures/"}]},{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35","organization":"OWASP Foundation","informationUri":"https://owasp.org/www-project-top-10-ci-cd-security-risks/","isComprehensive":false,"shortDescription":{"text":"The OWASP Top 10 CI/CD Security Risks."},"taxa":[{"id":"CICD-SEC-4","guid":"c859d8ea-8b24-a157-9406-94929c10397a","name":"Poisoned Pipeline Execution (PPE)","shortDescription":{"text":"Poisoned Pipeline Execution (PPE)"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-04-Poisoned-Pipeline-Execution"},{"id":"CICD-SEC-6","guid":"f2ee2486-b260-2952-a41f-6b67fa713940","name":"Insufficient Credential Hygiene","shortDescription":{"text":"Insufficient Credential Hygiene"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-06-Insufficient-Credential-Hygiene"},{"id":"CICD-SEC-9","guid":"b3d36727-0395-5b51-94c4-5e173d62eab3","name":"Improper Artifact Integrity Validation","shortDescription":{"text":"Improper Artifact Integrity Validation"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-09-Improper-Artifact-Integrity-Validation"}]}],"properties":{"codehealthPublication":{"public":true,"notice":"This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings \u2014 which rule fired, in which file, on which line, and how to fix it \u2014 are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.","securityFindingsRedacted":133,"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."]}]}