{"$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":"D5","name":"Coupling","shortDescription":{"text":"Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D5"},{"id":"D7","name":"Architectural Integrity","shortDescription":{"text":"Architectural Integrity"},"helpUri":"https://codehealth.canine.dev/dimensions/D7"},{"id":"D8","name":"Code Coverage","shortDescription":{"text":"Code Coverage"},"helpUri":"https://codehealth.canine.dev/dimensions/D8"},{"id":"D9","name":"Test Distribution","shortDescription":{"text":"Test Distribution"},"helpUri":"https://codehealth.canine.dev/dimensions/D9"},{"id":"D10","name":"Test Quality","shortDescription":{"text":"Test Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D10"},{"id":"D13","name":"Secret Scanning","shortDescription":{"text":"Secret Scanning"},"helpUri":"https://codehealth.canine.dev/dimensions/D13","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"]}},{"id":"D14","name":"License Compliance","shortDescription":{"text":"License Compliance"},"helpUri":"https://codehealth.canine.dev/dimensions/D14"},{"id":"D15","name":"Churn \u00D7 Complexity Hotspots","shortDescription":{"text":"Churn \u00D7 Complexity Hotspots"},"helpUri":"https://codehealth.canine.dev/dimensions/D15"},{"id":"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":"D23","name":"Boundary Type-Coupling","shortDescription":{"text":"Boundary Type-Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D23"},{"id":"D24","name":"Comment Value","shortDescription":{"text":"Comment Value"},"helpUri":"https://codehealth.canine.dev/dimensions/D24"},{"id":"D26","name":"Project Cohesion","shortDescription":{"text":"Project Cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/D26"},{"id":"D28","name":"Secrets (history)","shortDescription":{"text":"Secrets (history)"},"helpUri":"https://codehealth.canine.dev/dimensions/D28","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"]}},{"id":"D29","name":"Static Analysis (SAST)","shortDescription":{"text":"Static Analysis (SAST)"},"helpUri":"https://codehealth.canine.dev/dimensions/D29","relationships":[{"target":{"id":"CWE-79","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-77","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-79","CWE-89","CWE-78","CWE-94","CWE-77"]}},{"id":"D30","name":"Dependency Vulnerabilities","shortDescription":{"text":"Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D30","relationships":[{"target":{"id":"CWE-1395","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-937","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1395","CWE-937"]}},{"id":"D31","name":"IaC \u0026 Container Security","shortDescription":{"text":"IaC \u0026 Container Security"},"helpUri":"https://codehealth.canine.dev/dimensions/D31","relationships":[{"target":{"id":"CWE-1032","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-732","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-16","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1032","CWE-732","CWE-16"]}},{"id":"D34","name":"Knowledge Freshness","shortDescription":{"text":"Knowledge Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/D34"},{"id":"D35","name":"Change Coupling","shortDescription":{"text":"Change Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D35"},{"id":"D36","name":"Supply-chain Provenance \u0026 Signing","shortDescription":{"text":"Supply-chain Provenance \u0026 Signing"},"helpUri":"https://codehealth.canine.dev/dimensions/D36","relationships":[{"target":{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1357","CWE-494"]}},{"id":"D43","name":"Malicious Dependencies","shortDescription":{"text":"Malicious Dependencies"},"helpUri":"https://codehealth.canine.dev/dimensions/D43","relationships":[{"target":{"id":"CWE-506","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-506"]}},{"id":"D44","name":"Platform End-of-Life","shortDescription":{"text":"Platform End-of-Life"},"helpUri":"https://codehealth.canine.dev/dimensions/D44"},{"id":"AX1","name":"Captive dependencies","shortDescription":{"text":"Captive dependencies"},"helpUri":"https://codehealth.canine.dev/dimensions/AX1"},{"id":"AX10","name":"Code composition","shortDescription":{"text":"Code composition"},"helpUri":"https://codehealth.canine.dev/dimensions/AX10"},{"id":"AX2","name":"Stateful singletons","shortDescription":{"text":"Stateful singletons"},"helpUri":"https://codehealth.canine.dev/dimensions/AX2"},{"id":"AX3","name":"Project dependency cycles","shortDescription":{"text":"Project dependency cycles"},"helpUri":"https://codehealth.canine.dev/dimensions/AX3"},{"id":"AX5","name":"Architecture \u0026 structure","shortDescription":{"text":"Architecture \u0026 structure"},"helpUri":"https://codehealth.canine.dev/dimensions/AX5"},{"id":"AX6","name":"Interface segregation","shortDescription":{"text":"Interface segregation"},"helpUri":"https://codehealth.canine.dev/dimensions/AX6"},{"id":"AX7","name":"Slice cohesion","shortDescription":{"text":"Slice cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/AX7"},{"id":"AX8","name":"Test isolation","shortDescription":{"text":"Test isolation"},"helpUri":"https://codehealth.canine.dev/dimensions/AX8"},{"id":"AXA1","name":"Runtime unauthenticated reachability","shortDescription":{"text":"Runtime unauthenticated reachability"},"helpUri":"https://codehealth.canine.dev/dimensions/AXA1"},{"id":"AXB2","name":"Runtime readiness","shortDescription":{"text":"Runtime readiness"},"helpUri":"https://codehealth.canine.dev/dimensions/AXB2"},{"id":"AXH1","name":"Runtime security headers","shortDescription":{"text":"Runtime security headers"},"helpUri":"https://codehealth.canine.dev/dimensions/AXH1"},{"id":"AXI1","name":"Runtime container hardening","shortDescription":{"text":"Runtime container hardening"},"helpUri":"https://codehealth.canine.dev/dimensions/AXI1"},{"id":"AXR1","name":"Runtime accessibility (rendered)","shortDescription":{"text":"Runtime accessibility (rendered)"},"helpUri":"https://codehealth.canine.dev/dimensions/AXR1"},{"id":"AXS1","name":"Runtime exposed surface","shortDescription":{"text":"Runtime exposed surface"},"helpUri":"https://codehealth.canine.dev/dimensions/AXS1"},{"id":"ED5","name":"Idempotency","shortDescription":{"text":"Idempotency"},"helpUri":"https://codehealth.canine.dev/dimensions/ED5"},{"id":"GD1","name":"Unfinished \u0026 placeholder code","shortDescription":{"text":"Unfinished \u0026 placeholder code"},"helpUri":"https://codehealth.canine.dev/dimensions/GD1"},{"id":"IC1","name":"Incompleteness \u0026 stubs","shortDescription":{"text":"Incompleteness \u0026 stubs"},"helpUri":"https://codehealth.canine.dev/dimensions/IC1"},{"id":"M1","name":"Documentation (README)","shortDescription":{"text":"Documentation (README)"},"helpUri":"https://codehealth.canine.dev/dimensions/M1"},{"id":"M2","name":"Architecture documentation","shortDescription":{"text":"Architecture documentation"},"helpUri":"https://codehealth.canine.dev/dimensions/M2"},{"id":"M3","name":"Folder \u0026 project structure","shortDescription":{"text":"Folder \u0026 project structure"},"helpUri":"https://codehealth.canine.dev/dimensions/M3"},{"id":"M4","name":"Documentation accuracy","shortDescription":{"text":"Documentation accuracy"},"helpUri":"https://codehealth.canine.dev/dimensions/M4"},{"id":"P1","name":"CI/CD gates","shortDescription":{"text":"CI/CD gates"},"helpUri":"https://codehealth.canine.dev/dimensions/P1"},{"id":"P10","name":"Library API \u0026 versioning","shortDescription":{"text":"Library API \u0026 versioning"},"helpUri":"https://codehealth.canine.dev/dimensions/P10"},{"id":"P12","name":"CI test-gate honesty","shortDescription":{"text":"CI test-gate honesty"},"helpUri":"https://codehealth.canine.dev/dimensions/P12"},{"id":"P3","name":"Security \u0026 performance tooling","shortDescription":{"text":"Security \u0026 performance tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/P3"},{"id":"P4","name":"Deployment \u0026 Rollback","shortDescription":{"text":"Deployment \u0026 Rollback"},"helpUri":"https://codehealth.canine.dev/dimensions/P4"},{"id":"P5","name":"DR \u0026 Backup","shortDescription":{"text":"DR \u0026 Backup"},"helpUri":"https://codehealth.canine.dev/dimensions/P5"},{"id":"P6","name":"Release Hygiene","shortDescription":{"text":"Release Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/P6"},{"id":"R1","name":"Type Safety","shortDescription":{"text":"Type Safety"},"helpUri":"https://codehealth.canine.dev/dimensions/R1"},{"id":"R10","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/R10"},{"id":"R2","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/R2"},{"id":"R3","name":"Large Files","shortDescription":{"text":"Large Files"},"helpUri":"https://codehealth.canine.dev/dimensions/R3"},{"id":"R4","name":"Test Coverage","shortDescription":{"text":"Test Coverage"},"helpUri":"https://codehealth.canine.dev/dimensions/R4"},{"id":"R5","name":"Dependency Freshness","shortDescription":{"text":"Dependency Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/R5"},{"id":"R6","name":"Tooling","shortDescription":{"text":"Tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/R6"},{"id":"R7","name":"Dead Code","shortDescription":{"text":"Dead Code"},"helpUri":"https://codehealth.canine.dev/dimensions/R7"},{"id":"R8","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/R8"},{"id":"R9","name":"Circular Imports","shortDescription":{"text":"Circular Imports"},"helpUri":"https://codehealth.canine.dev/dimensions/R9"},{"id":"SC1","name":"Supply-chain hygiene","shortDescription":{"text":"Supply-chain hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/SC1"},{"id":"X1","name":"Async correctness","shortDescription":{"text":"Async correctness"},"helpUri":"https://codehealth.canine.dev/dimensions/X1"},{"id":"X10","name":"Duplicated predicate","shortDescription":{"text":"Duplicated predicate"},"helpUri":"https://codehealth.canine.dev/dimensions/X10"},{"id":"X12","name":"Unreachable branch","shortDescription":{"text":"Unreachable branch"},"helpUri":"https://codehealth.canine.dev/dimensions/X12"},{"id":"X13","name":"Undrained process stream","shortDescription":{"text":"Undrained process stream"},"helpUri":"https://codehealth.canine.dev/dimensions/X13"},{"id":"X14","name":"Bypassable address classification","shortDescription":{"text":"Bypassable address classification"},"helpUri":"https://codehealth.canine.dev/dimensions/X14"},{"id":"X15","name":"Unvalidated length from an untrusted reader","shortDescription":{"text":"Unvalidated length from an untrusted reader"},"helpUri":"https://codehealth.canine.dev/dimensions/X15"},{"id":"X16","name":"Unfloored truncation loop","shortDescription":{"text":"Unfloored truncation loop"},"helpUri":"https://codehealth.canine.dev/dimensions/X16"},{"id":"X17","name":"Uncapped recursion over a caller-supplied document","shortDescription":{"text":"Uncapped recursion over a caller-supplied document"},"helpUri":"https://codehealth.canine.dev/dimensions/X17"},{"id":"X18","name":"Disposal-pattern correctness","shortDescription":{"text":"Disposal-pattern correctness"},"helpUri":"https://codehealth.canine.dev/dimensions/X18"},{"id":"X19","name":"Unrestored process-global state","shortDescription":{"text":"Unrestored process-global state"},"helpUri":"https://codehealth.canine.dev/dimensions/X19"},{"id":"X2","name":"Cancellation propagation","shortDescription":{"text":"Cancellation propagation"},"helpUri":"https://codehealth.canine.dev/dimensions/X2"},{"id":"X20","name":"Mistyped argument guard","shortDescription":{"text":"Mistyped argument guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X20"},{"id":"X21","name":"Side-effecting pattern guard","shortDescription":{"text":"Side-effecting pattern guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X21"},{"id":"X22","name":"Contradicted release guard","shortDescription":{"text":"Contradicted release guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X22"},{"id":"X23","name":"Unguarded diagnostic materialisation","shortDescription":{"text":"Unguarded diagnostic materialisation"},"helpUri":"https://codehealth.canine.dev/dimensions/X23"},{"id":"X24","name":"Document value interpolated into markup unescaped","shortDescription":{"text":"Document value interpolated into markup unescaped"},"helpUri":"https://codehealth.canine.dev/dimensions/X24"},{"id":"X25","name":"Inert configuration knob","shortDescription":{"text":"Inert configuration knob"},"helpUri":"https://codehealth.canine.dev/dimensions/X25"},{"id":"X26","name":"Unsynchronised callback handoff","shortDescription":{"text":"Unsynchronised callback handoff"},"helpUri":"https://codehealth.canine.dev/dimensions/X26"},{"id":"X27","name":"Collection changed while being enumerated","shortDescription":{"text":"Collection changed while being enumerated"},"helpUri":"https://codehealth.canine.dev/dimensions/X27"},{"id":"X28","name":"Index access outside its own emptiness guard","shortDescription":{"text":"Index access outside its own emptiness guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X28"},{"id":"X29","name":"Per-element action decided by a fixed element","shortDescription":{"text":"Per-element action decided by a fixed element"},"helpUri":"https://codehealth.canine.dev/dimensions/X29"},{"id":"X3","name":"Exception handling","shortDescription":{"text":"Exception handling"},"helpUri":"https://codehealth.canine.dev/dimensions/X3"},{"id":"X30","name":"Support guard that admits what it rejects","shortDescription":{"text":"Support guard that admits what it rejects"},"helpUri":"https://codehealth.canine.dev/dimensions/X30"},{"id":"X32","name":"Type resolved by simple name across every loaded assembly","shortDescription":{"text":"Type resolved by simple name across every loaded assembly"},"helpUri":"https://codehealth.canine.dev/dimensions/X32"},{"id":"X4","name":"Structured logging","shortDescription":{"text":"Structured logging"},"helpUri":"https://codehealth.canine.dev/dimensions/X4"},{"id":"X5","name":"Nullable reference types","shortDescription":{"text":"Nullable reference types"},"helpUri":"https://codehealth.canine.dev/dimensions/X5"},{"id":"X6","name":"Hand-rolled structured-format parsing","shortDescription":{"text":"Hand-rolled structured-format parsing"},"helpUri":"https://codehealth.canine.dev/dimensions/X6"},{"id":"X7","name":"Silent fallback defaults","shortDescription":{"text":"Silent fallback defaults"},"helpUri":"https://codehealth.canine.dev/dimensions/X7"},{"id":"X9","name":"Subsumed condition operand","shortDescription":{"text":"Subsumed condition operand"},"helpUri":"https://codehealth.canine.dev/dimensions/X9"}]}},"results":[{"ruleId":"D1","level":"warning","message":{"text":"DaemonMode.run (cyclomatic 300): DaemonMode.run has cyclomatic complexity 300 (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":"SageFs/DaemonMode.fs"},"region":{"startLine":2116}}}],"partialFingerprints":{"codehealthFindingId/v1":"23b5e6d0467a394e2a51e463ae8d9fb30b16ea19af3cbb833df004b253dcc107"}},{"ruleId":"D1","level":"warning","message":{"text":"SageFsUpdate.update (cyclomatic 260): SageFsUpdate.update has cyclomatic complexity 260 (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":"SageFs/SageFsApp.fs"},"region":{"startLine":1121}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a00d27c4b83da7ce34d07d6a79d57d6661d676e5456df9a4718724e476018f8"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkerMain.run (cyclomatic 231): WorkerMain.run has cyclomatic complexity 231 (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":"SageFs.Host/WorkerMain.fs"},"region":{"startLine":561}}}],"partialFingerprints":{"codehealthFindingId/v1":"eaf918e6617b6934b5863ada6aa5741d52977d9513ad63b332a6020de94556fe"}},{"ruleId":"D1","level":"warning","message":{"text":"SessionManager.createWithAlarm (cyclomatic 190): SessionManager.createWithAlarm has cyclomatic complexity 190 (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":"SageFs.Core/SessionManager.fs"},"region":{"startLine":434}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b0610b97d6561bc6fde8f485fbc184b0fadaad2ed501c1ea6090bb6f5576114"}},{"ruleId":"D1","level":"warning","message":{"text":"AppState.mkAppStateActor (cyclomatic 168): AppState.mkAppStateActor has cyclomatic complexity 168 (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":"SageFs.Core/AppState.fs"},"region":{"startLine":1047}}}],"partialFingerprints":{"codehealthFindingId/v1":"24b26e1fce55c7405fa788cfddf9b0e0ddc59c93aa90393a0bf714f7b9a5da1f"}},{"ruleId":"D1","level":"warning","message":{"text":"SageFsEffectHandler.execute (cyclomatic 142): SageFsEffectHandler.execute has cyclomatic complexity 142 (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":"SageFs/SageFsEffectHandler.fs"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"b913f59f5f89130d47a06f23ddb46fb465c9d4ba569e47547156daf4768fa2f2"}},{"ruleId":"D1","level":"warning","message":{"text":"Cohort.decideRaw (cyclomatic 127): Cohort.decideRaw has cyclomatic complexity 127 (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":"SageFs.Core/Cohort.fs"},"region":{"startLine":853}}}],"partialFingerprints":{"codehealthFindingId/v1":"49b34c4fbc15a583fcf3ff882cec383be8867d4637e8e0466c13858932004771"}},{"ruleId":"D1","level":"warning","message":{"text":"Program.run (cyclomatic 101): Program.run has cyclomatic complexity 101 (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":"SageFs.FsiHost/Program.fs"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"d75a35b7fe9f6ea94682e2d333644a34a9988cc730d1411271244f453342119f"}},{"ruleId":"D1","level":"warning","message":{"text":"DashboardFragments.renderSessionsForSession (cyclomatic 90): DashboardFragments.renderSessionsForSession has cyclomatic complexity 90 (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":"SageFs/DashboardFragments.fs"},"region":{"startLine":1519}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0f6ad6185753a4bc0dd18c943093ecfd4ff35444a2e2f8c9204745fcfaabff3"}},{"ruleId":"D1","level":"warning","message":{"text":"DeltaChain.write (cyclomatic 86): DeltaChain.write has cyclomatic complexity 86 (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":"SageFs.Core/Features/MetadataDelta/DeltaWriter.fs"},"region":{"startLine":492}}}],"partialFingerprints":{"codehealthFindingId/v1":"50b131c518cccc42321d49e46edfd4746b7ee4f40e70ed3f287c0ec69bd38cb3"}},{"ruleId":"D1","level":"warning","message":{"text":"McpServer.mapSessionRoutes (cyclomatic 84): McpServer.mapSessionRoutes has cyclomatic complexity 84 (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":"SageFs/McpServer.fs"},"region":{"startLine":2800}}}],"partialFingerprints":{"codehealthFindingId/v1":"3535a823b2f5aab4004d2df7f8c93e52059de1c74d2c4f65fbd3d341dba65948"}},{"ruleId":"D1","level":"warning","message":{"text":"EditorUpdate.update (cyclomatic 83): EditorUpdate.update has cyclomatic complexity 83 (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":"SageFs/Editor.fs"},"region":{"startLine":250}}}],"partialFingerprints":{"codehealthFindingId/v1":"41033bbc89c1253e43772e15db386681eab17bf3eecf29f0743631fd7e2b0234"}},{"ruleId":"D1","level":"warning","message":{"text":"Dashboard.createStreamHandler (cyclomatic 81): Dashboard.createStreamHandler has cyclomatic complexity 81 (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":"SageFs/Dashboard.fs"},"region":{"startLine":1218}}}],"partialFingerprints":{"codehealthFindingId/v1":"786b313a90f69c3b6da1ef8f778af59d72cde8b9fbff33cab928c4aaa9fc1f83"}},{"ruleId":"D1","level":"warning","message":{"text":"GenericReload.reach (cyclomatic 80): GenericReload.reach has cyclomatic complexity 80 (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":"SageFs.Core/Middleware/GenericReload.fs"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c7bdd8ac3d2372c95aa7a78644bbbfd2805004500499949bdea78c7e5e5fd56"}},{"ruleId":"D1","level":"warning","message":{"text":"ReflectionReadSim.runWith (cyclomatic 77): ReflectionReadSim.runWith has cyclomatic complexity 77 (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":"SageFs.Simulation/ReflectionReadSim.fs"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b5b7d3da357c65c5c8cd77a56b5831da7580febee55ce892bdf13019850e4df"}},{"ruleId":"D1","level":"warning","message":{"text":"MethodDiff.diff (cyclomatic 72): MethodDiff.diff has cyclomatic complexity 72 (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":"SageFs.Core/Features/MetadataDelta/MethodDiff.fs"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"98e646146bc2cf46b5cefaf9e9257e9f3f9e706ce22a074c896d166d84ed0f05"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkerHttpTransport.startServerWithShutdown (cyclomatic 72): WorkerHttpTransport.startServerWithShutdown has cyclomatic complexity 72 (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":"SageFs.Host/WorkerHttpTransport.fs"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"1536794e30dff1ac9ca13646e8ff628211596c15a86d36006f9c0c7ba06ef133"}},{"ruleId":"D1","level":"warning","message":{"text":"LiveValueTree.buildNode (cyclomatic 65): LiveValueTree.buildNode has cyclomatic complexity 65 (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":"SageFs.Core/Features/LiveValueTree.fs"},"region":{"startLine":542}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3c23caf8cc229345f4bd30484a062e4fe4d4078eb8fc481c0b9be6c1cf8474f"}},{"ruleId":"D1","level":"warning","message":{"text":"McpServer.wireModelChangeHandlers (cyclomatic 62): McpServer.wireModelChangeHandlers has cyclomatic complexity 62 (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":"SageFs/McpServer.fs"},"region":{"startLine":1506}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcb5423b3c4087990bedae0579304e5cb3e6cb02bfb82553d48406c9cd43ad6b"}},{"ruleId":"D1","level":"warning","message":{"text":"DeltaRouteSim.step (cyclomatic 60): DeltaRouteSim.step has cyclomatic complexity 60 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/DeltaRouteSim.fs"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"8374b851e29f7ddcfd7afba1ee2a718a55ddcd46f5b35842a731ea43cd38d1ff"}},{"ruleId":"D1","level":"warning","message":{"text":"ElmLoop.startWithCoalescerAndReducer (cyclomatic 59): ElmLoop.startWithCoalescerAndReducer has cyclomatic complexity 59 (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":"SageFs/ElmLoop.fs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"28157c31f86f4827c8f6d21f3974e419c2e74c688c6c94a835744433a60f7290"}},{"ruleId":"D1","level":"warning","message":{"text":"DashboardTypes.parseEditorAction (cyclomatic 58): DashboardTypes.parseEditorAction has cyclomatic complexity 58 (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":"SageFs/DashboardTypes.fs"},"region":{"startLine":1449}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddb4d97ac56c532ad47af87c0651dc670b9d8bcdd7a6d23ec00b098b6faccf47"}},{"ruleId":"D1","level":"warning","message":{"text":"ValueReadSim.runWith (cyclomatic 56): ValueReadSim.runWith has cyclomatic complexity 56 (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":"SageFs.Simulation/ValueReadSim.fs"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"09fb2e884b398e58cea699a56fc1c461e0f4af4eb7bce979ad5a46e3721882df"}},{"ruleId":"D1","level":"warning","message":{"text":"AppState.createFsiSession (cyclomatic 55): AppState.createFsiSession has cyclomatic complexity 55 (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":"SageFs.Core/AppState.fs"},"region":{"startLine":704}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbc59a7e92589c0191242a8dc4f543df6f0b2222b705fc15bf172504a6c520f7"}},{"ruleId":"D1","level":"warning","message":{"text":"TestCycleEffects.decideAfterTypeCheck (cyclomatic 55): TestCycleEffects.decideAfterTypeCheck has cyclomatic complexity 55 (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":"SageFs.Core/Features/LiveTestingCycle.fs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"4de483367bdf6d35287ba825ae7b821ac3d1ce74b59ed71b2f61421b08316bb6"}},{"ruleId":"D1","level":"warning","message":{"text":"Dashboard.createEndpoints (cyclomatic 48): Dashboard.createEndpoints has cyclomatic complexity 48 (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":"SageFs/Dashboard.fs"},"region":{"startLine":2995}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae94d7191cdbe7927b0fafef88288503f276b9626e021d8b5751278cfa16b420"}},{"ruleId":"D1","level":"warning","message":{"text":"Screen.drawWith (cyclomatic 47): Screen.drawWith has cyclomatic complexity 47 (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":"SageFs/Screen.fs"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e1a527bcc619d87ea3e9966cd3a71bb1eb9200a27eb9a1ae29659f2c5da6837"}},{"ruleId":"D1","level":"warning","message":{"text":"AppState.discoverWarmupReplayPlan (cyclomatic 46): AppState.discoverWarmupReplayPlan has cyclomatic complexity 46 (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":"SageFs.Core/AppState.fs"},"region":{"startLine":447}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e3300964c792cea778586f031eb8f3fdbc710d4b25c5c0afc3e1d15bb40a506"}},{"ruleId":"D1","level":"warning","message":{"text":"CapabilitySim.step (cyclomatic 46): CapabilitySim.step has cyclomatic complexity 46 (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":"SageFs.Simulation/CapabilitySim.fs"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac1bfb523660837e80b3b9522204c441b9a36fa9c5841f43f1adde4670bb0c7d"}},{"ruleId":"D1","level":"warning","message":{"text":"IlCanon.canonicalize (cyclomatic 45): IlCanon.canonicalize has cyclomatic complexity 45 (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":"SageFs.Core/Features/MetadataDelta/IlCanon.fs"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"a77d9e857885a3f2f328078fc37311d034d42f2ea3c908e4e70a4a8923b7bf46"}},{"ruleId":"D1","level":"warning","message":{"text":"ReloadPlanning.stripCommentsAndStrings (cyclomatic 45): ReloadPlanning.stripCommentsAndStrings has cyclomatic complexity 45 (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":"SageFs.Core/Features/ReloadPlanning.fs"},"region":{"startLine":906}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5375ddc87a30d4db3234657323e489922e862ec0481c34b03c032bb02de71a1"}},{"ruleId":"D1","level":"warning","message":{"text":"McpServer.mapLiveTestingRoutes (cyclomatic 45): McpServer.mapLiveTestingRoutes has cyclomatic complexity 45 (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":"SageFs/McpServer.fs"},"region":{"startLine":3325}}}],"partialFingerprints":{"codehealthFindingId/v1":"f34e69679603880032d043c0e904b807c8af0d47b9bb0717b889586e8b0c78fc"}},{"ruleId":"D1","level":"warning","message":{"text":"DaemonMode.resumePreviousSessions (cyclomatic 43): DaemonMode.resumePreviousSessions has cyclomatic complexity 43 (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":"SageFs/DaemonMode.fs"},"region":{"startLine":1673}}}],"partialFingerprints":{"codehealthFindingId/v1":"eaf82a345defc750884dedce420c2b20a03065a96654f75c708a4c5ce591ef65"}},{"ruleId":"D1","level":"warning","message":{"text":"Store.create (cyclomatic 43): Store.create has cyclomatic complexity 43 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/FrictionSqlite.fs"},"region":{"startLine":250}}}],"partialFingerprints":{"codehealthFindingId/v1":"28794d5da31c94a033c1f78d506cb79d749425ee5dd35e57d1417527cb700b21"}},{"ruleId":"D1","level":"warning","message":{"text":"McpServer.mapExecutionRoutes (cyclomatic 42): McpServer.mapExecutionRoutes has cyclomatic complexity 42 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpServer.fs"},"region":{"startLine":2032}}}],"partialFingerprints":{"codehealthFindingId/v1":"d67e0875b4577841a2aaa2be1ab16f1c50089c5a5586734786b97295d0548665"}},{"ruleId":"D1","level":"warning","message":{"text":"HotReloadCore.applyDetourPlan (cyclomatic 41): HotReloadCore.applyDetourPlan has cyclomatic complexity 41 (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":"SageFs.Core/Middleware/HotReloadCore.fs"},"region":{"startLine":843}}}],"partialFingerprints":{"codehealthFindingId/v1":"26df7b5c3c7753c4ab7bf5c5a810ddf6e5a551b73513372e7dfc8f6a1b5e5326"}},{"ruleId":"D1","level":"warning","message":{"text":"Dashboard.buildDashboardSnapshotWithSessions (cyclomatic 41): Dashboard.buildDashboardSnapshotWithSessions has cyclomatic complexity 41 (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":"SageFs/Dashboard.fs"},"region":{"startLine":866}}}],"partialFingerprints":{"codehealthFindingId/v1":"a18de55b44f0d6a494af3c536ec12beaca7a838145000fc2f7f8d1e2e42a9b57"}},{"ruleId":"D1","level":"warning","message":{"text":"McpAdapter.splitStatements (cyclomatic 40): McpAdapter.splitStatements has cyclomatic complexity 40 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpAdapter.fs"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"d91fd19f40c4e609b69c45c7b205ba6026f6f23628a8918feb1096577e5766c7"}},{"ruleId":"D1","level":"warning","message":{"text":"DaemonMode.createSessionOpsWithRecovery (cyclomatic 39): DaemonMode.createSessionOpsWithRecovery has cyclomatic complexity 39 (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":"SageFs/DaemonMode.fs"},"region":{"startLine":516}}}],"partialFingerprints":{"codehealthFindingId/v1":"b18d923940374220fa4d0e16918a46bee171f1bc4375d21de1e17d64faa6968f"}},{"ruleId":"D1","level":"warning","message":{"text":"ManifestReader.read (cyclomatic 37): ManifestReader.read has cyclomatic complexity 37 (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":"SageFs.Core/Features/ManifestPersistence.fs"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c3bd57fd33d560a800c4be5163b4e4cbeab6260b1ff71ee19744aef0f3b2720"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkerStartup.await (cyclomatic 36): WorkerStartup.await has cyclomatic complexity 36 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/WorkerStartup.fs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"129c64f2104a815fec47da9837d2fa133529051bd4c9bfcf5e621ce8ac5f8c58"}},{"ruleId":"D1","level":"warning","message":{"text":"McpServer.createServerCaptureFilter (cyclomatic 36): McpServer.createServerCaptureFilter has cyclomatic complexity 36 (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":"SageFs/McpServer.fs"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"c01c8e1165acdde2d5fe8b533924c15921b2bba868fbb6e419fa425760863a15"}},{"ruleId":"D1","level":"warning","message":{"text":"SageFsRender.render (cyclomatic 35): SageFsRender.render has cyclomatic complexity 35 (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":"SageFs/SageFsApp.fs"},"region":{"startLine":2362}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f1ad2cbfea6ac915f1475c7675fe382265cd99fe081bff6d98e8dce5210e2b2"}},{"ruleId":"D1","level":"warning","message":{"text":"PushEventModule.formatForLlm (cyclomatic 34): PushEventModule.formatForLlm has cyclomatic complexity 34 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpPushNotifications.fs"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"10df05e5a8de8cfd904575f4ec571d2ab71c3ad5ac8bd10bc1e2d04c6ea041df"}},{"ruleId":"D1","level":"warning","message":{"text":"FsiProtocol.readValue (cyclomatic 33): FsiProtocol.readValue has cyclomatic complexity 33 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.FsiHost/FsiProtocol.fs"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"11c9542b02e21996ccff5735f72397ac07f79289a7401e7f093bc7aea85b56fd"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkerMain.handleMessage (cyclomatic 33): WorkerMain.handleMessage has cyclomatic complexity 33 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Host/WorkerMain.fs"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"36de94f229a34bda164dde5ba5ed722cb8000017605143bd131c0b2791dac2a9"}},{"ruleId":"D1","level":"warning","message":{"text":"DaemonMode.createElmRuntime (cyclomatic 33): DaemonMode.createElmRuntime has cyclomatic complexity 33 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DaemonMode.fs"},"region":{"startLine":1856}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f164b32a59bc2edaf4fced8dedb92502f0b5f33c90b9540105f1159e5778b4f"}},{"ruleId":"D1","level":"warning","message":{"text":"McpServer.wireSessionEventSubscription (cyclomatic 33): McpServer.wireSessionEventSubscription has cyclomatic complexity 33 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpServer.fs"},"region":{"startLine":1160}}}],"partialFingerprints":{"codehealthFindingId/v1":"93e48f265d181ceff32b946c6e57b6d20831758e4e0cc830b09b6b61822ed05c"}},{"ruleId":"D1","level":"warning","message":{"text":"DashboardFragments.renderHotReloadPanelFull (cyclomatic 32): DashboardFragments.renderHotReloadPanelFull has cyclomatic complexity 32 (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":"SageFs/DashboardFragments.fs"},"region":{"startLine":2496}}}],"partialFingerprints":{"codehealthFindingId/v1":"dacd72d03ade7df691f7b0c63bbe360b066cb2fd604db7c9011df431fba4d450"}},{"ruleId":"D1","level":"warning","message":{"text":"McpTools.resolveSessionId (cyclomatic 31): McpTools.resolveSessionId has cyclomatic complexity 31 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Mcp.fs"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d5be00b503343d821971a606f335018f0615c277ea249fff2af63e2e078a43a"}},{"ruleId":"D1","level":"warning","message":{"text":"FrameDiff.parsePositionedLines (cyclomatic 31): FrameDiff.parsePositionedLines has cyclomatic complexity 31 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing. This is NOT this file\u0027s highest cyclomatic complexity: TerminalInput.mapKeyWith (cyclomatic 36) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/TerminalUI.fs"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"786b8eabc6c3f2244e2fc6c165bb7e7574e9172ff701092a88f9b139d3cfb852"}},{"ruleId":"D1","level":"warning","message":{"text":"SgrModule.ofParams (cyclomatic 31): SgrModule.ofParams has cyclomatic complexity 31 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lemmings/ui/nvim/Ansi.fs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"77be5337f7673eb7f6e6a3305cb8ed140db30e5e78bdd1537c7987b82d3df1a7"}},{"ruleId":"D1","level":"warning","message":{"text":"TriviaNormalization.normalize (cyclomatic 30): TriviaNormalization.normalize 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":"SageFs.Core/Features/LiveTestingTypes.fs"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"1713018bf571632d0647e1b943a0a1e76b6c9245903d53d93520f43f5420d2d7"}},{"ruleId":"D1","level":"warning","message":{"text":"GuardSim.step (cyclomatic 30): GuardSim.step has cyclomatic complexity 30 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/GuardSim.fs"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"20098b9167ccf6ee99d648374487f6a7fc3e5438ad344b7a87e0f26704676051"}},{"ruleId":"D1","level":"warning","message":{"text":"CliCommandModule.parse (cyclomatic 30): CliCommandModule.parse has cyclomatic complexity 30 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Program.fs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"db883ccf76fe1dfa7e02ab2bfe55a0d5ee91e5f2bf7bd3423f039dd41cb5bfdb"}},{"ruleId":"D1","level":"warning","message":{"text":"KeyComboModule.tryParse (cyclomatic 30): KeyComboModule.tryParse has cyclomatic complexity 30 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/RenderPipeline.fs"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"975beaaaadea7d428de60adebaa39cb816f9a59cd53a8152f079c66712475ea1"}},{"ruleId":"D1","level":"warning","message":{"text":"TestStateTracker.ProcessResultsBatch (cyclomatic 29): TestStateTracker.ProcessResultsBatch has cyclomatic complexity 29 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio.Editor/TestStateTracker.cs"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"46a8f79f4e18c910fb320eb1495540bd021e18edf9fcd215c9ef5a8ce7a9873c"}},{"ruleId":"D1","level":"warning","message":{"text":"HotReloading.hotReloadingMiddleware (cyclomatic 29): HotReloading.hotReloadingMiddleware has cyclomatic complexity 29 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/HotReloading.fs"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"900c49879736421c141329088c2476a5c50be15afdd62e7e4e69e1890574df60"}},{"ruleId":"D1","level":"warning","message":{"text":"Program.main (cyclomatic 29): Program.main has cyclomatic complexity 29 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Program.fs"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca98f1e1929eb0b6de6bf031e868787d9d35a73885393b154030cdc922d31d46"}},{"ruleId":"D1","level":"warning","message":{"text":"McpTools.evalSingleStatement (cyclomatic 29): McpTools.evalSingleStatement has cyclomatic complexity 29 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Mcp.fs"},"region":{"startLine":1029}}}],"partialFingerprints":{"codehealthFindingId/v1":"eebb9ae9e508c4a7c4ae3770152d580af89b50274c99d6d212d15223ae80784a"}},{"ruleId":"D1","level":"warning","message":{"text":"ValueReads.fateAt (cyclomatic 28): ValueReads.fateAt has cyclomatic complexity 28 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/ValueReads.fs"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0a2d3d3e0518468e930e574be7e47eedfba2722f83a33d22ddc585f74c39561"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectFSharpCoreIdentity.rewriteReferenceWith (cyclomatic 28): ProjectFSharpCoreIdentity.rewriteReferenceWith has cyclomatic complexity 28 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/IsolatedFsiSession.fs"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"11f864784ba9ce55182d7853c520cbaa512beefaf5b7a5b769e06d062d1c8477"}},{"ruleId":"D1","level":"warning","message":{"text":"StateMachineRenderer.render (cyclomatic 28): StateMachineRenderer.render has cyclomatic complexity 28 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/DomainModelViz.fs"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"fad118ec29c90e673b4fcfd60a8f5a4662aac8ce70ea78d3b473497bf5ecfbf5"}},{"ruleId":"D1","level":"warning","message":{"text":"Evaluator.RunGuarded (cyclomatic 28): Evaluator.RunGuarded has cyclomatic complexity 28 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/MemberEvaluation.fs"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"16a41688d4dd77e88fb37a941a75ec4c6f8c085f9e2c42260f758d0b5d3c5dc9"}},{"ruleId":"D1","level":"warning","message":{"text":"LiveValueTree.classify (cyclomatic 28): LiveValueTree.classify has cyclomatic complexity 28 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveValueTree.fs"},"region":{"startLine":471}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f4c1bad926e055bc52aea2f1960e39593dc234ce91cf12112d255b89a76c4e5"}},{"ruleId":"D1","level":"warning","message":{"text":"McpStdioBridge.run (cyclomatic 28): McpStdioBridge.run has cyclomatic complexity 28 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpStdioBridge.fs"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"6660f1e6b9febaa6a2423d76b6bfbaf73cb2214c1bea86269db4e860c57febae"}},{"ruleId":"D1","level":"warning","message":{"text":"Ansi.tokenize (cyclomatic 28): Ansi.tokenize 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":"scripts/lemmings/ui/nvim/Ansi.fs"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1dff70c2962099ac0433a64eb72bd2b4f8383fb94f06e6644266379f4533f6e"}},{"ruleId":"D1","level":"warning","message":{"text":"Nvim.parseShellCommand (cyclomatic 27): Nvim.parseShellCommand has cyclomatic complexity 27 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lemmings/ui/nvim/Nvim.fs"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1806691dc0835d34f9b969ca0a908eab6461f82bdee4d34c25ae84bc442918c"}},{"ruleId":"D1","level":"warning","message":{"text":"onmessage (cyclomatic 27): onmessage has cyclomatic complexity 27 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 3 belong to 8 function items inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Resources/devreload.js"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d193d2a2404f6211d094515a02d676326f17a1ca01e33e7df1a878e3983413d"}},{"ruleId":"D1","level":"warning","message":{"text":"onmessage (cyclomatic 27): onmessage has cyclomatic complexity 27 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 3 belong to 8 function items inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Host/Resources/devreload.js"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e15b4c8de54098bc6064ce4ff1e6a09aec9394ecd5fbe794848c2337d71cedb"}},{"ruleId":"D1","level":"warning","message":{"text":"GenericReload.sharedStub (cyclomatic 26): GenericReload.sharedStub has cyclomatic complexity 26 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/GenericReload.fs"},"region":{"startLine":504}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbc2d8f91fe01177666bb0bacd3575ef97055d3de59b68521c04d8aadd1b7587"}},{"ruleId":"D1","level":"warning","message":{"text":"IsolatedFsiSession.start (cyclomatic 26): IsolatedFsiSession.start has cyclomatic complexity 26 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/IsolatedFsiSession.fs"},"region":{"startLine":670}}}],"partialFingerprints":{"codehealthFindingId/v1":"5451dd10a41abea67dd9402ff0b4634c29f7a988ec530194ec04144f44ea4a29"}},{"ruleId":"D1","level":"warning","message":{"text":"FsiHostClient.start (cyclomatic 26): FsiHostClient.start has cyclomatic complexity 26 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/FsiHostClient.fs"},"region":{"startLine":483}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bd312c2d7b34db47266d58e8413c75c5d53a12f63716000fec084d3048c8af3"}},{"ruleId":"D1","level":"warning","message":{"text":"TrunkFollow.step (cyclomatic 26): TrunkFollow.step has cyclomatic complexity 26 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/TrunkFollow.fs"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab753fd76f964810bec491879ee7c5c844441eecc5da3085c1a08dc49e15f775"}},{"ruleId":"D1","level":"warning","message":{"text":"CategoryDetection.categorize (cyclomatic 26): CategoryDetection.categorize has cyclomatic complexity 26 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveTestingTypes.fs"},"region":{"startLine":2345}}}],"partialFingerprints":{"codehealthFindingId/v1":"00eccbbf46ae9413e87701e48a353bffece11803d194329997c5b2c350e94ce8"}},{"ruleId":"D1","level":"warning","message":{"text":"CoreEvidence.inspectProject (cyclomatic 26): CoreEvidence.inspectProject has cyclomatic complexity 26 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/CoreEvidence.fs"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"de67846ba8479dbaf06e3d35e94532613f2ce8a03b4d63433c07194f8e497aaf"}},{"ruleId":"D1","level":"warning","message":{"text":"ReadyWaitSim.apply (cyclomatic 26): ReadyWaitSim.apply has cyclomatic complexity 26 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/ReadyWaitSim.fs"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee064b33ad773f3a1ddc3b81483680823aaa6caf072c48aa07ebc2be3997a57a"}},{"ruleId":"D1","level":"warning","message":{"text":"DashboardFragments.renderLiveBindingsPanel (cyclomatic 26): DashboardFragments.renderLiveBindingsPanel has cyclomatic complexity 26 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DashboardFragments.fs"},"region":{"startLine":3593}}}],"partialFingerprints":{"codehealthFindingId/v1":"d571cd9c24e1283899c3104d5d9e71c74acaf096436e6b08936aa61ebfe90c8d"}},{"ruleId":"D1","level":"warning","message":{"text":"IsolatedFsiSession.planHost (cyclomatic 25): IsolatedFsiSession.planHost has cyclomatic complexity 25 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/IsolatedFsiSession.fs"},"region":{"startLine":572}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bf20604014f285642fc5e277990a716d05d97145f289ab3356f672c00668548"}},{"ruleId":"D1","level":"warning","message":{"text":"SessionBuild.runBuildAsync (cyclomatic 25): SessionBuild.runBuildAsync has cyclomatic complexity 25 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/SessionBuild.fs"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7ed0afa4b17ad376eb92b3ab48d39fce12bc588fc77cb415eef31ea85fb4465"}},{"ruleId":"D1","level":"warning","message":{"text":"Dashboard.createSessionActionHandler (cyclomatic 25): Dashboard.createSessionActionHandler has cyclomatic complexity 25 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Dashboard.fs"},"region":{"startLine":2106}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c1515e1ca3b8a7be6a86becf53cf7439ff9c04e95e64b73b4c1e681996f3304"}},{"ruleId":"D1","level":"warning","message":{"text":"Dashboard.createFrictionSendHandler (cyclomatic 25): Dashboard.createFrictionSendHandler 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":"SageFs/Dashboard.fs"},"region":{"startLine":2372}}}],"partialFingerprints":{"codehealthFindingId/v1":"70cbe24c14c742028bb3ffe4149132a16618b1f0c882821f8ebb844f985625e6"}},{"ruleId":"D1","level":"warning","message":{"text":"Screen.computeLayoutWith (cyclomatic 25): Screen.computeLayoutWith has cyclomatic complexity 25 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Screen.fs"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c2e2eeeb6301bcf0f73682ada0bfe6c43c4e0824624a5abf92eb07114cfbf3a"}},{"ruleId":"D1","level":"warning","message":{"text":"ValueReads.decode (cyclomatic 24): ValueReads.decode 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":"SageFs.Core/Middleware/ValueReads.fs"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"422695e614c0ace8d9d0be46efa86277212f46fcc77c0254a011ade4342f1c62"}},{"ruleId":"D1","level":"warning","message":{"text":"LiveValueTree.walkWithin (cyclomatic 24): LiveValueTree.walkWithin 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":"SageFs.Core/Features/LiveValueTree.fs"},"region":{"startLine":863}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e121a9b6a68ab98bc43de7396564c63a3ee6beff6a87ed3c424995a0fcd3b94"}},{"ruleId":"D1","level":"warning","message":{"text":"ShapeMigration.migrate (cyclomatic 24): ShapeMigration.migrate 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":"SageFs.Core/ShapeMigration.fs"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ca539063a43e2c72494efb754976cc4e5918b397dcbc01294f085bfa0196fc6"}},{"ruleId":"D1","level":"warning","message":{"text":"AppRunner.launch (cyclomatic 24): AppRunner.launch 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":"SageFs.Host/AppRunner.fs"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f73e6db1d0138fe642c90488e81af94f3be3a961490fef6848e0c9d8534fd6e"}},{"ruleId":"D1","level":"warning","message":{"text":"HygieneSim.applyOp (cyclomatic 24): HygieneSim.applyOp 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":"SageFs.Simulation/HygieneSim.fs"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"fea69a9481a4f7463fa22a3ef48b68fe75db7eb7fd65d06e2accaa866129137b"}},{"ruleId":"D1","level":"warning","message":{"text":"DashboardFragments.renderSessionContextPanel (cyclomatic 24): DashboardFragments.renderSessionContextPanel 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":"SageFs/DashboardFragments.fs"},"region":{"startLine":3349}}}],"partialFingerprints":{"codehealthFindingId/v1":"be01e30fcfbc17967adbaf940e73eb66a8c4b5ab6763bb159ae7747d58eafdc9"}},{"ruleId":"D1","level":"warning","message":{"text":"DashboardTypes.resolveSessionProjects (cyclomatic 24): DashboardTypes.resolveSessionProjects 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":"SageFs/DashboardTypes.fs"},"region":{"startLine":1584}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3be952fffeb4db43bad9098cf6bef281971c0ff5341819046b8a0f1afe8e030"}},{"ruleId":"D1","level":"warning","message":{"text":"Theme.parseConfigLines (cyclomatic 24): Theme.parseConfigLines 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":"SageFs/Theme.fs"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"1da98af928b5f88eb06353f29ac2bf79103af5c2ad350b13c84fd6ac83107a75"}},{"ruleId":"D1","level":"warning","message":{"text":"NvimTour.parseLine (cyclomatic 24): NvimTour.parseLine has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lemmings/ui/nvim/NvimTour.fs"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca3245792ff170fbc8296dd3078206b2dbfc9ec71a87ae8f4c6b2038ffac4dc3"}},{"ruleId":"D1","level":"warning","message":{"text":"devreload.renderErrorPanel (cyclomatic 24): devreload.renderErrorPanel 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":"SageFs.Host/Resources/devreload.js"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8d4d5ff5ab86c2d4ddefbcc7584551a1948ff36bca9b02c8c6d0da41d49f836"}},{"ruleId":"D1","level":"warning","message":{"text":"devreload.renderErrorPanel (cyclomatic 24): devreload.renderErrorPanel 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":"SageFs/Resources/devreload.js"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f6b6271e3aee927bed319985604c767385b1e7fb30c7f6e322ba765c565f22f"}},{"ruleId":"D1","level":"warning","message":{"text":"StatusBarManager.RunStartupHealthCheckAsync (cyclomatic 23): StatusBarManager.RunStartupHealthCheckAsync 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":"sagefs-vs/SageFs.VisualStudio/StatusBar/StatusBarManager.cs"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"406a97991319e94f6f57f1f30ba6eef1547d81e91ab94da86e9025c1a2eb6f72"}},{"ruleId":"D1","level":"warning","message":{"text":"LiveTestCycleStateModule.handleFcsResult (cyclomatic 23): LiveTestCycleStateModule.handleFcsResult has cyclomatic complexity 23 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveTestingCycle.fs"},"region":{"startLine":876}}}],"partialFingerprints":{"codehealthFindingId/v1":"18bfca93608c065816a37262ed42ee3a22e418b99618a4cb832f91056326627c"}},{"ruleId":"D1","level":"warning","message":{"text":"TweakTransaction.step (cyclomatic 23): TweakTransaction.step has cyclomatic complexity 23 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/Tweak/TweakTransaction.fs"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"f09368d856a7622437bb8115f7b6f4f994b5876fde1369f605c49ef4b887578f"}},{"ruleId":"D1","level":"warning","message":{"text":"GuardReachability.walk (cyclomatic 23): GuardReachability.walk has cyclomatic complexity 23 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/GuardReachability.fs"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a548f0f138b26ff7225bec350df6234546600fe1d95ba2f6b972c1071a2989b"}},{"ruleId":"D1","level":"warning","message":{"text":"LiveValueTree.decode (cyclomatic 23): LiveValueTree.decode has cyclomatic complexity 23 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveValueTree.fs"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"13254744ed3b273208e91e555d0e3af8856e0c4967c817906bd051561f655546"}},{"ruleId":"D1","level":"warning","message":{"text":"AppRunOrchestration.runApp (cyclomatic 23): AppRunOrchestration.runApp has cyclomatic complexity 23 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/AppRunOrchestration.fs"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c7d337dc2c519c944b796a2d14dcbc98ee0472b1729b6787a5d39eaa0562e2e"}},{"ruleId":"D1","level":"warning","message":{"text":"MachineProbeReader.storageOf (cyclomatic 23): MachineProbeReader.storageOf has cyclomatic complexity 23 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/MachineProfile.fs"},"region":{"startLine":368}}}],"partialFingerprints":{"codehealthFindingId/v1":"2309071db34129700857af59919a6f03ef795fa748e24d0d53c1efe029ff56b3"}},{"ruleId":"D1","level":"warning","message":{"text":"Session.Save (cyclomatic 23): Session.Save has cyclomatic complexity 23 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Host/RunAppDelta.fs"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d6d803a95f43e3101ad2f5efffa36d2f162aa4ee50641c33425c9e4f76f0b83"}},{"ruleId":"D1","level":"warning","message":{"text":"TweakSim.step (cyclomatic 23): TweakSim.step has cyclomatic complexity 23 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/TweakSim.fs"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f62d46e6bc8115c24218ffc4d2cadda68fe5d02d2e1d282133c6aee2cc7f5e5"}},{"ruleId":"D1","level":"warning","message":{"text":"SageFsUpdate.finalizeLiveTestingState (cyclomatic 23): SageFsUpdate.finalizeLiveTestingState has cyclomatic complexity 23 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/SageFsApp.fs"},"region":{"startLine":630}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6d221f769d49cd81002f93e1ab580c3a5951fe201a74eb920495d76a5a7227a"}},{"ruleId":"D1","level":"warning","message":{"text":"Draw.resolveJunctions (cyclomatic 23): Draw.resolveJunctions has cyclomatic complexity 23 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Draw.fs"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9f516db9e35f68c78ed243032d96eef52a98857e290fee8c16b5294498d5cb9"}},{"ruleId":"D1","level":"warning","message":{"text":"FileAnnotationTracker.ProcessFileAnnotations (cyclomatic 22): FileAnnotationTracker.ProcessFileAnnotations 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":"sagefs-vs/SageFs.VisualStudio.Editor/FileAnnotationTracker.cs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f2b8d3eaa66217524ac4f4960a00aaa93ebfaf76e6a6837b5d1b0dde241c1b0"}},{"ruleId":"D1","level":"warning","message":{"text":"HotReloading.injectNoInlining (cyclomatic 22): HotReloading.injectNoInlining has cyclomatic complexity 22 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/HotReloading.fs"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"87ccdda9aaded4d92dd888e033636fa82bf3822cc8cf457426cd501dcfb1bf52"}},{"ruleId":"D1","level":"warning","message":{"text":"FailureNarrativeBuilder.buildNarrative (cyclomatic 22): FailureNarrativeBuilder.buildNarrative has cyclomatic complexity 22 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveTestingTypes.fs"},"region":{"startLine":1671}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b9ab8d0e5d10071e390b0301cde303e6d443ef9a3189c5151e6b9f9c68b4eee"}},{"ruleId":"D1","level":"warning","message":{"text":"TrunkFollowSim.runOp (cyclomatic 22): TrunkFollowSim.runOp has cyclomatic complexity 22 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/TrunkFollowSim.fs"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"95129c191081a680f1faaf17e265f0486a6928b6814376fedcd0bce76419055e"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowSwitchSim.step (cyclomatic 22): WorkflowSwitchSim.step has cyclomatic complexity 22 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/WorkflowSwitchSim.fs"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"07c0b9c97a4d05edecfcc23e4fc8f9b09debd0a2620708926f9e82c3f8425acc"}},{"ruleId":"D1","level":"warning","message":{"text":"JupyterTransport.parseFrames (cyclomatic 22): JupyterTransport.parseFrames has cyclomatic complexity 22 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/JupyterTransport.fs"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"302508038bea044bdea64e16f6ee367490ad16c75753bf9645b76e9b90c307d0"}},{"ruleId":"D1","level":"warning","message":{"text":"HotReloadCore.handleNewAsmFromRepl (cyclomatic 21): HotReloadCore.handleNewAsmFromRepl has cyclomatic complexity 21 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/HotReloadCore.fs"},"region":{"startLine":1565}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f8a887ece5fa662d5dea899744092653e70b1490c5929217b7bd17802c0972e"}},{"ruleId":"D1","level":"warning","message":{"text":"ValueReadTracking.reflectionSitesOf (cyclomatic 21): ValueReadTracking.reflectionSitesOf has cyclomatic complexity 21 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/ValueReadTracking.fs"},"region":{"startLine":549}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe2c37ba061a945f0ad4936a29531492b9ee3df90744b82fddc2d2bace858c63"}},{"ruleId":"D1","level":"warning","message":{"text":"IlCanon.sameWithoutLooking (cyclomatic 21): IlCanon.sameWithoutLooking has cyclomatic complexity 21 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/MetadataDelta/IlCanon.fs"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"50d6c3b410007c670ac2209da2d7a8321e96fa82d92347a4ea02ba04e4f07fb7"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectLoading.loadSolution (cyclomatic 21): ProjectLoading.loadSolution has cyclomatic complexity 21 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/ProjectLoading.fs"},"region":{"startLine":664}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a227e42f4ee5902850a70617236cada38f513ff74df223d685c3a3a28c4c965"}},{"ruleId":"D1","level":"warning","message":{"text":"Checkout.classify (cyclomatic 21): Checkout.classify has cyclomatic complexity 21 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Checkout.fs"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"c148a381c26bf2b2fd861cb6d20cebca803f7c9cab1e516dafa4dd4029b2ef80"}},{"ruleId":"D1","level":"warning","message":{"text":"Cohort.project (cyclomatic 21): Cohort.project has cyclomatic complexity 21 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Cohort.fs"},"region":{"startLine":1591}}}],"partialFingerprints":{"codehealthFindingId/v1":"7536ba5d12326bdecd18a2fc88b09e3c0c20d023e9ae0914cff183219292831a"}},{"ruleId":"D1","level":"warning","message":{"text":"PatchConfirmationSim.step (cyclomatic 21): PatchConfirmationSim.step has cyclomatic complexity 21 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/PatchConfirmationSim.fs"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd9869793dee4458b47e29f60e9e7df2b50e51264234debc4a494e96b4890622"}},{"ruleId":"D1","level":"warning","message":{"text":"Dashboard.createToggleWarmupAutoOpenHandler (cyclomatic 21): Dashboard.createToggleWarmupAutoOpenHandler has cyclomatic complexity 21 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Dashboard.fs"},"region":{"startLine":2633}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf7319a4492a74db4c44735ce21495d167814d39dd0f0fa9f2d986042bef0bbe"}},{"ruleId":"D1","level":"warning","message":{"text":"McpCohortIntegration.setIntegrationRef (cyclomatic 21): McpCohortIntegration.setIntegrationRef has cyclomatic complexity 21 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpCohortIntegration.fs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"01d6365bc5364252504f97b17650b323166fc03e26f12785ff97a37d171c10d0"}},{"ruleId":"D1","level":"warning","message":{"text":"ValueReadTracking.walk (cyclomatic 20): ValueReadTracking.walk has cyclomatic complexity 20 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/ValueReadTracking.fs"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"aec8359d08701b5e93fbca268a801e1af1d2a7a0b517a76e9f91961a66730d1b"}},{"ruleId":"D1","level":"warning","message":{"text":"EvalActorDecision.decide (cyclomatic 20): EvalActorDecision.decide has cyclomatic complexity 20 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/EvalActorDecision.fs"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c08c868d6bfb7c11252a2539b26bd04a0bf5ba8392503ce0d7c83e6a92a27f8"}},{"ruleId":"D1","level":"warning","message":{"text":"ReflectionExecutor.invokeWith (cyclomatic 20): ReflectionExecutor.invokeWith has cyclomatic complexity 20 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveTestingExecutors.fs"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"aab2b1bfa8aa8b273af420af7a9341379b50ee91fe92b154ccca48ccfae2d481"}},{"ruleId":"D1","level":"warning","message":{"text":"CoverageInstrumenter.insertBeforeWithFixup (cyclomatic 20): CoverageInstrumenter.insertBeforeWithFixup has cyclomatic complexity 20 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/CoverageInstrumenter.fs"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"09573715975098e66015c8f4798b867bd1533d98786a20cea16063d3d443d124"}},{"ruleId":"D1","level":"warning","message":{"text":"ReloadOutcomeModule.describe (cyclomatic 20): ReloadOutcomeModule.describe has cyclomatic complexity 20 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/ReloadOutcome.fs"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"571a1d40831719c766d807a72e2bba60e7c6f9c9f3ce8f65da1844eb744f9907"}},{"ruleId":"D1","level":"warning","message":{"text":"LiveValueTree.classifyGetter (cyclomatic 20): LiveValueTree.classifyGetter has cyclomatic complexity 20 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveValueTree.fs"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef1a562241d7da4cba9c2bb4328426197fc173b6a45cec959091d908c74b88a1"}},{"ruleId":"D1","level":"warning","message":{"text":"HolderRewrite.classify (cyclomatic 20): HolderRewrite.classify has cyclomatic complexity 20 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/HolderRewrite.fs"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ccd8f969c421edf4bb05a72d11b00661803f250bb5cce4700568625b943a306"}},{"ruleId":"D1","level":"warning","message":{"text":"DevReloadMiddleware.createMiddleware (cyclomatic 20): DevReloadMiddleware.createMiddleware has cyclomatic complexity 20 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Host/DevReloadMiddleware.fs"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"5863fb6b3cc1aca8023c8e33f6d1bb1076d278223fe08d4f74ff10f7a7a4ada3"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkerLifecycleSim.stepReal (cyclomatic 20): WorkerLifecycleSim.stepReal has cyclomatic complexity 20 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/WorkerLifecycleSim.fs"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fdfe347eca8c9890649def09ddb5b8448d7a8c41c72cbcff2bb655274feeb3f"}},{"ruleId":"D1","level":"warning","message":{"text":"Dashboard.createEvalFileHandler (cyclomatic 20): Dashboard.createEvalFileHandler has cyclomatic complexity 20 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Dashboard.fs"},"region":{"startLine":1680}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2f26a050dee9ab2ff3e0bb1fb0f591790a8fc4037b4ba7fc153a46b093622f2"}},{"ruleId":"D1","level":"warning","message":{"text":"AnsiEmitter.emitDiff (cyclomatic 20): AnsiEmitter.emitDiff has cyclomatic complexity 20 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/AnsiEmitter.fs"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"e53430b21fef68a2c7c435572fb508a1d1f33a3234aef5e711dd02a92333d947"}},{"ruleId":"D1","level":"warning","message":{"text":"EnvCheck.sdkCheckFromInputs (cyclomatic 20): EnvCheck.sdkCheckFromInputs has cyclomatic complexity 20 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/EnvCheck.fs"},"region":{"startLine":314}}}],"partialFingerprints":{"codehealthFindingId/v1":"685b67b57335a319fda216d4d0fd05f563f4f4857dc9aa2a16424f606168c79e"}},{"ruleId":"D1","level":"warning","message":{"text":"OpenDirective.openDirectiveMiddleware (cyclomatic 19): OpenDirective.openDirectiveMiddleware has cyclomatic complexity 19 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/Directives.fs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"82c6f1fc5774040cc3a094cf0d70e00cbb12493c4c466fb6ed5708326dc797f1"}},{"ruleId":"D1","level":"warning","message":{"text":"EvalStore.materializeScope (cyclomatic 19): EvalStore.materializeScope has cyclomatic complexity 19 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/EvalStore.fs"},"region":{"startLine":359}}}],"partialFingerprints":{"codehealthFindingId/v1":"c98cf5b9eecd13d3c11bde462342982a9dd167552e85ead8e80f5d861cfeda51"}},{"ruleId":"D1","level":"warning","message":{"text":"ExpectoExecutor.runReflectedBody (cyclomatic 19): ExpectoExecutor.runReflectedBody has cyclomatic complexity 19 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveTestingExecutors.fs"},"region":{"startLine":578}}}],"partialFingerprints":{"codehealthFindingId/v1":"c44b9267036c86dd7fdae64d5929ac07d8499521daf44761096cd05471c5ef22"}},{"ruleId":"D1","level":"warning","message":{"text":"TestOrchestrator.executeOne (cyclomatic 19): TestOrchestrator.executeOne has cyclomatic complexity 19 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveTestingExecutors.fs"},"region":{"startLine":970}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4b01bc96ff36dc1e0ba3c163aba24aae06fc3550e95bc604677b502e97116e0"}},{"ruleId":"D1","level":"warning","message":{"text":"CoverageBitmapModule.narrowByLines (cyclomatic 19): CoverageBitmapModule.narrowByLines has cyclomatic complexity 19 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveTestingTypes.fs"},"region":{"startLine":917}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cfafcd1a2ec1b624e3b8527fefdb3710e9999ff6356048e4ae2e420612ec46f"}},{"ruleId":"D1","level":"warning","message":{"text":"SessionManager.stopWorker (cyclomatic 19): SessionManager.stopWorker 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":"SageFs.Core/SessionManager.fs"},"region":{"startLine":315}}}],"partialFingerprints":{"codehealthFindingId/v1":"09022725c808d384f1d284a8309bf5f15cc327ab67e3ae847201d06fb371ccc7"}},{"ruleId":"D1","level":"warning","message":{"text":"ExpensiveWorkLease.requestCore (cyclomatic 19): ExpensiveWorkLease.requestCore has cyclomatic complexity 19 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/ExpensiveWorkLease.fs"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"02de00837c28a3ad527a9e486f134c102a601d2b1b6ce24b6fe42f92be2dda4c"}},{"ruleId":"D1","level":"warning","message":{"text":"CompileOrderInsight.analyzeWithReferences (cyclomatic 19): CompileOrderInsight.analyzeWithReferences has cyclomatic complexity 19 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/CompileOrderInsight.fs"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d077d01ea94822868560062c3eb61c8cadcb47d531873fb15814ffb8d7ed566"}},{"ruleId":"D1","level":"warning","message":{"text":"HolderRewriteSim.unsafeOf (cyclomatic 19): HolderRewriteSim.unsafeOf has cyclomatic complexity 19 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/HolderRewriteSim.fs"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"e63a664563bf6a82e27dab5f094a1027a99b3a784b85e76d8694b516117dfd1f"}},{"ruleId":"D1","level":"warning","message":{"text":"McpServer.mapStatusRoutes (cyclomatic 19): McpServer.mapStatusRoutes has cyclomatic complexity 19 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpServer.fs"},"region":{"startLine":2687}}}],"partialFingerprints":{"codehealthFindingId/v1":"8603f6d8aaf1cc89d2cbd0af05f499f81e2da3716f6b0ea29acb971b5962bf14"}},{"ruleId":"D1","level":"warning","message":{"text":"SageFsTools.set_reflection_read_mode (cyclomatic 19): SageFsTools.set_reflection_read_mode has cyclomatic complexity 19 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing. This is NOT this file\u0027s highest cyclomatic complexity: McpTools.blockerKindOf (cyclomatic 43) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpTools.fs"},"region":{"startLine":1424}}}],"partialFingerprints":{"codehealthFindingId/v1":"44fbd50cef200384b384eb2e9f4e81b98568a9f2d431fb40039d9f97d1bddd55"}},{"ruleId":"D1","level":"warning","message":{"text":"DashboardFragments.renderHighlightedLine (cyclomatic 19): DashboardFragments.renderHighlightedLine has cyclomatic complexity 19 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DashboardFragments.fs"},"region":{"startLine":727}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1abd3f311d9eea6579d24f6a20966874649f8ef4a39b6497909dbff8d12d4ae"}},{"ruleId":"D1","level":"warning","message":{"text":"HygieneEdge.removeWorktree (cyclomatic 19): HygieneEdge.removeWorktree has cyclomatic complexity 19 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/HygieneEdge.fs"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"784f232190affcd9d6b200d6a3ecd9a1c54bd0a57f4d01eb8c3809718f32a983"}},{"ruleId":"D1","level":"warning","message":{"text":"DaemonClient.parseStateEvent (cyclomatic 19): DaemonClient.parseStateEvent has cyclomatic complexity 19 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing. This is NOT this file\u0027s highest cyclomatic complexity: DaemonClient.actionToApi (cyclomatic 53) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DaemonClient.fs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dc2f91fa483b1f06d30b129eeb63bc4e0e2fc77c63969bd668b1b1a6a4559e5"}},{"ruleId":"D1","level":"warning","message":{"text":"KeyMapModule.parseConfigLines (cyclomatic 19): KeyMapModule.parseConfigLines has cyclomatic complexity 19 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/RenderPipeline.fs"},"region":{"startLine":620}}}],"partialFingerprints":{"codehealthFindingId/v1":"792a0080a2f9ad206d54a123050fe57f8342c7b56e303f3f8d6cdc63963b4b5d"}},{"ruleId":"D1","level":"warning","message":{"text":"HotReloadCore.getAllMethods (cyclomatic 18): HotReloadCore.getAllMethods has cyclomatic complexity 18 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/HotReloadCore.fs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9338eea5570d1de65dbad1da71cfdb9dde6d7a2a823b5a40135ae3181b6ce16"}},{"ruleId":"D1","level":"warning","message":{"text":"SafeDirectoryWalk.walkFiles (cyclomatic 18): SafeDirectoryWalk.walkFiles has cyclomatic complexity 18 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/SafeDirectoryWalk.fs"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"439062c6f941d0ad68121ce65fa34f7d91636c488fe2c373ba7ff79357d9b067"}},{"ruleId":"D1","level":"warning","message":{"text":"DUExtractor.extractTransitionsFromSignature (cyclomatic 18): DUExtractor.extractTransitionsFromSignature has cyclomatic complexity 18 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/DomainModelViz.fs"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"f979e750263f3e639d3315aa7f8167d54824032cf33e43c60d0021fd9e349f44"}},{"ruleId":"D1","level":"warning","message":{"text":"SessionContextTui.detailLines (cyclomatic 18): SessionContextTui.detailLines has cyclomatic complexity 18 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/WarmupContext.fs"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"68a362e33f3339a65c1b610f8a35e8fd7c0f2a9c0d9ee61fd7cdd6e913b9b8d6"}},{"ruleId":"D1","level":"warning","message":{"text":"MemoryShedSim.scenarioOf (cyclomatic 18): MemoryShedSim.scenarioOf has cyclomatic complexity 18 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/MemoryShedSim.fs"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"d62399d28aaf3923ed441c76d834d6fee230cf4155b1fe6d6120d765b182f232"}},{"ruleId":"D1","level":"warning","message":{"text":"LiveCheckPumpSim.runOp (cyclomatic 18): LiveCheckPumpSim.runOp has cyclomatic complexity 18 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/LiveCheckPumpSim.fs"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1daf6d53e4aed0fcc804028210d2c262ee1f3a5c683c0994a8fc5775fa2193b"}},{"ruleId":"D1","level":"warning","message":{"text":"SageFsTools.send_fsharp_code (cyclomatic 18): SageFsTools.send_fsharp_code has cyclomatic complexity 18 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing. This is NOT this file\u0027s highest cyclomatic complexity: McpTools.blockerKindOf (cyclomatic 43) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpTools.fs"},"region":{"startLine":752}}}],"partialFingerprints":{"codehealthFindingId/v1":"72877dce71067e4bd18ec8d93bc6c650bfbbe29ec72ce4e5eae584fb4d8f508b"}},{"ruleId":"D1","level":"warning","message":{"text":"Dashboard.createApiStateHandler (cyclomatic 18): Dashboard.createApiStateHandler has cyclomatic complexity 18 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Dashboard.fs"},"region":{"startLine":2703}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d6786b43fe51ced09a9582bfcb12d5749437494c747a42713ce6cbb7c8d748a"}},{"ruleId":"D1","level":"warning","message":{"text":"CohortPlay.renderPlaySummary (cyclomatic 18): CohortPlay.renderPlaySummary has cyclomatic complexity 18 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/CohortPlay.fs"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"3838647f81b56740630d2d9e75593981426df55ea6745ca7c667c45a2eed7a08"}},{"ruleId":"D1","level":"warning","message":{"text":"McpAnalysisViews.suggestRepairJson (cyclomatic 18): McpAnalysisViews.suggestRepairJson has cyclomatic complexity 18 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpAnalysisViews.fs"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"b42400c1fcf8d8f62ecefe20f2909d7f52f0b4888c71b0149b277ea67102fc77"}},{"ruleId":"D1","level":"warning","message":{"text":"HygieneGather.readProcesses (cyclomatic 18): HygieneGather.readProcesses has cyclomatic complexity 18 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/HygieneGather.fs"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"83afe952016f34f907b2b0ee5dd03db1eb8eb35957be7995cd87a146352a705d"}},{"ruleId":"D1","level":"warning","message":{"text":"LiveCheckPump.step (cyclomatic 17): LiveCheckPump.step has cyclomatic complexity 17 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveCheckPump.fs"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9b1128f9ac92998ccf5d7c1ebd3b6eedaa55c3908c798132e083fa4111296ab"}},{"ruleId":"D1","level":"warning","message":{"text":"SideEffectClass.classify (cyclomatic 17): SideEffectClass.classify has cyclomatic complexity 17 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/Tweak/SideEffectClass.fs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"beff1713779937ed32468749334f3e1e0ab012ac6c6f3b9bdcdc2ca0f6768fb9"}},{"ruleId":"D1","level":"warning","message":{"text":"Treemap.squarify (cyclomatic 17): Treemap.squarify 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":"SageFs.Core/Features/Treemap.fs"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"52a01a8c32f9684e591f507aee84f4d01ae9c3150baa59d99f1c9bb231b3e410"}},{"ruleId":"D1","level":"warning","message":{"text":"FsiProtocol.writeValue (cyclomatic 17): FsiProtocol.writeValue 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":"SageFs.FsiHost/FsiProtocol.fs"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"e20df991f3faaedc36176b659018860af35f36287710256eb902755f7d623080"}},{"ruleId":"D1","level":"warning","message":{"text":"HostAgent.afterEvalStep (cyclomatic 17): HostAgent.afterEvalStep has cyclomatic complexity 17 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/HostAgent.fs"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d7414a92951decd73048a11f20259ae6e77feeb5292ac158ffef9e5c445887b"}},{"ruleId":"D1","level":"warning","message":{"text":"RuntimeCompat.parseRuntimeRequirement (cyclomatic 17): RuntimeCompat.parseRuntimeRequirement has cyclomatic complexity 17 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/RuntimeCompat.fs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ac87da4b1307e3f6f5fb3830da1b710745b72b6d187524349a4b58f89228886"}},{"ruleId":"D1","level":"warning","message":{"text":"AppRunner.resolveProjectAssembly (cyclomatic 17): AppRunner.resolveProjectAssembly has cyclomatic complexity 17 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Host/AppRunner.fs"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"bad0247d2ba96d9aac3b220104c39298e9d49fff9b744ced9245ea746ceaf146"}},{"ruleId":"D1","level":"warning","message":{"text":"MemoryShedSim.step (cyclomatic 17): MemoryShedSim.step has cyclomatic complexity 17 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/MemoryShedSim.fs"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"c793dbccd63d6bdb8c6788da0fd25c52130f90b98484e234277afd300cc9a5b7"}},{"ruleId":"D1","level":"warning","message":{"text":"Program.sweepCommand (cyclomatic 17): Program.sweepCommand has cyclomatic complexity 17 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Program.fs"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a3a7b9fc06fbc92398d1bddc5989db1ee8cf2ffa551bffadaa24d9431715216"}},{"ruleId":"D1","level":"warning","message":{"text":"McpServer.mapAnalysisRoutes (cyclomatic 17): McpServer.mapAnalysisRoutes has cyclomatic complexity 17 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpServer.fs"},"region":{"startLine":3574}}}],"partialFingerprints":{"codehealthFindingId/v1":"84819ad01c05f5c5e6c37434e3c1e3920e84455f709aab56225e99d115716a1f"}},{"ruleId":"D1","level":"warning","message":{"text":"CohortInspector.search (cyclomatic 17): CohortInspector.search 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":"SageFs/CohortInspector.fs"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"6637dc4d8db2d5b1ce28066bef37fc56455d137a39d3567ca1ea6f7e92dc85d2"}},{"ruleId":"D1","level":"warning","message":{"text":"McpTools.manageScratchPad (cyclomatic 17): McpTools.manageScratchPad has cyclomatic complexity 17 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Mcp.fs"},"region":{"startLine":3013}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce8a4ba153059a9554a40f908ae1ebfaafcb42a8038bae55a6ebd0874cceac04"}},{"ruleId":"D1","level":"warning","message":{"text":"SageFsMsgQueueCoalescing.tryAbsorbPending (cyclomatic 17): SageFsMsgQueueCoalescing.tryAbsorbPending has cyclomatic complexity 17 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/SageFsApp.fs"},"region":{"startLine":515}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd417072e63c8e67ccb060812a4de5234d8b5455347acf6aba1a09932f1ce8c6"}},{"ruleId":"D1","level":"warning","message":{"text":"ValidatedBufferModule.moveCursor (cyclomatic 17): ValidatedBufferModule.moveCursor has cyclomatic complexity 17 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Editor.fs"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"edc5301f802beae2916050fd51573eb995cba8f4916575e47454b69f448c4594"}},{"ruleId":"D1","level":"warning","message":{"text":"Draw.textHighlighted (cyclomatic 17): Draw.textHighlighted has cyclomatic complexity 17 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Draw.fs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"1186fe63088ce31d43a6609d8d25066565e213fd48976b9e39fd77460df2c5ea"}},{"ruleId":"D1","level":"warning","message":{"text":"DiagnosticStateTracker.ProcessDiagnosticsEvent (cyclomatic 16): DiagnosticStateTracker.ProcessDiagnosticsEvent 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":"sagefs-vs/SageFs.VisualStudio.Editor/DiagnosticStateTracker.cs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"c15ec3fc90c8fcd15adf7132b5d46afc20bc1cec8e1e28c90597c762c015dbf1"}},{"ruleId":"D1","level":"warning","message":{"text":"CompilationContext.transformWholeFile (cyclomatic 16): CompilationContext.transformWholeFile has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/CompilationContext.fs"},"region":{"startLine":327}}}],"partialFingerprints":{"codehealthFindingId/v1":"42dd03430479b2136325657e6f41674d6f4bda91780d31a7388c2ba7ab77a5d3"}},{"ruleId":"D1","level":"warning","message":{"text":"HotReloadCore.planGenericWork (cyclomatic 16): HotReloadCore.planGenericWork has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing. This is NOT this file\u0027s highest cyclomatic complexity: HotReloadCore.compatibleForDetour (cyclomatic 17) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/HotReloadCore.fs"},"region":{"startLine":1503}}}],"partialFingerprints":{"codehealthFindingId/v1":"31a36b98229fd93f0e6887ac1cc607415d98a7ec5fec982e6cca720e5a62136d"}},{"ruleId":"D1","level":"warning","message":{"text":"ValueReads.localUse (cyclomatic 16): ValueReads.localUse has cyclomatic complexity 16 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/ValueReads.fs"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0f53cf6d375381b97870205c187408b45e188ade676ca1af8a59bef798e7519"}},{"ruleId":"D1","level":"warning","message":{"text":"Diagnostician.summarize (cyclomatic 16): Diagnostician.summarize has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/Diagnostician.fs"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce5d470a6efe49fd6876c03fdba6be9a0b12c49691b3002a6465375c58216f7e"}},{"ruleId":"D1","level":"warning","message":{"text":"CohortStatusText.render (cyclomatic 16): CohortStatusText.render 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":"SageFs.Core/Features/CohortStatusText.fs"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0f020c83e99ba89fa09c608da4d10b3be10fa2796eeeb76a2ad13210ad8e87b"}},{"ruleId":"D1","level":"warning","message":{"text":"CoverageBitmapModule.coveringTestsByLine (cyclomatic 16): CoverageBitmapModule.coveringTestsByLine has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing. This is NOT this file\u0027s highest cyclomatic complexity: SourceMapping.attributeMatchesFramework (cyclomatic 18) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveTestingTypes.fs"},"region":{"startLine":959}}}],"partialFingerprints":{"codehealthFindingId/v1":"412aacfceb669aa40fbb8df5e15d9f2e946460aae8f864d5c9b30b16985a176b"}},{"ruleId":"D1","level":"warning","message":{"text":"ReloadPlanning.planReload (cyclomatic 16): ReloadPlanning.planReload has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing. This is NOT this file\u0027s highest cyclomatic complexity: ReloadChangeModule.describe (cyclomatic 21) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/ReloadPlanning.fs"},"region":{"startLine":1242}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e9a59e28e4fac429562625ad6dee1f9c2b1df1aec43f25f501ca999e0394055"}},{"ruleId":"D1","level":"warning","message":{"text":"GuardReachability.implementationsIn (cyclomatic 16): GuardReachability.implementationsIn 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":"SageFs.Core/Features/GuardReachability.fs"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"26dc41866a18f9e0813e22a69438a7be43098461fb9b5c5f94691969d9c10123"}},{"ruleId":"D1","level":"warning","message":{"text":"SessionHealthModule.classify (cyclomatic 16): SessionHealthModule.classify has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/SessionHealth.fs"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"69c0d6a0d89aa3d8f80c69b07825f8da4ac68f358d823ff412e353f2f8dd7d4c"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkerSpawn.startWorkerProcess (cyclomatic 16): WorkerSpawn.startWorkerProcess 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":"SageFs.Core/WorkerSpawn.fs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f564ba768797370ea53abd756fa134a4cabc1661b6ce74f2b8ddfb86de9c009"}},{"ruleId":"D1","level":"warning","message":{"text":"HttpWorkerClient.streamRun (cyclomatic 16): HttpWorkerClient.streamRun has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing. This is NOT this file\u0027s highest cyclomatic complexity: HttpWorkerClient.toRoute (cyclomatic 25) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/HttpWorkerClient.fs"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc6b64406cdcc86958f4c5d364427521f09afde28defc6cc05513af66bdd41f1"}},{"ruleId":"D1","level":"warning","message":{"text":"Planner.stepOf (cyclomatic 16): Planner.stepOf has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/WorkspaceHygiene.fs"},"region":{"startLine":803}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fd0da1568c2151ef7cb68f16a90977a3ee7a9e2338b2c380bcd22bebcd1d2df"}},{"ruleId":"D1","level":"warning","message":{"text":"Executor.operationsFor (cyclomatic 16): Executor.operationsFor has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/WorkspaceHygiene.fs"},"region":{"startLine":957}}}],"partialFingerprints":{"codehealthFindingId/v1":"98a85ac726cdcce6c90743be01e9f9b87a9669536409afc3bed4c9d5f2b48790"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkerConfigModule.fromEnvironmentWith (cyclomatic 16): WorkerConfigModule.fromEnvironmentWith has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Args.fs"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"cae27a79f54fdf8e61bfdc684beec960c184bc5cd2f5b72c3fa333ce4ab51ef7"}},{"ruleId":"D1","level":"warning","message":{"text":"DevReloadInjector.install (cyclomatic 16): DevReloadInjector.install has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Host/DevReloadInjector.fs"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c7b97f85ce204134898c19622f0126154dec6d43ec1449533d5d22eeeb365e3"}},{"ruleId":"D1","level":"warning","message":{"text":"SourceStateSim.decideWith (cyclomatic 16): SourceStateSim.decideWith has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing. This is NOT this file\u0027s highest cyclomatic complexity: SourceStateSim.runOp (cyclomatic 21) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/SourceStateSim.fs"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"573f6efff82b378752fe35137428583dfd890f0b09c4dd0867a7c8ed083a6b00"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkerReloadRelay.start (cyclomatic 16): WorkerReloadRelay.start has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/WorkerReloadRelay.fs"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"17b4b2539a5d293734dcc18c41e9413682c1cd0a1ab592a2c0e76f96de5e2cb0"}},{"ruleId":"D1","level":"warning","message":{"text":"McpServer.replayCachedTestState (cyclomatic 16): McpServer.replayCachedTestState has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpServer.fs"},"region":{"startLine":1047}}}],"partialFingerprints":{"codehealthFindingId/v1":"31ecbf9b88038d57ceefafc296ac4bcc775f9201951f7a42a517e58be4d81160"}},{"ruleId":"D1","level":"warning","message":{"text":"PanelVisibilityModule.decide (cyclomatic 16): PanelVisibilityModule.decide has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DashboardTypes.fs"},"region":{"startLine":1366}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f6adcdb484543aef8c9dd40fd8d5df0d03b4dcbbf099dc8aa244a2d60f92b59"}},{"ruleId":"D1","level":"warning","message":{"text":"TrunkFollowShell.move (cyclomatic 16): TrunkFollowShell.move has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/TrunkFollowShell.fs"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fd636131d249a404d70c1ecf7f5a9fcd6bd3f94768bdf44ce06624d92b74cd3"}},{"ruleId":"D1","level":"warning","message":{"text":"Answer.planRipple (cyclomatic 16): Answer.planRipple has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpAnalysis.fs"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"5224aa324b0510ff66870de2e90a17d2f1e9bdb3e03ded19ca4682baa6f9adea"}},{"ruleId":"D1","level":"warning","message":{"text":"McpTools.switchWorkflow (cyclomatic 16): McpTools.switchWorkflow has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Mcp.fs"},"region":{"startLine":2289}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9eecfbca86fa28ca75a40c24cabc0174fb37cabbc070410145e9cc3fa2de7f3"}},{"ruleId":"D1","level":"warning","message":{"text":"McpTools.getMessageJournal (cyclomatic 16): McpTools.getMessageJournal has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Mcp.fs"},"region":{"startLine":2929}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf6318c65770b884a9173897fafea04cce63b0db51bacf4aaba1b71d918ab07d"}},{"ruleId":"D1","level":"warning","message":{"text":"McpAdapter.formatWarmupDetailForLlm (cyclomatic 16): McpAdapter.formatWarmupDetailForLlm has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpAdapter.fs"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ec6df73d28accf24f36449c962e6ed13cb1a61c8a35434dbff1e518fe3ebf3b"}},{"ruleId":"D1","level":"warning","message":{"text":"CohortGit.rebaseCommitsOnto (cyclomatic 16): CohortGit.rebaseCommitsOnto has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/CohortGit.fs"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"83560ec97f288679b181e2a97ad38732f5f3f5533894c3dca058996a301f276a"}},{"ruleId":"D1","level":"warning","message":{"text":"SageFsEffectHandler.startConfirmationBuild (cyclomatic 16): SageFsEffectHandler.startConfirmationBuild has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/SageFsEffectHandler.fs"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"0960780984e1ad845606747efd6bd6d6d53ad22186f121da7c6f7d5b5a60505b"}},{"ruleId":"D1","level":"warning","message":{"text":"createSseSubscriber.startListening (cyclomatic 16): createSseSubscriber.startListening has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 1 of the 16 points is its own statement and the rest belongs to 2 function literals inside it that branch (lines 40, 61). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vscode/src/sse-helpers.js"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e823350f381970277135be1181f47df6255f1280c4ca2651eebcb8d2e0f0f40"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkerMain.run (cognitive 402): WorkerMain.run has cognitive complexity 402 (threshold 15). Drivers by points: match/switch 108 (348 pts), error handling 14 (29 pts), if/else 7 (12 pts), loops 4 (9 pts), boolean chains 4 (nesting depth added 265). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Host/WorkerMain.fs"},"region":{"startLine":561}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc500e04f0017f368d75eb7071f505e2746f1cdce72c0871f1ecf1864b4db255"}},{"ruleId":"D2","level":"warning","message":{"text":"DaemonMode.run (cognitive 324): DaemonMode.run has cognitive complexity 324 (threshold 15). Drivers by points: match/switch 122 (219 pts), error handling 38 (59 pts), if/else 16 (24 pts), loops 9 (14 pts), boolean chains 8 (nesting depth added 131). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DaemonMode.fs"},"region":{"startLine":2116}}}],"partialFingerprints":{"codehealthFindingId/v1":"b989a4f2a467cda2ec1d2b5a190a51427cf464dcb53090dac11b8ef55808001f"}},{"ruleId":"D2","level":"warning","message":{"text":"SageFsUpdate.update (cognitive 289): SageFsUpdate.update has cognitive complexity 289 (threshold 15). Drivers by points: match/switch 92 (276 pts), boolean chains 13 (nesting depth added 184). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/SageFsApp.fs"},"region":{"startLine":1121}}}],"partialFingerprints":{"codehealthFindingId/v1":"4347cc16536dffb218815d758f14734a46abd6879787905185ba0e675bc98ea0"}},{"ruleId":"D2","level":"warning","message":{"text":"SageFsEffectHandler.execute (cognitive 254): SageFsEffectHandler.execute has cognitive complexity 254 (threshold 15). Drivers by points: match/switch 55 (219 pts), error handling 5 (18 pts), loops 3 (15 pts), boolean chains 2 (nesting depth added 189). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/SageFsEffectHandler.fs"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"676da074128cfd5e68013211ca2e142972cdf2b48dc8670bbcfb41833277c333"}},{"ruleId":"D2","level":"warning","message":{"text":"Cohort.decideRaw (cognitive 231): Cohort.decideRaw has cognitive complexity 231 (threshold 15). Drivers by points: match/switch 53 (178 pts), if/else 20 (49 pts), boolean chains 4 (nesting depth added 154). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Cohort.fs"},"region":{"startLine":853}}}],"partialFingerprints":{"codehealthFindingId/v1":"43a0e5cd32c3f2e9d9554de69bdecfa7605fdd93f445d868c305c609d3b7fbaa"}},{"ruleId":"D2","level":"warning","message":{"text":"SessionManager.createWithAlarm (cognitive 225): SessionManager.createWithAlarm has cognitive complexity 225 (threshold 15). Drivers by points: match/switch 66 (198 pts), error handling 8 (11 pts), if/else 6 (11 pts), loops 2 (4 pts), boolean chains 1 (nesting depth added 142). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/SessionManager.fs"},"region":{"startLine":434}}}],"partialFingerprints":{"codehealthFindingId/v1":"552d2592ffd7745971b214b214bb92fc113e1ee8edf3b632edcbdb6cb59541ee"}},{"ruleId":"D2","level":"warning","message":{"text":"AppState.mkAppStateActor (cognitive 180): AppState.mkAppStateActor has cognitive complexity 180 (threshold 15). Drivers by points: match/switch 68 (144 pts), error handling 13 (33 pts), loops 1 (2 pts), boolean chains 1 (nesting depth added 97). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/AppState.fs"},"region":{"startLine":1047}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e536ac009366164e16caf348d8c2d5d6413c06d8eb8f44265dca458818106d6"}},{"ruleId":"D2","level":"warning","message":{"text":"GenericReload.reach (cognitive 151): GenericReload.reach has cognitive complexity 151 (threshold 15). Drivers by points: match/switch 32 (115 pts), loops 6 (12 pts), if/else 2 (11 pts), boolean chains 7, error handling 2 (6 pts) (nesting depth added 102). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/GenericReload.fs"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fcfc0b9795c1edbdf179c6b155b037a578306ccdc2ca484cfe0e16a00d039ee"}},{"ruleId":"D2","level":"warning","message":{"text":"ManifestReader.read (cognitive 151): ManifestReader.read has cognitive complexity 151 (threshold 15). Drivers by points: match/switch 14 (101 pts), loops 3 (33 pts), if/else 1 (13 pts), boolean chains 3, error handling 1 (nesting depth added 129). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/ManifestPersistence.fs"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f91b4035c3ad3945a3373b646da49831a7d348ca4be616eb0b071f756ee99c4"}},{"ruleId":"D2","level":"warning","message":{"text":"Program.run (cognitive 130): Program.run has cognitive complexity 130 (threshold 15). Drivers by points: error handling 20 (72 pts), match/switch 18 (54 pts), boolean chains 2, loops 2 (nesting depth added 88). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.FsiHost/Program.fs"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"e36433d84f39e93f65758d8373081295effd96c9445c592380818a989ac35da6"}},{"ruleId":"D2","level":"warning","message":{"text":"LiveValueTree.buildNode (cognitive 128): LiveValueTree.buildNode has cognitive complexity 128 (threshold 15). Drivers by points: match/switch 18 (72 pts), error handling 10 (44 pts), if/else 8 (11 pts), boolean chains 1 (nesting depth added 91). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveValueTree.fs"},"region":{"startLine":542}}}],"partialFingerprints":{"codehealthFindingId/v1":"03661223b700ee45857fce4fa837b5ea99f05d94ebeeea805cd50dc4aedaceea"}},{"ruleId":"D2","level":"warning","message":{"text":"DashboardFragments.renderSessionsForSession (cognitive 107): DashboardFragments.renderSessionsForSession has cognitive complexity 107 (threshold 15). Drivers by points: match/switch 46 (105 pts), boolean chains 2 (nesting depth added 59). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DashboardFragments.fs"},"region":{"startLine":1519}}}],"partialFingerprints":{"codehealthFindingId/v1":"fabb38e7cb6f4daf8c24373fba5d9dcd59ba71e5b1e579099c2891a1e488e147"}},{"ruleId":"D2","level":"warning","message":{"text":"ElmLoop.startWithCoalescerAndReducer (cognitive 101): ElmLoop.startWithCoalescerAndReducer has cognitive complexity 101 (threshold 15). Drivers by points: error handling 16 (40 pts), if/else 13 (26 pts), match/switch 15 (25 pts), loops 5 (8 pts), boolean chains 2 (nesting depth added 50). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/ElmLoop.fs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"d98e751135034d1586ac92fe8466482b852b917a57ae14fe1686fe5220574225"}},{"ruleId":"D2","level":"warning","message":{"text":"MethodDiff.diff (cognitive 97): MethodDiff.diff has cognitive complexity 97 (threshold 15). Drivers by points: match/switch 26 (87 pts), loops 8, boolean chains 2 (nesting depth added 61). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/MetadataDelta/MethodDiff.fs"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"42a067f2d6bf8a7d45607eb5698b39aa534ecc43cd18057babbed4d0c6ea2a0e"}},{"ruleId":"D2","level":"warning","message":{"text":"Dashboard.createStreamHandler (cognitive 97): Dashboard.createStreamHandler has cognitive complexity 97 (threshold 15). Drivers by points: error handling 34 (57 pts), match/switch 19 (31 pts), if/else 3 (5 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 38). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Dashboard.fs"},"region":{"startLine":1218}}}],"partialFingerprints":{"codehealthFindingId/v1":"6390f881580d5d6c71b16edf5739b2aa83626f348d2b1cc7e77ff0902cf0a4e3"}},{"ruleId":"D2","level":"warning","message":{"text":"McpServer.mapSessionRoutes (cognitive 86): McpServer.mapSessionRoutes has cognitive complexity 86 (threshold 15). Drivers by points: match/switch 40 (76 pts), error handling 3 (9 pts), loops 1 (nesting depth added 42). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpServer.fs"},"region":{"startLine":2800}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4cec98032175464b9f59f0c3447e04286b4b9bb2f4542c1c27aae920df6ec8b"}},{"ruleId":"D2","level":"warning","message":{"text":"Screen.drawWith (cognitive 81): Screen.drawWith has cognitive complexity 81 (threshold 15). Drivers by points: match/switch 20 (72 pts), loops 2 (5 pts), boolean chains 4 (nesting depth added 55). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Screen.fs"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"e39a6ea2ef509e0e1041a169a96737c3f0fd6b0c746b7d2a0a92083d67061b1a"}},{"ruleId":"D2","level":"warning","message":{"text":"DeltaRouteSim.step (cognitive 80): DeltaRouteSim.step has cognitive complexity 80 (threshold 15). Drivers by points: match/switch 25 (72 pts), loops 2 (7 pts), boolean chains 1 (nesting depth added 52). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/DeltaRouteSim.fs"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"249741df2657437853fdd837c48fc8e2777df7f1629daf7dc56db8a847887f92"}},{"ruleId":"D2","level":"warning","message":{"text":"DeltaChain.write (cognitive 77): DeltaChain.write has cognitive complexity 77 (threshold 15). Drivers by points: match/switch 34 (57 pts), loops 13 (15 pts), boolean chains 3, error handling 2 (nesting depth added 25). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/MetadataDelta/DeltaWriter.fs"},"region":{"startLine":492}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbfe601b3342904c8fd417c79077dfef0611f5cf5116aca573bbe8bfe87e6a38"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkerHttpTransport.startServerWithShutdown (cognitive 77): WorkerHttpTransport.startServerWithShutdown has cognitive complexity 77 (threshold 15). Drivers by points: match/switch 28 (54 pts), error handling 9 (12 pts), loops 5 (11 pts) (nesting depth added 35). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Host/WorkerHttpTransport.fs"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"b964ab1b3a4836b70bce383b9f58d8254c491ba409a324b9de85b60a7e2633e8"}},{"ruleId":"D2","level":"warning","message":{"text":"AppState.discoverWarmupReplayPlan (cognitive 73): AppState.discoverWarmupReplayPlan has cognitive complexity 73 (threshold 15). Drivers by points: match/switch 14 (47 pts), loops 6 (12 pts), error handling 3 (6 pts), if/else 2 (5 pts), boolean chains 3 (nesting depth added 45). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/AppState.fs"},"region":{"startLine":447}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c2a1b968ac29b850c3569d82a34c5373a7e18504ba745be25d1a94541b08004"}},{"ruleId":"D2","level":"warning","message":{"text":"ReflectionReadSim.runWith (cognitive 73): ReflectionReadSim.runWith has cognitive complexity 73 (threshold 15). Drivers by points: match/switch 25 (63 pts), boolean chains 6, loops 2 (4 pts) (nesting depth added 40). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/ReflectionReadSim.fs"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c56819fca1f73d6dc2b83dc1c031965d38bb3a1c3c8008f1744974ba35cbcfc"}},{"ruleId":"D2","level":"warning","message":{"text":"McpServer.wireModelChangeHandlers (cognitive 71): McpServer.wireModelChangeHandlers has cognitive complexity 71 (threshold 15). Drivers by points: match/switch 22 (46 pts), error handling 6 (11 pts), loops 4 (10 pts), boolean chains 4 (nesting depth added 35). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpServer.fs"},"region":{"startLine":1506}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e4ccb9ea5afd8bac8a5ec7e4d3f0adecebc64a90b4c8c829d4218328483be74"}},{"ruleId":"D2","level":"warning","message":{"text":"CategoryDetection.categorize (cognitive 69): CategoryDetection.categorize has cognitive complexity 69 (threshold 15). Drivers by points: match/switch 11 (66 pts), boolean chains 3 (nesting depth added 55). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveTestingTypes.fs"},"region":{"startLine":2345}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2699078bb0ed4431fe8c0535f10a8b8cf13ec3144cf436dde68dc606c0bdfad"}},{"ruleId":"D2","level":"warning","message":{"text":"Store.create (cognitive 69): Store.create has cognitive complexity 69 (threshold 15). Drivers by points: if/else 20 (37 pts), match/switch 7 (12 pts), error handling 11, loops 9 (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":"SageFs/FrictionSqlite.fs"},"region":{"startLine":250}}}],"partialFingerprints":{"codehealthFindingId/v1":"8290d2db4dfcc43d09a45adb186cc079c7714029c2843cdb562ee6b84b635e08"}},{"ruleId":"D2","level":"warning","message":{"text":"Dashboard.createFrictionSendHandler (cognitive 68): Dashboard.createFrictionSendHandler has cognitive complexity 68 (threshold 15). Drivers by points: match/switch 10 (30 pts), if/else 7 (25 pts), error handling 4 (13 pts) (nesting depth added 47). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Dashboard.fs"},"region":{"startLine":2372}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8f83bbe2f6bd4f30a764b95fa20bd76ac08420c298be6a4b8101e33ac8a8a0d"}},{"ruleId":"D2","level":"warning","message":{"text":"Evaluator.RunGuarded (cognitive 66): Evaluator.RunGuarded has cognitive complexity 66 (threshold 15). Drivers by points: match/switch 12 (49 pts), error handling 4 (17 pts) (nesting depth added 50). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/MemberEvaluation.fs"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"4958a6a006a7316b54899930ac05e4844134e2e88fa5afc82ab6de528e71833b"}},{"ruleId":"D2","level":"warning","message":{"text":"TestCycleEffects.decideAfterTypeCheck (cognitive 65): TestCycleEffects.decideAfterTypeCheck has cognitive complexity 65 (threshold 15). Drivers by points: match/switch 20 (57 pts), boolean chains 8 (nesting depth added 37). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveTestingCycle.fs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"321ac77cc05d2adaaa57513563746911666e09f1fba03736c705ff2042661908"}},{"ruleId":"D2","level":"warning","message":{"text":"DaemonMode.createSessionOpsWithRecovery (cognitive 64): DaemonMode.createSessionOpsWithRecovery has cognitive complexity 64 (threshold 15). Drivers by points: match/switch 18 (62 pts), error handling 2 (nesting depth added 44). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DaemonMode.fs"},"region":{"startLine":516}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a5af10bdc1f4c08d7d33b8846433bf827bec3926cb9910bba9cb1ec2b78f5cf"}},{"ruleId":"D2","level":"warning","message":{"text":"IlCanon.canonicalize (cognitive 61): IlCanon.canonicalize has cognitive complexity 61 (threshold 15). Drivers by points: match/switch 19 (56 pts), loops 2 (4 pts), boolean chains 1 (nesting depth added 39). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/MetadataDelta/IlCanon.fs"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"75b60c83bf876fba46f363834f1d4125fd47ec63b7ce20dbdd9109a58f8e5716"}},{"ruleId":"D2","level":"warning","message":{"text":"CapabilitySim.step (cognitive 59): CapabilitySim.step has cognitive complexity 59 (threshold 15). Drivers by points: match/switch 16 (43 pts), if/else 6 (15 pts), boolean chains 1 (nesting depth added 36). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/CapabilitySim.fs"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c3c250c9b92792f2f9ec22a30bc6687824c0c96f963b2241428be641194e0b4"}},{"ruleId":"D2","level":"warning","message":{"text":"IsolatedFsiSession.planHost (cognitive 58): IsolatedFsiSession.planHost has cognitive complexity 58 (threshold 15). Drivers by points: match/switch 11 (44 pts), loops 3 (13 pts), boolean chains 1 (nesting depth added 43). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/IsolatedFsiSession.fs"},"region":{"startLine":572}}}],"partialFingerprints":{"codehealthFindingId/v1":"a14677aeb6c90c2f4a658be3b4636c9012366ebbe44e6bffe8a91d2cae8f21ad"}},{"ruleId":"D2","level":"warning","message":{"text":"IsolatedFsiSession.start (cognitive 58): IsolatedFsiSession.start has cognitive complexity 58 (threshold 15). Drivers by points: match/switch 14 (58 pts) (nesting depth added 44). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/IsolatedFsiSession.fs"},"region":{"startLine":670}}}],"partialFingerprints":{"codehealthFindingId/v1":"e64f4da9680e48faab07c12360ae706aec25babf6114255b00435f237bd09281"}},{"ruleId":"D2","level":"warning","message":{"text":"GuardReachability.walk (cognitive 58): GuardReachability.walk has cognitive complexity 58 (threshold 15). Drivers by points: match/switch 9 (32 pts), loops 4 (25 pts), boolean chains 1 (nesting depth added 44). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/GuardReachability.fs"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d610d0cef00825d00a62f8983a59b9fbfe7acdd447e5292245ad1289b9296d7"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkerStartup.await (cognitive 58): WorkerStartup.await has cognitive complexity 58 (threshold 15). Drivers by points: error handling 16 (36 pts), match/switch 7 (18 pts), loops 3 (4 pts) (nesting depth added 32). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/WorkerStartup.fs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b8daa142bf89ad04d2fa3663fdfd69b206f15153f82a985a4164cddff1049b6"}},{"ruleId":"D2","level":"warning","message":{"text":"Ansi.tokenize (cognitive 58): Ansi.tokenize has cognitive complexity 58 (threshold 15). Drivers by points: if/else 15 (32 pts), loops 4 (16 pts), boolean chains 6, match/switch 1 (4 pts) (nesting depth added 32). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lemmings/ui/nvim/Ansi.fs"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"35d3f019b4951bdc510f3778bdf798c7f92774a8e6e939b9bba9621b9f7ac6a7"}},{"ruleId":"D2","level":"warning","message":{"text":"AppState.createFsiSession (cognitive 55): AppState.createFsiSession has cognitive complexity 55 (threshold 15). Drivers by points: match/switch 23 (39 pts), loops 4 (9 pts), error handling 4 (7 pts) (nesting depth added 24). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/AppState.fs"},"region":{"startLine":704}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b278595685d32d869fd6f0496f93d5964279537ebb93b3e86e3b5e8733cc0ab"}},{"ruleId":"D2","level":"warning","message":{"text":"McpAdapter.splitStatements (cognitive 54): McpAdapter.splitStatements has cognitive complexity 54 (threshold 15). Drivers by points: match/switch 9 (28 pts), loops 6 (16 pts), boolean chains 10 (nesting depth added 29). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpAdapter.fs"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"b240a6c5fac91ed3b4d920e62e63d39b408c10fec6e1c318f0febddf491a2983"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectFSharpCoreIdentity.rewriteReferenceWith (cognitive 52): ProjectFSharpCoreIdentity.rewriteReferenceWith has cognitive complexity 52 (threshold 15). Drivers by points: match/switch 9 (33 pts), loops 6 (18 pts), boolean chains 1 (nesting depth added 36). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/IsolatedFsiSession.fs"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"241916d8e95f9780240151fd9080b3596fff3a9760bb451c6c7022d8d970e790"}},{"ruleId":"D2","level":"warning","message":{"text":"Theme.parseConfigLines (cognitive 52): Theme.parseConfigLines has cognitive complexity 52 (threshold 15). Drivers by points: match/switch 9 (46 pts), loops 2 (4 pts), boolean chains 2 (nesting depth added 39). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Theme.fs"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"da4bb3dafe55834dc20b815902b99a4947e74c05ccaa06f9e378a8c1ced9f1b5"}},{"ruleId":"D2","level":"warning","message":{"text":"ShapeMigration.migrate (cognitive 50): ShapeMigration.migrate has cognitive complexity 50 (threshold 15). Drivers by points: if/else 11 (23 pts), match/switch 7 (22 pts), error handling 1 (5 pts) (nesting depth added 31). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/ShapeMigration.fs"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"47ce8549b3f44913f7c36218497aabc5c0a272467db7a9087b9e151345b08e78"}},{"ruleId":"D2","level":"warning","message":{"text":"McpTools.resolveSessionId (cognitive 50): McpTools.resolveSessionId has cognitive complexity 50 (threshold 15). Drivers by points: match/switch 15 (50 pts) (nesting depth added 35). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Mcp.fs"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"c51021fa2da92760dd3dd9b82d2fa6bf49eac785b7435515cfbbcba59561b1c5"}},{"ruleId":"D2","level":"warning","message":{"text":"ValueReadTracking.reflectionSitesOf (cognitive 49): ValueReadTracking.reflectionSitesOf has cognitive complexity 49 (threshold 15). Drivers by points: match/switch 9 (34 pts), error handling 3 (12 pts), boolean chains 3 (nesting depth added 34). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/ValueReadTracking.fs"},"region":{"startLine":549}}}],"partialFingerprints":{"codehealthFindingId/v1":"521b3689aafa7446b9f69027344dbf588c98c8b70eb035f770b63b7bc34b4221"}},{"ruleId":"D2","level":"warning","message":{"text":"TriviaNormalization.normalize (cognitive 49): TriviaNormalization.normalize has cognitive complexity 49 (threshold 15). Drivers by points: if/else 23 (43 pts), boolean chains 3, match/switch 1 (2 pts), 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":"SageFs.Core/Features/LiveTestingTypes.fs"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"5dc533c91ff8e0a0fcf672eaaf83296176e33d242dd4f7976ef54e32431ff5a1"}},{"ruleId":"D2","level":"warning","message":{"text":"FsiProtocol.readValue (cognitive 48): FsiProtocol.readValue has cognitive complexity 48 (threshold 15). Drivers by points: match/switch 15 (36 pts), if/else 11, boolean chains 1 (nesting depth added 21). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.FsiHost/FsiProtocol.fs"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d2e08a85db6db388f9c530615e0d41657872f0800336f6c0c447ca0d749f161"}},{"ruleId":"D2","level":"warning","message":{"text":"SessionBuild.runBuildAsync (cognitive 48): SessionBuild.runBuildAsync has cognitive complexity 48 (threshold 15). Drivers by points: match/switch 9 (29 pts), loops 3 (11 pts), error handling 2 (8 pts) (nesting depth added 34). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/SessionBuild.fs"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"18e941a4babc5e48972ee3b4e09956f640c6ec50c888ce9ffd1cb12c01d09223"}},{"ruleId":"D2","level":"warning","message":{"text":"CoreEvidence.inspectProject (cognitive 48): CoreEvidence.inspectProject has cognitive complexity 48 (threshold 15). Drivers by points: match/switch 13 (44 pts), error handling 1 (3 pts), boolean chains 1 (nesting depth added 33). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/CoreEvidence.fs"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"563ad2c9f057d7e0a66f444d3aea105b9ba20f6727202100bb1189ba1b50a087"}},{"ruleId":"D2","level":"warning","message":{"text":"McpServer.wireSessionEventSubscription (cognitive 48): McpServer.wireSessionEventSubscription has cognitive complexity 48 (threshold 15). Drivers by points: match/switch 11 (36 pts), error handling 4 (12 pts) (nesting depth added 33). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpServer.fs"},"region":{"startLine":1160}}}],"partialFingerprints":{"codehealthFindingId/v1":"a38b2e7b74199272a07cf6bee95b587fb628c50b4e1da1e7fc7dec45841e3820"}},{"ruleId":"D2","level":"warning","message":{"text":"McpTools.evalSingleStatement (cognitive 48): McpTools.evalSingleStatement has cognitive complexity 48 (threshold 15). Drivers by points: match/switch 13 (40 pts), error handling 2 (8 pts) (nesting depth added 33). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Mcp.fs"},"region":{"startLine":1029}}}],"partialFingerprints":{"codehealthFindingId/v1":"de071dd233310417bdb740cfd9fb36a37cf23ca8706180d78af375552c4ac90f"}},{"ruleId":"D2","level":"warning","message":{"text":"ReloadPlanning.stripCommentsAndStrings (cognitive 45): ReloadPlanning.stripCommentsAndStrings has cognitive complexity 45 (threshold 15). Drivers by points: if/else 21 (24 pts), boolean chains 11, match/switch 4 (9 pts), loops 1 (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, 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":"SageFs.Core/Features/ReloadPlanning.fs"},"region":{"startLine":906}}}],"partialFingerprints":{"codehealthFindingId/v1":"9df601d634dd23456e95a94eaa6bc4f15022a22b7da0e25e8578f38f2057f093"}},{"ruleId":"D2","level":"warning","message":{"text":"JupyterTransport.parseFrames (cognitive 45): JupyterTransport.parseFrames has cognitive complexity 45 (threshold 15). Drivers by points: match/switch 11 (41 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 31). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/JupyterTransport.fs"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa3cbe81c4e00c51db10245a867f30b0be1861191cbfd0c1d8d111576f0a43d4"}},{"ruleId":"D2","level":"warning","message":{"text":"EditorUpdate.update (cognitive 45): EditorUpdate.update has cognitive complexity 45 (threshold 15). Drivers by points: match/switch 19 (43 pts), boolean chains 2 (nesting depth added 24). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Editor.fs"},"region":{"startLine":250}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4927ecbe0d89a0b3e97ee9fa7f6e9abeb187c25e6c594949f573ac25b993e11"}},{"ruleId":"D2","level":"warning","message":{"text":"LiveValueTree.classifyGetter (cognitive 44): LiveValueTree.classifyGetter has cognitive complexity 44 (threshold 15). Drivers by points: match/switch 8 (33 pts), error handling 2 (8 pts), boolean chains 3 (nesting depth added 31). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveValueTree.fs"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"89678e29273654bca75e68fc0e3d609f42bf70640eebab32b1fb0d998215f1e7"}},{"ruleId":"D2","level":"warning","message":{"text":"FileAnnotationTracker.ProcessFileAnnotations (cognitive 43): FileAnnotationTracker.ProcessFileAnnotations has cognitive complexity 43 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio.Editor/FileAnnotationTracker.cs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"f90309a09be86b6ca6f5730cb7f721d24d1d4b2f78d1770634c99b439b5d395b"}},{"ruleId":"D2","level":"warning","message":{"text":"SafeDirectoryWalk.walkFiles (cognitive 43): SafeDirectoryWalk.walkFiles has cognitive complexity 43 (threshold 15). Drivers by points: if/else 7 (15 pts), match/switch 3 (13 pts), error handling 3 (10 pts), loops 1 (3 pts), boolean chains 2 (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":"SageFs.Core/SafeDirectoryWalk.fs"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a400ab4579fef145eb0d8d2e5c8fa319a6ac27abbb28494dbd9cbc19230e61e"}},{"ruleId":"D2","level":"warning","message":{"text":"McpServer.mapLiveTestingRoutes (cognitive 43): McpServer.mapLiveTestingRoutes has cognitive complexity 43 (threshold 15). Drivers by points: match/switch 20 (37 pts), boolean chains 2, error handling 1 (2 pts), loops 1 (2 pts) (nesting depth added 19). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpServer.fs"},"region":{"startLine":3325}}}],"partialFingerprints":{"codehealthFindingId/v1":"4188d3c139367611c194de62ad93cfcb7b7b676e1871ac71a4980bc84275300e"}},{"ruleId":"D2","level":"warning","message":{"text":"Dashboard.createEndpoints (cognitive 43): Dashboard.createEndpoints has cognitive complexity 43 (threshold 15). Drivers by points: match/switch 23 (36 pts), error handling 5, boolean chains 1, loops 1 (nesting depth added 13). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Dashboard.fs"},"region":{"startLine":2995}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ea3e7cb9688295302915529d9df8b48a247b205b754c6d6f821d342d0046bfe"}},{"ruleId":"D2","level":"warning","message":{"text":"CoverageBitmapModule.coveringTestsByLine (cognitive 42): CoverageBitmapModule.coveringTestsByLine has cognitive complexity 42 (threshold 15). Drivers by points: match/switch 6 (27 pts), loops 4 (14 pts), boolean chains 1 (nesting depth added 31). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveTestingTypes.fs"},"region":{"startLine":959}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e795b5483fbc7114ebe563460c90c581d14b1acf6b5f16bee66c52e8f08c45e"}},{"ruleId":"D2","level":"warning","message":{"text":"LiveValueTree.walkWithin (cognitive 42): LiveValueTree.walkWithin has cognitive complexity 42 (threshold 15). Drivers by points: match/switch 9 (27 pts), loops 3 (9 pts), boolean chains 3, error handling 1 (3 pts) (nesting depth added 26). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveValueTree.fs"},"region":{"startLine":863}}}],"partialFingerprints":{"codehealthFindingId/v1":"4350539f2703a0bd4b3723e89ea7d88869f461303fa9ac2cf28cb122c262bdaa"}},{"ruleId":"D2","level":"warning","message":{"text":"Program.sweepCommand (cognitive 42): Program.sweepCommand has cognitive complexity 42 (threshold 15). Drivers by points: match/switch 7 (25 pts), error handling 3 (15 pts), loops 1 (2 pts) (nesting depth added 31). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Program.fs"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"dea8afda9b27ac965ed80341cdbb9080dc9bd3b2e634ac2c1e1b9818706c61c4"}},{"ruleId":"D2","level":"warning","message":{"text":"KeyMapModule.parseConfigLines (cognitive 42): KeyMapModule.parseConfigLines has cognitive complexity 42 (threshold 15). Drivers by points: match/switch 8 (37 pts), loops 2 (4 pts), boolean chains 1 (nesting depth added 31). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/RenderPipeline.fs"},"region":{"startLine":620}}}],"partialFingerprints":{"codehealthFindingId/v1":"e62dfdf3b1338046a1730b5f51892f9dc8292a313736e8b532fa4b25ea103c2b"}},{"ruleId":"D2","level":"warning","message":{"text":"HotReloading.hotReloadingMiddleware (cognitive 41): HotReloading.hotReloadingMiddleware has cognitive complexity 41 (threshold 15). Drivers by points: match/switch 15 (41 pts) (nesting depth added 26). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/HotReloading.fs"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf30d1599eaab078839a024be221ec9177f13a93439fbbb1dd422f1332125d24"}},{"ruleId":"D2","level":"warning","message":{"text":"ValueReadSim.runWith (cognitive 41): ValueReadSim.runWith has cognitive complexity 41 (threshold 15). Drivers by points: match/switch 19 (32 pts), boolean chains 5, loops 2 (4 pts) (nesting depth added 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. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/ValueReadSim.fs"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c604bcb7fefe7ff9284dc7e9c2d2997e7a6111fcca7d0da195ae7f6a3ea8bbb"}},{"ruleId":"D2","level":"warning","message":{"text":"AnsiEmitter.emitDiff (cognitive 41): AnsiEmitter.emitDiff has cognitive complexity 41 (threshold 15). Drivers by points: match/switch 8 (35 pts), loops 1 (4 pts), boolean chains 2 (nesting depth added 30). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/AnsiEmitter.fs"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d51517861b534df6177a7582b770999992c4e6a7d0e4a768cea846ad3aa07bb"}},{"ruleId":"D2","level":"warning","message":{"text":"NvimTour.parseLine (cognitive 41): NvimTour.parseLine has cognitive complexity 41 (threshold 15). Drivers by points: if/else 16 (31 pts), match/switch 3 (7 pts), boolean chains 3 (nesting depth added 19). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lemmings/ui/nvim/NvimTour.fs"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"0add928fb1977b3f247c39ff91f55b8008f913b028e1f814a04a93e653ded0de"}},{"ruleId":"D2","level":"warning","message":{"text":"DaemonMode.resumePreviousSessions (cognitive 40): DaemonMode.resumePreviousSessions has cognitive complexity 40 (threshold 15). Drivers by points: match/switch 19 (36 pts), loops 2 (4 pts) (nesting depth added 19). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DaemonMode.fs"},"region":{"startLine":1673}}}],"partialFingerprints":{"codehealthFindingId/v1":"dffbe4199fa6a786bff6210f216868b0e7270c23781982c983901415dc8467d8"}},{"ruleId":"D2","level":"warning","message":{"text":"onmessage (cognitive 39): onmessage has cognitive complexity 39 (threshold 15). Drivers by points: if/else 12 (16 pts), ternaries 6 (13 pts), boolean chains 7, error handling 2 (3 pts) (nesting depth added 12). Of this number, 32 points are the body\u0027s own statements and 7 belong to 8 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Resources/devreload.js"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f6275cd826a8ca50fd7259b51f5ebba55d237c2a6a2620231dc7741f0bbbfd3"}},{"ruleId":"D2","level":"warning","message":{"text":"onmessage (cognitive 39): onmessage has cognitive complexity 39 (threshold 15). Drivers by points: if/else 12 (16 pts), ternaries 6 (13 pts), boolean chains 7, error handling 2 (3 pts) (nesting depth added 12). Of this number, 32 points are the body\u0027s own statements and 7 belong to 8 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Host/Resources/devreload.js"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b4cc4a18107c05205a95b005ca445baa1538949e46e5e6f9e9f7d1d5109f1b7"}},{"ruleId":"D2","level":"warning","message":{"text":"renderErrorPanel (cognitive 38): renderErrorPanel has cognitive complexity 38 (threshold 15). Drivers by points: ternaries 10 (22 pts), boolean chains 6, if/else 5 (6 pts), loops 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":"SageFs/Resources/devreload.js"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"bde7d297a9c8d86edc99f820aa48d98b912befe4470e2fa573b83a3f9ce884c1"}},{"ruleId":"D2","level":"warning","message":{"text":"renderErrorPanel (cognitive 38): renderErrorPanel has cognitive complexity 38 (threshold 15). Drivers by points: ternaries 10 (22 pts), boolean chains 6, if/else 5 (6 pts), loops 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":"SageFs.Host/Resources/devreload.js"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"90415fe4b43549dc9fb92ba7355826c90691b63e6cfcac141aa81db983f84f58"}},{"ruleId":"D2","level":"warning","message":{"text":"DiagnosticStateTracker.ProcessDiagnosticsEvent (cognitive 37): DiagnosticStateTracker.ProcessDiagnosticsEvent has cognitive complexity 37 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio.Editor/DiagnosticStateTracker.cs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"84981a6fde74daa4359840d1b331496d4d90e9f97bd7d1b21d9a9d129628656e"}},{"ruleId":"D2","level":"warning","message":{"text":"HotReloadCore.handleNewAsmFromRepl (cognitive 37): HotReloadCore.handleNewAsmFromRepl has cognitive complexity 37 (threshold 15). Drivers by points: match/switch 11 (30 pts), error handling 1 (5 pts), boolean chains 2 (nesting depth added 23). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/HotReloadCore.fs"},"region":{"startLine":1565}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a9bb2234a541156acdc08b6e9fbe7e8d99d7a1b4c5683c14b0cf2f94f873c7b"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkerSpawn.startWorkerProcess (cognitive 37): WorkerSpawn.startWorkerProcess has cognitive complexity 37 (threshold 15). Drivers by points: error handling 4 (19 pts), match/switch 7 (18 pts) (nesting depth added 26). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/WorkerSpawn.fs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4c6bc62243f97c4d6f4167bee63560de45fc421c2d55d4d4f065277258a0172"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectLoading.loadSolution (cognitive 37): ProjectLoading.loadSolution has cognitive complexity 37 (threshold 15). Drivers by points: match/switch 9 (24 pts), error handling 2 (7 pts), loops 2 (4 pts), if/else 1 (2 pts) (nesting depth added 23). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/ProjectLoading.fs"},"region":{"startLine":664}}}],"partialFingerprints":{"codehealthFindingId/v1":"e29f650f90437e2bb20c11861cb98078baebdf9c580bc19b0a4469c755bec711"}},{"ruleId":"D2","level":"warning","message":{"text":"McpServer.createServerCaptureFilter (cognitive 37): McpServer.createServerCaptureFilter has cognitive complexity 37 (threshold 15). Drivers by points: match/switch 19 (29 pts), if/else 2 (4 pts), error handling 2 (3 pts), boolean chains 1 (nesting depth added 13). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpServer.fs"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"841e43ac56076674241bfbce337e2e4a2bbce10793195c64dc254bb6cf153e94"}},{"ruleId":"D2","level":"warning","message":{"text":"Dashboard.buildDashboardSnapshotWithSessions (cognitive 37): Dashboard.buildDashboardSnapshotWithSessions has cognitive complexity 37 (threshold 15). Drivers by points: match/switch 22 (37 pts) (nesting depth added 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. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Dashboard.fs"},"region":{"startLine":866}}}],"partialFingerprints":{"codehealthFindingId/v1":"f879e286fe6eb2c071fe38001ea2358875f10e41e5b3d4107dc76e8303e5914e"}},{"ruleId":"D2","level":"warning","message":{"text":"StatusBarManager.RunStartupHealthCheckAsync (cognitive 36): StatusBarManager.RunStartupHealthCheckAsync has cognitive complexity 36 (threshold 15). To reduce it, flatten the nesting: invert conditions into early returns or guard clauses so the happy path stays at one level, and lift the deepest nested block into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio/StatusBar/StatusBarManager.cs"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e24eb0f89aa75d05d50309ab5c3bd747b2a5ed0e8d38bdc36c920a5e2cf5581"}},{"ruleId":"D2","level":"warning","message":{"text":"SessionManager.stopWorker (cognitive 36): SessionManager.stopWorker has cognitive complexity 36 (threshold 15). Drivers by points: error handling 11 (28 pts), match/switch 3 (6 pts), if/else 1 (2 pts) (nesting depth added 21). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/SessionManager.fs"},"region":{"startLine":315}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4a8c0c375a330791fe9a33e514a0b2a8380d725d3513cc2d700be1c6c0cf58a"}},{"ruleId":"D2","level":"warning","message":{"text":"FrameDiff.parsePositionedLines (cognitive 36): FrameDiff.parsePositionedLines has cognitive complexity 36 (threshold 15). Drivers by points: match/switch 9 (29 pts), loops 2 (4 pts), boolean chains 3 (nesting depth added 22). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/TerminalUI.fs"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"50c7032492da26e850637de23fc03899177598eed76a25455e8d2a7a12840f7d"}},{"ruleId":"D2","level":"warning","message":{"text":"EnvCheck.sdkCheckFromInputs (cognitive 36): EnvCheck.sdkCheckFromInputs has cognitive complexity 36 (threshold 15). Drivers by points: match/switch 10 (35 pts), boolean chains 1 (nesting depth added 25). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/EnvCheck.fs"},"region":{"startLine":314}}}],"partialFingerprints":{"codehealthFindingId/v1":"bae583c9e79cfc9ac2c2d430171e22da2aeabc069144af2a874cdfefa5256f49"}},{"ruleId":"D2","level":"warning","message":{"text":"MachineProbeReader.storageOf (cognitive 35): MachineProbeReader.storageOf has cognitive complexity 35 (threshold 15). Drivers by points: match/switch 11 (33 pts), boolean chains 1, error handling 1 (nesting depth added 22). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/MachineProfile.fs"},"region":{"startLine":368}}}],"partialFingerprints":{"codehealthFindingId/v1":"6476d48c099f9ef9cae1ba4cfde416aba41022e1eb9cae7885576b3f4a68aac8"}},{"ruleId":"D2","level":"warning","message":{"text":"CohortInspector.search (cognitive 35): CohortInspector.search has cognitive complexity 35 (threshold 15). Drivers by points: if/else 16 (25 pts), match/switch 3 (6 pts), boolean chains 4 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/CohortInspector.fs"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4bf5aa19f15d641b7c498b52eaa3ab35e331c15065b5e0e5e42a1e763448085"}},{"ruleId":"D2","level":"warning","message":{"text":"HotReloadCore.applyDetourPlan (cognitive 34): HotReloadCore.applyDetourPlan has cognitive complexity 34 (threshold 15). Drivers by points: match/switch 20 (27 pts), loops 4, error handling 2 (3 pts) (nesting depth added 8). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/HotReloadCore.fs"},"region":{"startLine":843}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1f57e94ea1729a9700904aa1d5a8e6868d8114acf0bbf363c0c461da4d93fb4"}},{"ruleId":"D2","level":"warning","message":{"text":"Treemap.squarify (cognitive 34): Treemap.squarify has cognitive complexity 34 (threshold 15). Drivers by points: loops 4 (12 pts), match/switch 4 (12 pts), if/else 4 (8 pts), boolean chains 2 (nesting depth added 20). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/Treemap.fs"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa02086c9c099fd20fd935bde39c0e992f6f4b399141e9d2b86db9164cf7fc56"}},{"ruleId":"D2","level":"warning","message":{"text":"DashboardFragments.renderFailureNarratives (cognitive 34): DashboardFragments.renderFailureNarratives has cognitive complexity 34 (threshold 15). Drivers by points: if/else 11 (23 pts), match/switch 4 (9 pts), loops 1 (2 pts) (nesting depth added 18). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DashboardFragments.fs"},"region":{"startLine":588}}}],"partialFingerprints":{"codehealthFindingId/v1":"09b5f8d9f7c9de77a7006599df0074a2f6f807c28e5f21e2d1d3590233890591"}},{"ruleId":"D2","level":"warning","message":{"text":"HygieneGather.readProcesses (cognitive 34): HygieneGather.readProcesses has cognitive complexity 34 (threshold 15). Drivers by points: error handling 5 (17 pts), match/switch 6 (16 pts), boolean chains 1 (nesting depth added 22). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/HygieneGather.fs"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"1174b2657abcb3c7675b9352b7163a1d47609d569f97c3bb3208a6b1811adfcb"}},{"ruleId":"D2","level":"warning","message":{"text":"FsiHostClient.start (cognitive 33): FsiHostClient.start has cognitive complexity 33 (threshold 15). Drivers by points: match/switch 7 (20 pts), loops 3 (5 pts), error handling 4, if/else 2 (4 pts) (nesting depth added 17). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/FsiHostClient.fs"},"region":{"startLine":483}}}],"partialFingerprints":{"codehealthFindingId/v1":"366657516ffabd5cdc8acff16f6c27384a8e7878a84ceb7574d242001dd40162"}},{"ruleId":"D2","level":"warning","message":{"text":"TrunkFollow.step (cognitive 33): TrunkFollow.step has cognitive complexity 33 (threshold 15). Drivers by points: match/switch 12 (32 pts), boolean chains 1 (nesting depth added 20). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/TrunkFollow.fs"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"66024ca88e378787ad382d9f37d9c5600fed37b76aa7427c29815caa88014436"}},{"ruleId":"D2","level":"warning","message":{"text":"Session.Save (cognitive 33): Session.Save has cognitive complexity 33 (threshold 15). Drivers by points: match/switch 8 (27 pts), loops 1 (6 pts) (nesting depth added 24). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Host/RunAppDelta.fs"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b3b19c011de209b08bd7f5fd3fe02a9cdb38d69e6120ca9948f8778940a09fc"}},{"ruleId":"D2","level":"warning","message":{"text":"StateMachineRenderer.render (cognitive 32): StateMachineRenderer.render has cognitive complexity 32 (threshold 15). Drivers by points: match/switch 8 (22 pts), loops 5 (7 pts), boolean chains 3 (nesting depth added 16). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/DomainModelViz.fs"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4b774c698da54cd93130e88d76e368b5c5f9583229958477ead0dedfff7bc83"}},{"ruleId":"D2","level":"warning","message":{"text":"DashboardFragments.renderSessionContextPanel (cognitive 32): DashboardFragments.renderSessionContextPanel has cognitive complexity 32 (threshold 15). Drivers by points: match/switch 8 (22 pts), loops 6 (10 pts) (nesting depth added 18). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DashboardFragments.fs"},"region":{"startLine":3349}}}],"partialFingerprints":{"codehealthFindingId/v1":"283943bb16cb7a140e8ca07bf6aa941c7cb94eadd0855e05f259b66973ff9015"}},{"ruleId":"D2","level":"warning","message":{"text":"CohortGit.rebaseCommitsOnto (cognitive 32): CohortGit.rebaseCommitsOnto has cognitive complexity 32 (threshold 15). Drivers by points: match/switch 8 (32 pts) (nesting depth added 24). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/CohortGit.fs"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9eda0734758e82e02d6825a8cab358a88f075225c1562eaf61bec97c83310ad"}},{"ruleId":"D2","level":"warning","message":{"text":"AppRunOrchestration.runApp (cognitive 31): AppRunOrchestration.runApp has cognitive complexity 31 (threshold 15). Drivers by points: match/switch 9 (31 pts) (nesting depth added 22). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/AppRunOrchestration.fs"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"f07f6c61ca9d66371d3d765936848f96cdb85e78a0e2f86457712cb5cbb6ea46"}},{"ruleId":"D2","level":"warning","message":{"text":"SageFsTools.set_reflection_read_mode (cognitive 31): SageFsTools.set_reflection_read_mode has cognitive complexity 31 (threshold 15). Drivers by points: match/switch 9 (31 pts) (nesting depth added 22). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpTools.fs"},"region":{"startLine":1424}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe2b7e7802b59df445940e4eea14e8602fffad0b7d892f551da2cff11041c83e"}},{"ruleId":"D2","level":"warning","message":{"text":"McpTools.routeToSessionWithin (cognitive 31): McpTools.routeToSessionWithin has cognitive complexity 31 (threshold 15). Drivers by points: match/switch 7 (25 pts), error handling 2 (6 pts) (nesting depth added 22). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Mcp.fs"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e0c4bd19315c61f84b656eee86ae6e3077d49441d933c05382c6c3fad38569c"}},{"ruleId":"D2","level":"warning","message":{"text":"HygieneEdge.removeWorktree (cognitive 31): HygieneEdge.removeWorktree has cognitive complexity 31 (threshold 15). Drivers by points: match/switch 10 (31 pts) (nesting depth added 21). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/HygieneEdge.fs"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"60fa267d7f21290c7211452a21b75ede090076f926da04f153a8570a5b006b02"}},{"ruleId":"D2","level":"warning","message":{"text":"NvimOracle.daemonState (cognitive 31): NvimOracle.daemonState has cognitive complexity 31 (threshold 15). Drivers by points: match/switch 9 (28 pts), loops 1 (2 pts), boolean chains 1 (nesting depth added 20). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lemmings/ui/nvim/NvimOracle.fs"},"region":{"startLine":428}}}],"partialFingerprints":{"codehealthFindingId/v1":"e88ab1cc0d33f88fa34a4b3936020875b173b09c954ece6d482d2e8db046bc97"}},{"ruleId":"D2","level":"warning","message":{"text":"OpenDirective.openDirectiveMiddleware (cognitive 30): OpenDirective.openDirectiveMiddleware has cognitive complexity 30 (threshold 15). Drivers by points: match/switch 9 (21 pts), loops 2 (7 pts), boolean chains 2 (nesting depth added 17). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/Directives.fs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed3ae447cda413c2440cff70a783d43176b729720beccfeb7268e234c528a23b"}},{"ruleId":"D2","level":"warning","message":{"text":"McpServer.mapExecutionRoutes (cognitive 30): McpServer.mapExecutionRoutes has cognitive complexity 30 (threshold 15). Drivers by points: match/switch 20 (22 pts), boolean chains 3, error handling 2, if/else 1 (2 pts), loops 1 (nesting depth added 3). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpServer.fs"},"region":{"startLine":2032}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2847fd83a28a89e7719ed0a0a9698e939deaedffbe5e2614a26889acf58523b"}},{"ruleId":"D2","level":"warning","message":{"text":"SyntaxHighlight.tokenize (cognitive 30): SyntaxHighlight.tokenize has cognitive complexity 30 (threshold 15). Drivers by points: match/switch 6 (22 pts), loops 2 (8 pts) (nesting depth added 22). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/SyntaxHighlight.fs"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"455dc7a009dfb83e51d4f75627d350cd1d2f3ea6c9e06d619702bb4f5577568d"}},{"ruleId":"D2","level":"warning","message":{"text":"DashboardFragments.renderHighlightedLine (cognitive 29): DashboardFragments.renderHighlightedLine has cognitive complexity 29 (threshold 15). Drivers by points: match/switch 7 (24 pts), boolean chains 3, loops 1 (2 pts) (nesting depth added 18). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DashboardFragments.fs"},"region":{"startLine":727}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c241e79d674b5a90606fa4015bb192c87e15b8981ccc46e514fb63b95358478"}},{"ruleId":"D2","level":"warning","message":{"text":"TestStateTracker.ProcessResultsBatch (cognitive 28): TestStateTracker.ProcessResultsBatch has cognitive complexity 28 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio.Editor/TestStateTracker.cs"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"20c3f9c565a966260fa0fc90ea6576ceacdf29f07f492e849960e5dbb78b5cdd"}},{"ruleId":"D2","level":"warning","message":{"text":"ValueReads.fateAt (cognitive 28): ValueReads.fateAt has cognitive complexity 28 (threshold 15). Drivers by points: match/switch 10 (21 pts), if/else 5 (6 pts), boolean chains 1 (nesting depth added 12). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/ValueReads.fs"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"709e421b9bfb84e0e3aa45c4270de9f54a8e018304ad19e1829156935b65be66"}},{"ruleId":"D2","level":"warning","message":{"text":"DevReloadInjector.install (cognitive 28): DevReloadInjector.install has cognitive complexity 28 (threshold 15). Drivers by points: match/switch 7 (24 pts), error handling 1 (3 pts), boolean chains 1 (nesting depth added 19). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Host/DevReloadInjector.fs"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"853fd1c948ef9500d164ba03b24e20b57cc3ef83f81a27638efe7f7b74984cc1"}},{"ruleId":"D2","level":"warning","message":{"text":"HotReloadCore.resolveAssembly (cognitive 27): HotReloadCore.resolveAssembly has cognitive complexity 27 (threshold 15). Drivers by points: match/switch 5 (14 pts), error handling 5 (13 pts) (nesting depth added 17). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/HotReloadCore.fs"},"region":{"startLine":1748}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9295a758150a2c2bea781a855b1a0434685c815e2f4d58f9a95709979e2fed6"}},{"ruleId":"D2","level":"warning","message":{"text":"ExpensiveWorkLease.requestCore (cognitive 27): ExpensiveWorkLease.requestCore has cognitive complexity 27 (threshold 15). Drivers by points: match/switch 7 (18 pts), if/else 2 (5 pts), boolean chains 4 (nesting depth added 14). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/ExpensiveWorkLease.fs"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"450b7d5e54b2f4fc0314e54d39c1a8340987898288444903929491c2babc77f2"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkspaceHygieneRender.renderPlan (cognitive 27): WorkspaceHygieneRender.renderPlan has cognitive complexity 27 (threshold 15). Drivers by points: match/switch 5 (18 pts), loops 3 (9 pts) (nesting depth added 19). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/WorkspaceHygieneRender.fs"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f7375c438f2ca972f7b0e21888d1efbbc4a3b933fcc90439d113802a68e4c13"}},{"ruleId":"D2","level":"warning","message":{"text":"DevReloadMiddleware.createMiddleware (cognitive 27): DevReloadMiddleware.createMiddleware has cognitive complexity 27 (threshold 15). Drivers by points: match/switch 8 (25 pts), boolean chains 2 (nesting depth added 17). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Host/DevReloadMiddleware.fs"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"4588ceea138804c3541ee500ac9b1269b7076bfd1dc57e6a968aa794983b6a7b"}},{"ruleId":"D2","level":"warning","message":{"text":"TrunkFollowShell.move (cognitive 27): TrunkFollowShell.move has cognitive complexity 27 (threshold 15). Drivers by points: match/switch 7 (26 pts), boolean chains 1 (nesting depth added 19). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/TrunkFollowShell.fs"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"f72ce17cef890ed8eaebf660061462916d6a8dc56c9060f4a2a1c01a59b9a467"}},{"ruleId":"D2","level":"warning","message":{"text":"McpTools.createSession (cognitive 27): McpTools.createSession has cognitive complexity 27 (threshold 15). Drivers by points: match/switch 7 (27 pts) (nesting depth added 20). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Mcp.fs"},"region":{"startLine":2161}}}],"partialFingerprints":{"codehealthFindingId/v1":"188007d562520339a6ebf14f53680287bc9b117ba24cf2f7be8bd37056eaef12"}},{"ruleId":"D2","level":"warning","message":{"text":"McpTools.manageScratchPad (cognitive 27): McpTools.manageScratchPad has cognitive complexity 27 (threshold 15). Drivers by points: match/switch 8 (27 pts) (nesting depth added 19). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Mcp.fs"},"region":{"startLine":3013}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8f82a2537e3af25e1e3ee6b97847b02cf001f12f4bc91291c4af0b3e98e54bf"}},{"ruleId":"D2","level":"warning","message":{"text":"McpAnalysisViews.suggestRepairJson (cognitive 27): McpAnalysisViews.suggestRepairJson has cognitive complexity 27 (threshold 15). Drivers by points: match/switch 7 (21 pts), if/else 2 (6 pts) (nesting depth added 18). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpAnalysisViews.fs"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"ede4bab6011097ce418666cb9343c02d7fd54d5775436ed04f00c264a26964c8"}},{"ruleId":"D2","level":"warning","message":{"text":"HotReloading.injectNoInlining (cognitive 26): HotReloading.injectNoInlining has cognitive complexity 26 (threshold 15). Drivers by points: match/switch 6 (12 pts), boolean chains 5, if/else 2 (5 pts), loops 2 (4 pts) (nesting depth added 11). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/HotReloading.fs"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"d93d543e293fe7d06a683e10191857debcb2bd74086846c33ec3d9a10dc88732"}},{"ruleId":"D2","level":"warning","message":{"text":"GenericReload.sharedStub (cognitive 26): GenericReload.sharedStub has cognitive complexity 26 (threshold 15). Drivers by points: match/switch 9 (19 pts), loops 2 (6 pts), error handling 1 (nesting depth added 14). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/GenericReload.fs"},"region":{"startLine":504}}}],"partialFingerprints":{"codehealthFindingId/v1":"b459d5dd4f83bdb19ecc9df4db8433b59087704ef7664fc27cd1556600ff2f31"}},{"ruleId":"D2","level":"warning","message":{"text":"HealthAnomaly.step (cognitive 26): HealthAnomaly.step has cognitive complexity 26 (threshold 15). Drivers by points: if/else 13 (20 pts), match/switch 2 (6 pts) (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/HealthAnomaly.fs"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6eea96c4f858bd301ca59474ddd7e719b059afe05b5befde2549a33585975e5"}},{"ruleId":"D2","level":"warning","message":{"text":"ExpectoExecutor.runReflectedBody (cognitive 26): ExpectoExecutor.runReflectedBody has cognitive complexity 26 (threshold 15). Drivers by points: match/switch 7 (16 pts), error handling 4 (8 pts), boolean chains 2 (nesting depth added 13). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveTestingExecutors.fs"},"region":{"startLine":578}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a4ae8715baa17777626b66af32e22a6246a42085d398b6922ed5ea42f65e78e"}},{"ruleId":"D2","level":"warning","message":{"text":"Checkout.classify (cognitive 26): Checkout.classify has cognitive complexity 26 (threshold 15). Drivers by points: match/switch 9 (22 pts), error handling 1 (3 pts), boolean chains 1 (nesting depth added 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. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Checkout.fs"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"55682419376fb9799a47be361e3ffcd082409e080c10545518a4272a4aa3e187"}},{"ruleId":"D2","level":"warning","message":{"text":"GuardSim.step (cognitive 26): GuardSim.step has cognitive complexity 26 (threshold 15). Drivers by points: match/switch 12 (26 pts) (nesting depth added 14). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/GuardSim.fs"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"10d35684b007068ae08793c8e68f11fd6b26d576b0e8f5dfc58c9980b9b6e994"}},{"ruleId":"D2","level":"warning","message":{"text":"DaemonMode.createElmRuntime (cognitive 26): DaemonMode.createElmRuntime has cognitive complexity 26 (threshold 15). Drivers by points: match/switch 12 (19 pts), error handling 6, boolean chains 1 (nesting depth added 7). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DaemonMode.fs"},"region":{"startLine":1856}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4f17d95154693b24166cf28050429244319dbcc24ffaa8f03abb948e2d032a3"}},{"ruleId":"D2","level":"warning","message":{"text":"Dashboard.createSessionActionHandler (cognitive 26): Dashboard.createSessionActionHandler has cognitive complexity 26 (threshold 15). Drivers by points: match/switch 9 (18 pts), error handling 3, if/else 2 (3 pts), boolean chains 2 (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Dashboard.fs"},"region":{"startLine":2106}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ed272df361c15e41b9106f36019584e30335c25170c43068ae439060e6efa78"}},{"ruleId":"D2","level":"warning","message":{"text":"StartDaemonCommand.ExecuteCommandAsync (cognitive 25): StartDaemonCommand.ExecuteCommandAsync has cognitive complexity 25 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio/Commands/DaemonCommands.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c5a26527d076063e71349305a86b78c42d56131f59492eb11d9c05d34682001"}},{"ruleId":"D2","level":"warning","message":{"text":"EvalFileCommand.ExecuteCommandAsync (cognitive 25): EvalFileCommand.ExecuteCommandAsync has cognitive complexity 25 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio/Commands/EvalFileCommand.cs"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"122a63bc286a5863943641a349120ed074e0bcf9fab55ea808a6a42dbde90687"}},{"ruleId":"D2","level":"warning","message":{"text":"EvalStore.materializeScope (cognitive 25): EvalStore.materializeScope has cognitive complexity 25 (threshold 15). Drivers by points: match/switch 7 (18 pts), loops 5 (7 pts) (nesting depth added 13). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/EvalStore.fs"},"region":{"startLine":359}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1824389889f562eb499ce4ed390a6dea27a0a9c38371284b352dffe5de4a7b2"}},{"ruleId":"D2","level":"warning","message":{"text":"LiveValueTree.classify (cognitive 25): LiveValueTree.classify has cognitive complexity 25 (threshold 15). Drivers by points: if/else 14 (15 pts), boolean chains 8, match/switch 1 (2 pts) (nesting depth added 2). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveValueTree.fs"},"region":{"startLine":471}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b1d8e9e90ca7bf2c79377709910c685e33d96f1db003040cb8441f241386fcc"}},{"ruleId":"D2","level":"warning","message":{"text":"HttpWorkerClient.streamRun (cognitive 25): HttpWorkerClient.streamRun has cognitive complexity 25 (threshold 15). Drivers by points: match/switch 7 (23 pts), error handling 1, loops 1 (nesting depth added 16). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/HttpWorkerClient.fs"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"4645eee4150ccf44fe293fd352cb23e1ecff38034cb3e6d13c95bcd2dec23bd9"}},{"ruleId":"D2","level":"warning","message":{"text":"McpStdioBridge.run (cognitive 25): McpStdioBridge.run has cognitive complexity 25 (threshold 15). Drivers by points: match/switch 11 (21 pts), loops 1 (3 pts), error handling 1 (nesting depth added 12). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpStdioBridge.fs"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"511a7deecc8c7dff40ff3a5f0fd0fcd406abc07d3fd71b690dbe998955288c90"}},{"ruleId":"D2","level":"warning","message":{"text":"Dashboard.createToggleWarmupAutoOpenHandler (cognitive 25): Dashboard.createToggleWarmupAutoOpenHandler has cognitive complexity 25 (threshold 15). Drivers by points: match/switch 8 (22 pts), error handling 3 (nesting depth added 14). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Dashboard.fs"},"region":{"startLine":2633}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a31a0e24a226964d20bcd18f0bd3b669efafac53362d34c7ae1b149d6113e0f"}},{"ruleId":"D2","level":"warning","message":{"text":"Dashboard.createApiStateHandler (cognitive 25): Dashboard.createApiStateHandler has cognitive complexity 25 (threshold 15). Drivers by points: error handling 8 (15 pts), loops 2 (4 pts), match/switch 3, if/else 2, boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Dashboard.fs"},"region":{"startLine":2703}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f2f6b9a1c33799849c3aea115ca63bb9761a6b4b1d5263e64988bcb5959aabb"}},{"ruleId":"D2","level":"warning","message":{"text":"McpTools.switchWorkflow (cognitive 25): McpTools.switchWorkflow has cognitive complexity 25 (threshold 15). Drivers by points: match/switch 7 (25 pts) (nesting depth added 18). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Mcp.fs"},"region":{"startLine":2289}}}],"partialFingerprints":{"codehealthFindingId/v1":"59a3294b8822edb6daba0a09b2b1fb965dd2f4ca2d09ce69c9853c82877c2093"}},{"ruleId":"D2","level":"warning","message":{"text":"Nvim.parseKeys (cognitive 25): Nvim.parseKeys has cognitive complexity 25 (threshold 15). Drivers by points: if/else 7 (12 pts), match/switch 3 (10 pts), boolean chains 2, loops 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lemmings/ui/nvim/Nvim.fs"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f6474c02c4971df23612e6bc4d22a1bbb967efbff542e48638978ac88ae4c72"}},{"ruleId":"D2","level":"warning","message":{"text":"Diagnostician.summarize (cognitive 24): Diagnostician.summarize has cognitive complexity 24 (threshold 15). Drivers by points: match/switch 11 (24 pts) (nesting depth added 13). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/Diagnostician.fs"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff6b080a5efd2bdc24cb767fcf094465dac7667e7cb6bafbbe81eba941329771"}},{"ruleId":"D2","level":"warning","message":{"text":"ReflectionExecutor.invokeWith (cognitive 24): ReflectionExecutor.invokeWith has cognitive complexity 24 (threshold 15). Drivers by points: match/switch 8 (20 pts), error handling 3, boolean chains 1 (nesting depth added 12). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveTestingExecutors.fs"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"813b6e948b061becaf7bbdb6b10cc488f2724df7d36a7bd96e364bac144fa0df"}},{"ruleId":"D2","level":"warning","message":{"text":"CoverageInstrumenter.insertBeforeWithFixup (cognitive 24): CoverageInstrumenter.insertBeforeWithFixup has cognitive complexity 24 (threshold 15). Drivers by points: match/switch 8 (19 pts), loops 3 (5 pts) (nesting depth added 13). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/CoverageInstrumenter.fs"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"513c78c4dbf2cdeea8ef783e9a68b013adb241db9b3bb6cc9821d38223b9f16f"}},{"ruleId":"D2","level":"warning","message":{"text":"CoverageBitmapModule.narrowByLines (cognitive 24): CoverageBitmapModule.narrowByLines has cognitive complexity 24 (threshold 15). Drivers by points: match/switch 6 (19 pts), loops 1 (3 pts), boolean chains 2 (nesting depth added 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. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveTestingTypes.fs"},"region":{"startLine":917}}}],"partialFingerprints":{"codehealthFindingId/v1":"303181579372644b822be7b4145506576ba0edc690fa7cd7301fe92ba11f72d6"}},{"ruleId":"D2","level":"warning","message":{"text":"SageFsTools.reset_hot_reload_state (cognitive 24): SageFsTools.reset_hot_reload_state has cognitive complexity 24 (threshold 15). Drivers by points: match/switch 7 (19 pts), loops 1 (5 pts) (nesting depth added 16). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpTools.fs"},"region":{"startLine":1347}}}],"partialFingerprints":{"codehealthFindingId/v1":"d669f5a13f898dcdfa0040edfd34b97db98260b771321409e5434a763ced602c"}},{"ruleId":"D2","level":"warning","message":{"text":"DashboardTypes.resolveSessionProjects (cognitive 24): DashboardTypes.resolveSessionProjects has cognitive complexity 24 (threshold 15). Drivers by points: match/switch 11 (23 pts), boolean chains 1 (nesting depth added 12). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DashboardTypes.fs"},"region":{"startLine":1584}}}],"partialFingerprints":{"codehealthFindingId/v1":"92e7870a53905a98ba551abaf1a094b07178ee530949a147205a7d6f66745c99"}},{"ruleId":"D2","level":"warning","message":{"text":"McpCohortIntegration.setIntegrationRef (cognitive 24): McpCohortIntegration.setIntegrationRef has cognitive complexity 24 (threshold 15). Drivers by points: match/switch 10 (24 pts) (nesting depth added 14). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpCohortIntegration.fs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"087099546f3dcc7c52ccf2748e8f54bd8fbc27a29c11ef91359f7c8a4b0404f5"}},{"ruleId":"D2","level":"warning","message":{"text":"Draw.textHighlighted (cognitive 24): Draw.textHighlighted has cognitive complexity 24 (threshold 15). Drivers by points: match/switch 5 (15 pts), loops 2 (6 pts), boolean chains 3 (nesting depth added 14). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Draw.fs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"91c170e971a10e93211595301a4ec1ff607ca65e06e96fb5d56b52469d550352"}},{"ruleId":"D2","level":"warning","message":{"text":"SseClient.LoopAsync (cognitive 23): SseClient.LoopAsync has cognitive complexity 23 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio.Editor/SseClient.cs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f61bf5f71992623188f686ad260415143b9c2086cb72af2284b273772d6a175"}},{"ruleId":"D2","level":"warning","message":{"text":"CohortStatusText.render (cognitive 23): CohortStatusText.render has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (13 pts), match/switch 3 (6 pts), loops 3 (4 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/CohortStatusText.fs"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3c0f0fe0c34a147ebc7d4277401d9ef6fe34a03f6553843c935313b0fa6d99b"}},{"ruleId":"D2","level":"warning","message":{"text":"FsiProtocol.writeValue (cognitive 23): FsiProtocol.writeValue has cognitive complexity 23 (threshold 15). Drivers by points: if/else 12 (13 pts), loops 4 (9 pts), boolean chains 1 (nesting depth added 6). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.FsiHost/FsiProtocol.fs"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f79b5b746e04b112b80466ce59971e3edda86ef7b8b40a4ca8285b71c1adc2a"}},{"ruleId":"D2","level":"warning","message":{"text":"Program.main (cognitive 23): Program.main has cognitive complexity 23 (threshold 15). Drivers by points: match/switch 9 (20 pts), loops 1 (3 pts) (nesting depth added 13). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Program.fs"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"6868441b4b06d4c97b51581987f231d6caf64513f559324dd53e2de8ae4a6827"}},{"ruleId":"D2","level":"warning","message":{"text":"ValueReads.decode (cognitive 22): ValueReads.decode has cognitive complexity 22 (threshold 15). Drivers by points: match/switch 6 (15 pts), loops 1 (5 pts), boolean chains 2 (nesting depth added 13). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/ValueReads.fs"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f27a44390e6eda29f2603d9211f0f46bfaa31684b2be85f7cf511df0f65075b"}},{"ruleId":"D2","level":"warning","message":{"text":"LiveValueTree.decode (cognitive 22): LiveValueTree.decode has cognitive complexity 22 (threshold 15). Drivers by points: match/switch 8 (15 pts), loops 2 (5 pts), boolean chains 2 (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveValueTree.fs"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1fde638cfe947590ad1e78652936b71aa6e8b21f85e0c81c035d818bda057ff"}},{"ruleId":"D2","level":"warning","message":{"text":"CoreEvidence.evidenceFor (cognitive 22): CoreEvidence.evidenceFor has cognitive complexity 22 (threshold 15). Drivers by points: match/switch 7 (22 pts) (nesting depth added 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. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/CoreEvidence.fs"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"512876e522ceb2d065590ea5f1bd4f87814452b2348a78f2a020795c53b4b1f2"}},{"ruleId":"D2","level":"warning","message":{"text":"AppRunner.launch (cognitive 22): AppRunner.launch has cognitive complexity 22 (threshold 15). Drivers by points: match/switch 11 (20 pts), boolean chains 1, error handling 1 (nesting depth added 9). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Host/AppRunner.fs"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"b063739dddb0bd52a0da188330408042f7cf8393d403b7542e42015a0cf09ad7"}},{"ruleId":"D2","level":"warning","message":{"text":"CompilationContext.transformWholeFile (cognitive 21): CompilationContext.transformWholeFile has cognitive complexity 21 (threshold 15). Drivers by points: match/switch 8 (20 pts), boolean chains 1 (nesting depth added 12). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/CompilationContext.fs"},"region":{"startLine":327}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e61af0dd3746131c1709d2969ffb55b3544fe3c230711d839a662769486dd69"}},{"ruleId":"D2","level":"warning","message":{"text":"HotReloadCore.prepareGenericUnit (cognitive 21): HotReloadCore.prepareGenericUnit has cognitive complexity 21 (threshold 15). Drivers by points: match/switch 6 (17 pts), error handling 2 (4 pts) (nesting depth added 13). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/HotReloadCore.fs"},"region":{"startLine":767}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4fbf87366f0405e10075d016bffc3046c589ca4ba528b83e1bc7b8685fab1ce"}},{"ruleId":"D2","level":"warning","message":{"text":"DUExtractor.extractTransitionsFromSignature (cognitive 21): DUExtractor.extractTransitionsFromSignature has cognitive complexity 21 (threshold 15). Drivers by points: match/switch 7 (18 pts), boolean chains 3 (nesting depth added 11). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/DomainModelViz.fs"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1b735cf8da0fed11bce3e03d9ab474d9020a6dcc9a8130fef50020764cf3134"}},{"ruleId":"D2","level":"warning","message":{"text":"TweakTransaction.step (cognitive 21): TweakTransaction.step has cognitive complexity 21 (threshold 15). Drivers by points: match/switch 11 (21 pts) (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/Tweak/TweakTransaction.fs"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"82766c003eeb27ccc1b8432bf9585982ca3ccdfc1bc9fae4b0cd7b417c590441"}},{"ruleId":"D2","level":"warning","message":{"text":"ReloadPlanning.innerNamesOf (cognitive 21): ReloadPlanning.innerNamesOf has cognitive complexity 21 (threshold 15). Drivers by points: match/switch 6 (20 pts), error handling 1 (nesting depth added 14). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/ReloadPlanning.fs"},"region":{"startLine":991}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cee92195e4c05c328968fb076ff6a23d7e57d3633caddef923e1e6fe653e442"}},{"ruleId":"D2","level":"warning","message":{"text":"RuntimeCompat.parseRuntimeRequirement (cognitive 21): RuntimeCompat.parseRuntimeRequirement has cognitive complexity 21 (threshold 15). Drivers by points: match/switch 8 (13 pts), if/else 2 (4 pts), loops 1 (3 pts), error handling 1 (nesting depth added 9). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/RuntimeCompat.fs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"38145982cd1862599673dc9caaac197b62b26d770676fe49566afd97cedf3956"}},{"ruleId":"D2","level":"warning","message":{"text":"ReadyWaitSim.apply (cognitive 21): ReadyWaitSim.apply has cognitive complexity 21 (threshold 15). Drivers by points: match/switch 11 (21 pts) (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/ReadyWaitSim.fs"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"81f7f638f3b9f9981764e948350c66b24e5df33d81720138be9139cdc7a55333"}},{"ruleId":"D2","level":"warning","message":{"text":"PatchConfirmationSim.step (cognitive 21): PatchConfirmationSim.step has cognitive complexity 21 (threshold 15). Drivers by points: match/switch 9 (19 pts), loops 1 (2 pts) (nesting depth added 11). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/PatchConfirmationSim.fs"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0f70633c991ce0c450970370f3f471929c26d46534a6838ffef16a53fa418f0"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkerLifecycleSim.stepReal (cognitive 21): WorkerLifecycleSim.stepReal has cognitive complexity 21 (threshold 15). Drivers by points: match/switch 8 (21 pts) (nesting depth added 13). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/WorkerLifecycleSim.fs"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"0980ab828830c5419705dfdf0517c0ba2e51cd3223fcf038c2de73fbc10fa2d1"}},{"ruleId":"D2","level":"warning","message":{"text":"Dashboard.createEvalFileHandler (cognitive 21): Dashboard.createEvalFileHandler has cognitive complexity 21 (threshold 15). Drivers by points: match/switch 8 (15 pts), boolean chains 4, error handling 2 (nesting depth added 7). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Dashboard.fs"},"region":{"startLine":1680}}}],"partialFingerprints":{"codehealthFindingId/v1":"b66da0946480e494c0613f5ddec461299ffcb80d25441da7414265e4dd391b7a"}},{"ruleId":"D2","level":"warning","message":{"text":"CohortInspector.memberFields (cognitive 21): CohortInspector.memberFields has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (13 pts), match/switch 4 (8 pts) (nesting depth added 9). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/CohortInspector.fs"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"405ad348c49401e40ea3b06b9af88832609f6bdeabccba3c050d42fcf4b95f51"}},{"ruleId":"D2","level":"warning","message":{"text":"DashboardFragments.renderHotReloadPanelFull (cognitive 21): DashboardFragments.renderHotReloadPanelFull has cognitive complexity 21 (threshold 15). Drivers by points: match/switch 16 (19 pts), boolean chains 1, loops 1 (nesting depth added 3). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DashboardFragments.fs"},"region":{"startLine":2496}}}],"partialFingerprints":{"codehealthFindingId/v1":"6be0bbacac0a53a375f9ff0c6dec11fc1348e64dfdc1bdbb36b15fc5ea055b69"}},{"ruleId":"D2","level":"warning","message":{"text":"DashboardFragments.renderBindingsPanel (cognitive 21): DashboardFragments.renderBindingsPanel has cognitive complexity 21 (threshold 15). Drivers by points: match/switch 5 (14 pts), loops 2 (7 pts) (nesting depth added 14). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DashboardFragments.fs"},"region":{"startLine":3516}}}],"partialFingerprints":{"codehealthFindingId/v1":"00bf6ca68775cef29fc9f6bd58bffe3d346687c0a6b2b03746c200b3338e18a4"}},{"ruleId":"D2","level":"warning","message":{"text":"McpAnalysisViews.explainTestFailureJson (cognitive 21): McpAnalysisViews.explainTestFailureJson has cognitive complexity 21 (threshold 15). Drivers by points: match/switch 8 (21 pts) (nesting depth added 13). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpAnalysisViews.fs"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e284027976cde6f804ad259dfd5156c22b4d07ac95faeecd718973dcc628076"}},{"ruleId":"D2","level":"warning","message":{"text":"SessionPathValidation.validateSessionCreateRequest (cognitive 21): SessionPathValidation.validateSessionCreateRequest has cognitive complexity 21 (threshold 15). Drivers by points: match/switch 6 (19 pts), boolean chains 2 (nesting depth added 13). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/SessionPathValidation.fs"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"e50628bd2e2a5bd8555c40810356029d689466df9f8f7cffd24efecc47a13313"}},{"ruleId":"D2","level":"warning","message":{"text":"Decoding.decodeEvent (cognitive 21): Decoding.decodeEvent has cognitive complexity 21 (threshold 15). Drivers by points: match/switch 6 (21 pts) (nesting depth added 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. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/FrictionSqlite.fs"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"00c5a8e60397d0cefc97c5e2aec301ce2070d4047eed9792baa8e59f185ac0a4"}},{"ruleId":"D2","level":"warning","message":{"text":"DaemonClient.parseStateEvent (cognitive 21): DaemonClient.parseStateEvent has cognitive complexity 21 (threshold 15). Drivers by points: match/switch 14 (16 pts), error handling 3 (5 pts) (nesting depth added 4). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DaemonClient.fs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5e85a3febf945514777901d1cd4f5e5d3d208a64920e4ac511feef7225ddcc5"}},{"ruleId":"D2","level":"warning","message":{"text":"NvimOracle.dropMcpOnlyFindings (cognitive 21): NvimOracle.dropMcpOnlyFindings has cognitive complexity 21 (threshold 15). Drivers by points: if/else 3 (10 pts), match/switch 3 (8 pts), loops 1 (2 pts), boolean chains 1 (nesting depth added 13). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lemmings/ui/nvim/NvimOracle.fs"},"region":{"startLine":534}}}],"partialFingerprints":{"codehealthFindingId/v1":"e45f98e36537d9ad6f3a1daabf82195fec06334a7387f797f283420e60dcf44e"}},{"ruleId":"D2","level":"warning","message":{"text":"NvimTour.run (cognitive 21): NvimTour.run has cognitive complexity 21 (threshold 15). Drivers by points: if/else 4 (11 pts), match/switch 3 (6 pts), loops 1 (4 pts) (nesting depth added 13). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lemmings/ui/nvim/NvimTour.fs"},"region":{"startLine":392}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fb8c7dcfe698c63509aa047c0feb5a847b045131cb08a1efdecc16fd52b1110"}},{"ruleId":"D2","level":"warning","message":{"text":"createSseSubscriber.startListening (cognitive 21): createSseSubscriber.startListening has cognitive complexity 21 (threshold 15). Drivers by points: error handling 3 (8 pts), if/else 7 (8 pts), boolean chains 4, loops 1 (nesting depth added 6). Most of this is not in the body itself: 0 of the 21 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 61, 40). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vscode/src/sse-helpers.js"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9db7c1115b6b26db4aa707400d4c41c736120f7e2d43f46ddd7f5e6d7100730"}},{"ruleId":"D2","level":"warning","message":{"text":"NextBlockCommand.FindNextBlock (cognitive 20): NextBlockCommand.FindNextBlock has cognitive complexity 20 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio/Commands/CellNavigationCommands.cs"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed370b75375fbab466d01a1926def92719dbade475508ff31f6fceb69c1bf4e8"}},{"ruleId":"D2","level":"warning","message":{"text":"HotReloading.isMultiLineFunctionBinding (cognitive 20): HotReloading.isMultiLineFunctionBinding has cognitive complexity 20 (threshold 15). Drivers by points: match/switch 5 (14 pts), boolean chains 3, loops 1 (3 pts) (nesting depth added 11). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/HotReloading.fs"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"2261504093fdda6afd03b45614a322be2d9d85512e0719e81546fd29482ef872"}},{"ruleId":"D2","level":"warning","message":{"text":"CompilationContext.preprocessForFsi (cognitive 20): CompilationContext.preprocessForFsi has cognitive complexity 20 (threshold 15). Drivers by points: match/switch 7 (19 pts), boolean chains 1 (nesting depth added 12). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/CompilationContext.fs"},"region":{"startLine":519}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8bf71e74fff092a27a57b081ef80dfafce724e76d6365c9d901ef6e61079a58"}},{"ruleId":"D2","level":"warning","message":{"text":"ValueReadTracking.checkEntryWatch (cognitive 20): ValueReadTracking.checkEntryWatch has cognitive complexity 20 (threshold 15). Drivers by points: error handling 2 (10 pts), match/switch 3 (7 pts), loops 1 (3 pts) (nesting depth added 14). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/ValueReadTracking.fs"},"region":{"startLine":895}}}],"partialFingerprints":{"codehealthFindingId/v1":"12da861cc2045df1c57535a021b0596883955112b81e8249c6e0fc61b5edfebc"}},{"ruleId":"D2","level":"warning","message":{"text":"LiveTestCycleStateModule.handleFcsResult (cognitive 20): LiveTestCycleStateModule.handleFcsResult has cognitive complexity 20 (threshold 15). Drivers by points: match/switch 11 (19 pts), boolean chains 1 (nesting depth added 8). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveTestingCycle.fs"},"region":{"startLine":876}}}],"partialFingerprints":{"codehealthFindingId/v1":"550c63874ae932e083b4f1b3411973ba77f8eef140bdacc9ce854213e937e4d6"}},{"ruleId":"D2","level":"warning","message":{"text":"McpServer.readOptionalProjectName (cognitive 20): McpServer.readOptionalProjectName has cognitive complexity 20 (threshold 15). Drivers by points: match/switch 5 (15 pts), error handling 1 (4 pts), boolean chains 1 (nesting depth added 13). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpServer.fs"},"region":{"startLine":804}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed5692e31a1273a379aa14fdc5d890f922885933fa307fac099ac776816037fb"}},{"ruleId":"D2","level":"warning","message":{"text":"DashboardFragments.renderCohortPanel (cognitive 20): DashboardFragments.renderCohortPanel has cognitive complexity 20 (threshold 15). Drivers by points: match/switch 5 (12 pts), loops 2 (5 pts), if/else 2, boolean chains 1 (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DashboardFragments.fs"},"region":{"startLine":2943}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f23cac02c3fd6c945771a2becc9788a933d6c5b7b459532e8144d8a9101e7b6"}},{"ruleId":"D2","level":"warning","message":{"text":"McpTools.evalFSharpCodeWithOutcome (cognitive 20): McpTools.evalFSharpCodeWithOutcome has cognitive complexity 20 (threshold 15). Drivers by points: match/switch 6 (12 pts), error handling 2 (6 pts), loops 1 (2 pts) (nesting depth added 11). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Mcp.fs"},"region":{"startLine":1131}}}],"partialFingerprints":{"codehealthFindingId/v1":"c875f087eb94df88b44a8cf8fbc50e492fc29daacc87e2a28441085b319e7e0a"}},{"ruleId":"D2","level":"warning","message":{"text":"SageFsEffectHandler.startConfirmationBuild (cognitive 20): SageFsEffectHandler.startConfirmationBuild has cognitive complexity 20 (threshold 15). Drivers by points: match/switch 6 (16 pts), error handling 3 (4 pts) (nesting depth added 11). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/SageFsEffectHandler.fs"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"46d4c557150bc9727d2126c6b8fbb6e551d52be07243189cc72b27a3e2a70da0"}},{"ruleId":"D2","level":"warning","message":{"text":"DaemonClient.runSseListener (cognitive 20): DaemonClient.runSseListener has cognitive complexity 20 (threshold 15). Drivers by points: match/switch 3 (10 pts), error handling 3 (7 pts), loops 2 (3 pts) (nesting depth added 12). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DaemonClient.fs"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9a038558cda70ecab671471122d06fdfaf818d3b419e3f5b8cb76352cce0718"}},{"ruleId":"D2","level":"warning","message":{"text":"AnsiEmitter.emit (cognitive 20): AnsiEmitter.emit has cognitive complexity 20 (threshold 15). Drivers by points: match/switch 4 (13 pts), loops 3 (6 pts), boolean chains 1 (nesting depth added 12). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident. This shape REPEATS in the file: one other method here (AnsiEmitter.emitGridOnly) 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":"SageFs/AnsiEmitter.fs"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"636ab2fd943368ad250909a8ca7587b8de1474600b5a7f2f6cdb01ba6c00b978"}},{"ruleId":"D2","level":"warning","message":{"text":"AnsiEmitter.emitGridOnly (cognitive 20): AnsiEmitter.emitGridOnly has cognitive complexity 20 (threshold 15). Drivers by points: match/switch 4 (13 pts), loops 3 (6 pts), boolean chains 1 (nesting depth added 12). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident. This shape REPEATS in the file: one other method here (AnsiEmitter.emit) 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":"SageFs/AnsiEmitter.fs"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7271228874f30b70b60a491fad6e2ef7fd64ef09db9b773c6aabfe8fe8eae97"}},{"ruleId":"D2","level":"warning","message":{"text":"Nvim.parseShellCommand (cognitive 20): Nvim.parseShellCommand has cognitive complexity 20 (threshold 15). Drivers by points: match/switch 8 (18 pts), boolean chains 2 (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lemmings/ui/nvim/Nvim.fs"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"720e5f790bf8d11ec8800939aa56a291082a4a4ceb2c1a6a5fc2fef36e102b7f"}},{"ruleId":"D2","level":"warning","message":{"text":"CompilationContext.locateBlock (cognitive 19): CompilationContext.locateBlock has cognitive complexity 19 (threshold 15). Drivers by points: match/switch 5 (14 pts), if/else 2 (4 pts), boolean chains 1 (nesting depth added 11). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/CompilationContext.fs"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"c575cef6e64cbcd13256c8f4a12c8acbad29a3d58014c2a308ec2997119f6391"}},{"ruleId":"D2","level":"warning","message":{"text":"EvaluableSubmissionModule.classify (cognitive 19): EvaluableSubmissionModule.classify has cognitive complexity 19 (threshold 15). Drivers by points: match/switch 6 (17 pts), error handling 1 (2 pts) (nesting depth added 12). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/EvaluableSubmission.fs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8c5b6049bc411351e49210570364ca8e612f2133c7a830bc2b022df967b31e2"}},{"ruleId":"D2","level":"warning","message":{"text":"ValueReadHooks.GetterEntered (cognitive 19): ValueReadHooks.GetterEntered has cognitive complexity 19 (threshold 15). Drivers by points: error handling 3 (8 pts), match/switch 4 (8 pts), loops 1 (2 pts), boolean chains 1 (nesting depth added 10). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/ValueReadTracking.fs"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fea713a7963eb8c51eab32aa03a3b468090417c9d9f142b62969314fd0ca03b"}},{"ruleId":"D2","level":"warning","message":{"text":"IsolatedFsiSession.rewriteProjectFSharpCoreReferences (cognitive 19): IsolatedFsiSession.rewriteProjectFSharpCoreReferences has cognitive complexity 19 (threshold 15). Drivers by points: match/switch 4 (14 pts), error handling 1 (4 pts), loops 1 (nesting depth added 13). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/IsolatedFsiSession.fs"},"region":{"startLine":469}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f6b16be659aad77c1e27a63461950a250360ba982605520ff148308928b364f"}},{"ruleId":"D2","level":"warning","message":{"text":"ReloadPlanning.lambdaDiff (cognitive 19): ReloadPlanning.lambdaDiff has cognitive complexity 19 (threshold 15). Drivers by points: match/switch 6 (18 pts), boolean chains 1 (nesting depth added 12). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/ReloadPlanning.fs"},"region":{"startLine":722}}}],"partialFingerprints":{"codehealthFindingId/v1":"31de942f577268ba26a5707840a94caf3891da6656b97d93580c07a7e0f84702"}},{"ruleId":"D2","level":"warning","message":{"text":"GuardReachability.implementationsIn (cognitive 19): GuardReachability.implementationsIn has cognitive complexity 19 (threshold 15). Drivers by points: match/switch 4 (10 pts), error handling 2 (6 pts), boolean chains 3 (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/GuardReachability.fs"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7b5bbe65f156f242b281aa616a23b34ddb8f94025022d455e942fea7694d604"}},{"ruleId":"D2","level":"warning","message":{"text":"SessionContextTui.detailLines (cognitive 19): SessionContextTui.detailLines has cognitive complexity 19 (threshold 15). Drivers by points: loops 5 (11 pts), match/switch 6 (8 pts) (nesting depth added 8). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/WarmupContext.fs"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"2704c9e6bb68a18b06af0d98c47ad300d239b3046f15017a814449e32992e0e8"}},{"ruleId":"D2","level":"warning","message":{"text":"CompileOrderInsight.analyzeWithReferences (cognitive 19): CompileOrderInsight.analyzeWithReferences has cognitive complexity 19 (threshold 15). Drivers by points: match/switch 10 (19 pts) (nesting depth added 9). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/CompileOrderInsight.fs"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"81784905905b72b8fa65e9b6bd62b80d9c614a92c18f9dd58fe793cd166ad9ac"}},{"ruleId":"D2","level":"warning","message":{"text":"MachineProbeReader.cpuQuota (cognitive 19): MachineProbeReader.cpuQuota has cognitive complexity 19 (threshold 15). Drivers by points: match/switch 6 (18 pts), error handling 1 (nesting depth added 12). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/MachineProfile.fs"},"region":{"startLine":476}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce76e8d3e00fc70f393be07d744355eea8ed1a5c6554df9c310a70d2df4dfde3"}},{"ruleId":"D2","level":"warning","message":{"text":"McpServer.replayCachedTestState (cognitive 19): McpServer.replayCachedTestState has cognitive complexity 19 (threshold 15). Drivers by points: match/switch 5 (10 pts), loops 2 (6 pts), boolean chains 2, error handling 1 (nesting depth added 9). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpServer.fs"},"region":{"startLine":1047}}}],"partialFingerprints":{"codehealthFindingId/v1":"156814fbb71cdc9a263fcac37448779f6b4f18358f05cad25af672854fcad253"}},{"ruleId":"D2","level":"warning","message":{"text":"McpServer.wireCohortEventSubscription (cognitive 19): McpServer.wireCohortEventSubscription has cognitive complexity 19 (threshold 15). Drivers by points: match/switch 6 (17 pts), error handling 1, loops 1 (nesting depth added 11). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpServer.fs"},"region":{"startLine":1312}}}],"partialFingerprints":{"codehealthFindingId/v1":"42c4110e5e04aa5674a96358db43b3187ed33d885287f5cdb0c8aa5dbd7bba03"}},{"ruleId":"D2","level":"warning","message":{"text":"McpServer.mapAnalysisRoutes (cognitive 19): McpServer.mapAnalysisRoutes has cognitive complexity 19 (threshold 15). Drivers by points: match/switch 10 (19 pts) (nesting depth added 9). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpServer.fs"},"region":{"startLine":3574}}}],"partialFingerprints":{"codehealthFindingId/v1":"2088c1a1858dbe00da3d66d2521065e7b722454286bbbccc63459ffc125974fe"}},{"ruleId":"D2","level":"warning","message":{"text":"McpTools.getMessageJournal (cognitive 19): McpTools.getMessageJournal has cognitive complexity 19 (threshold 15). Drivers by points: match/switch 7 (19 pts) (nesting depth added 12). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Mcp.fs"},"region":{"startLine":2929}}}],"partialFingerprints":{"codehealthFindingId/v1":"c33050c82042f3a639927e15b4f4bc0263defc5d819f4fb68d3675379066763e"}},{"ruleId":"D2","level":"warning","message":{"text":"McpAdapter.formatWarmupDetailForLlm (cognitive 19): McpAdapter.formatWarmupDetailForLlm has cognitive complexity 19 (threshold 15). Drivers by points: loops 5 (11 pts), match/switch 5 (8 pts) (nesting depth added 9). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpAdapter.fs"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b0cc3a38b9cb5208e76c9a91e097e2aeb99678fb796bced5bdd09724cb62285"}},{"ruleId":"D2","level":"warning","message":{"text":"FrictionReviewView.parseEditsJson (cognitive 19): FrictionReviewView.parseEditsJson has cognitive complexity 19 (threshold 15). Drivers by points: match/switch 2 (7 pts), if/else 3 (6 pts), loops 1 (3 pts), error handling 1 (2 pts), boolean chains 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/FrictionReviewView.fs"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"4592823c1beffa3896fb98a88dbb9fe1130d9e7ce0f5c919d9cb9bc07fa9232c"}},{"ruleId":"D2","level":"warning","message":{"text":"TestDiagnosticsBridge.UpdateDiagnosticsAsync (cognitive 18): TestDiagnosticsBridge.UpdateDiagnosticsAsync has cognitive complexity 18 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio/Services/TestDiagnosticsBridge.cs"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd297c654f3290d4ed58b2feb18469a811a0147bc8abd6eefdd5480fc510549d"}},{"ruleId":"D2","level":"warning","message":{"text":"ValueReadTracking.walk (cognitive 18): ValueReadTracking.walk has cognitive complexity 18 (threshold 15). Drivers by points: match/switch 8 (18 pts) (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/ValueReadTracking.fs"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"68b6e74fa1ab08c21e55d16ec9996740647b81066de1f68c36be1d8770d501d3"}},{"ruleId":"D2","level":"warning","message":{"text":"FsiHostBuild.ensureFSharpCoreVariant (cognitive 18): FsiHostBuild.ensureFSharpCoreVariant has cognitive complexity 18 (threshold 15). Drivers by points: match/switch 4 (10 pts), loops 2 (6 pts), boolean chains 1, error handling 1 (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/FsiHostBuild.fs"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7f03de62b1cbd988bd8c14561b7427d2e0c9b851da4602087b9469011476a19"}},{"ruleId":"D2","level":"warning","message":{"text":"TrunkFollow.settleInRecords (cognitive 18): TrunkFollow.settleInRecords has cognitive complexity 18 (threshold 15). Drivers by points: match/switch 6 (18 pts) (nesting depth added 12). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/TrunkFollow.fs"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"f276639c2a6fa25f800a80cd8fe52a22cc6b624c22232a836626d2986727c972"}},{"ruleId":"D2","level":"warning","message":{"text":"CellMarker.parse (cognitive 18): CellMarker.parse has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (10 pts), match/switch 2 (7 pts), boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/NotebookExport.fs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cc1b82177ff7af295d701fe524fcbd2168932815c5515e429bc211d545f7d16"}},{"ruleId":"D2","level":"warning","message":{"text":"HostAdaptation.readFrameworkAssemblies (cognitive 18): HostAdaptation.readFrameworkAssemblies has cognitive complexity 18 (threshold 15). Drivers by points: match/switch 3 (8 pts), error handling 1 (5 pts), loops 2 (5 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":"SageFs.Core/HostAdaptation.fs"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1bd469a7ef88dbefe62fb930a2e344516de07cf0bdf66efb42043a3d2e07576"}},{"ruleId":"D2","level":"warning","message":{"text":"Cohort.project (cognitive 18): Cohort.project has cognitive complexity 18 (threshold 15). Drivers by points: loops 7 (10 pts), match/switch 7, if/else 1 (nesting depth added 3). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Cohort.fs"},"region":{"startLine":1591}}}],"partialFingerprints":{"codehealthFindingId/v1":"255e5a9940711b39c83044deb91f013a9e5a401045b6604c023cb24b621baa3c"}},{"ruleId":"D2","level":"warning","message":{"text":"TweakSimInvariants.whyKeptAgreesWithGroundTruthAfterMultipleRounds (cognitive 18): TweakSimInvariants.whyKeptAgreesWithGroundTruthAfterMultipleRounds has cognitive complexity 18 (threshold 15). Drivers by points: match/switch 6 (18 pts) (nesting depth added 12). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/TweakSimInvariants.fs"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a1e2865587c467ba69b9fa41f4d073df27fff0b6d1cbdc22e89d1588af116d7"}},{"ruleId":"D2","level":"warning","message":{"text":"DashboardFragments.renderHygienePanel (cognitive 18): DashboardFragments.renderHygienePanel has cognitive complexity 18 (threshold 15). Drivers by points: match/switch 7 (16 pts), loops 1 (2 pts) (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DashboardFragments.fs"},"region":{"startLine":3984}}}],"partialFingerprints":{"codehealthFindingId/v1":"130b4bfc5d9792ff8819adbe48797fbcf9e3610148baee9e3a0728ea5262f5ae"}},{"ruleId":"D2","level":"warning","message":{"text":"LoadScriptCommand.ExecuteCommandAsync (cognitive 17): LoadScriptCommand.ExecuteCommandAsync has cognitive complexity 17 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio/Commands/LoadScriptCommand.cs"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"e524052d77aa45da21036b5892a355c9c518e624fade725f7ce0797e71d9d65b"}},{"ruleId":"D2","level":"warning","message":{"text":"Tracker.SetMode (cognitive 17): Tracker.SetMode has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 5 (13 pts), loops 2 (4 pts) (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/ValueReadTracking.fs"},"region":{"startLine":1540}}}],"partialFingerprints":{"codehealthFindingId/v1":"58ca128b0cba1a7c046fcd6af5af8d2c107e809f654ce64a5874d23cb80ad99d"}},{"ruleId":"D2","level":"warning","message":{"text":"ValueReads.effectOf (cognitive 17): ValueReads.effectOf has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 6 (16 pts), boolean chains 1 (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/ValueReads.fs"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"839328277d59fe916346dbbc5df72be9d4470241506abc055dd0a2de61371dc6"}},{"ruleId":"D2","level":"warning","message":{"text":"NotebookExport.importNotebook (cognitive 17): NotebookExport.importNotebook has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 5 (12 pts), if/else 3 (5 pts) (nesting depth added 9). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/NotebookExport.fs"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"5892de9ed728a11e3b51ad13790554076e644e0905a7165bcc10ffc5af786b48"}},{"ruleId":"D2","level":"warning","message":{"text":"CoverageInstrumenter.collectSequencePoints (cognitive 17): CoverageInstrumenter.collectSequencePoints has cognitive complexity 17 (threshold 15). Drivers by points: loops 4 (8 pts), match/switch 2 (8 pts), boolean chains 1 (nesting depth added 10). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/CoverageInstrumenter.fs"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"fde039bc40e59bc2de977aa25ea985697e8005f5503e679f7723c58e8ea6c0eb"}},{"ruleId":"D2","level":"warning","message":{"text":"DeltaApply.runUpdateHandlers (cognitive 17): DeltaApply.runUpdateHandlers has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 3 (9 pts), error handling 2 (5 pts), loops 2 (3 pts) (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/MetadataDelta/DeltaApply.fs"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"8413e185dedb785d83ac92efe4cb56d32c49635cbbd9389950ead7499553c8d1"}},{"ruleId":"D2","level":"warning","message":{"text":"AppRunOrchestration.launch (cognitive 17): AppRunOrchestration.launch has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 6 (17 pts) (nesting depth added 11). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/AppRunOrchestration.fs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"0654e5026bcc2dc8861caf3d126fc96ca2522a68566e586feb26450c7a0af3ab"}},{"ruleId":"D2","level":"warning","message":{"text":"HygieneFs.resolvePath (cognitive 17): HygieneFs.resolvePath has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 6 (14 pts), error handling 2 (3 pts) (nesting depth added 9). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/HygieneFs.fs"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"746ab9ae45d05b8bce5158b98ee89aff64e65135c8037643c6189470ddd375e9"}},{"ruleId":"D2","level":"warning","message":{"text":"Executor.operationsFor (cognitive 17): Executor.operationsFor has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 8 (17 pts) (nesting depth added 9). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/WorkspaceHygiene.fs"},"region":{"startLine":957}}}],"partialFingerprints":{"codehealthFindingId/v1":"73066bc112eed70ac35bca4270713fbfa3c666ab8528a8c640d99460e0a99c45"}},{"ruleId":"D2","level":"warning","message":{"text":"AppRunner.resolveProjectAssembly (cognitive 17): AppRunner.resolveProjectAssembly has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 6 (12 pts), error handling 1 (3 pts), boolean chains 2 (nesting depth added 8). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Host/AppRunner.fs"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5c7120b910636fd90b49378bed2488a8fb6a05150a1a0f4a0d1cac1a6a80133"}},{"ruleId":"D2","level":"warning","message":{"text":"CliCommandModule.parse (cognitive 17): CliCommandModule.parse has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 12, match/switch 3 (5 pts) (nesting depth added 2). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Program.fs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e54d88fb868c602b0c111a8a3ccfed8ecfc045165c2dd77cc30f3032097de52"}},{"ruleId":"D2","level":"warning","message":{"text":"McpServer.replaySessionSnapshot (cognitive 17): McpServer.replaySessionSnapshot has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 5 (13 pts), error handling 2 (4 pts) (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpServer.fs"},"region":{"startLine":1012}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd8d439a170678bc2beb038b3b90855c05d17344b908eb4a148048d1c6b3bdad"}},{"ruleId":"D2","level":"warning","message":{"text":"McpCapability.mintMember (cognitive 17): McpCapability.mintMember has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 6 (17 pts) (nesting depth added 11). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpCapability.fs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fff681f10089bc681ae8f8d2e7bdba04a97d2a6a1dc82bfab9a05980cb76d6f"}},{"ruleId":"D2","level":"warning","message":{"text":"CohortLandingVerify.runTestsInSession (cognitive 17): CohortLandingVerify.runTestsInSession has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 6 (17 pts) (nesting depth added 11). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/CohortLandingVerify.fs"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"35f5fabe2d46e6d673f55cf0f4068557c06b1c12c7cda42fc583c60542b3bdc0"}},{"ruleId":"D2","level":"warning","message":{"text":"HygieneGather.kindsOfTarget (cognitive 17): HygieneGather.kindsOfTarget has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (14 pts), match/switch 2 (3 pts) (nesting depth added 8). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/HygieneGather.fs"},"region":{"startLine":754}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac498a4598a22b69a5a4ec9ea0d24b128cbb674095915befba7b57ab4dc949a4"}},{"ruleId":"D2","level":"warning","message":{"text":"Screen.computeLayoutWith (cognitive 17): Screen.computeLayoutWith has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 7 (15 pts), boolean chains 2 (nesting depth added 8). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Screen.fs"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ff5c500d0c09708dc639eabe4f14705a1aa84ec882df5ffa16dfc120721f263"}},{"ruleId":"D2","level":"warning","message":{"text":"SageFsMsgQueueCoalescing.tryAbsorbPending (cognitive 17): SageFsMsgQueueCoalescing.tryAbsorbPending has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 8 (17 pts) (nesting depth added 9). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/SageFsApp.fs"},"region":{"startLine":515}}}],"partialFingerprints":{"codehealthFindingId/v1":"22fad5811770407aedd51f442f3e37e6c44c8bcc219f1bb250ae8779b2146275"}},{"ruleId":"D2","level":"warning","message":{"text":"EditorUpdate.deleteForward (cognitive 17): EditorUpdate.deleteForward has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 7 (17 pts) (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Editor.fs"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"a92fd020ec21d1c8038cd3326e04b9ccf85d3a89634b434c6c6e97b8409b4d7a"}},{"ruleId":"D2","level":"warning","message":{"text":"Daemon.sessions (cognitive 17): Daemon.sessions has cognitive complexity 17 (threshold 15). Drivers by points: if/else 2 (6 pts), loops 2 (6 pts), match/switch 2 (4 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":"scripts/lemmings/ui/nvim/NvimTour.fs"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"54a41b947ea802fc036935627467ff2032399088b4f52599de43bed6a5b057c6"}},{"ruleId":"D2","level":"warning","message":{"text":"BlockHelpers.CollectSemicolonBlocks (cognitive 16): BlockHelpers.CollectSemicolonBlocks has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio/Commands/CellNavigationCommands.cs"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"64fb9b3def0bcbf1496f2de1c36c2e182b599a781035a00f90a366566dd010ff"}},{"ruleId":"D2","level":"warning","message":{"text":"HotReloadToggleDirectoryCommand.ExecuteCommandAsync (cognitive 16): HotReloadToggleDirectoryCommand.ExecuteCommandAsync has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio/Commands/HotReloadCommands.cs"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c7dced9b00b74980f631b3c4a549531a60a8fad60d6da1d09aa3d6dda3d47ea"}},{"ruleId":"D2","level":"warning","message":{"text":"SwitchSessionCommand.ExecuteCommandAsync (cognitive 16): SwitchSessionCommand.ExecuteCommandAsync has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio/Commands/SessionCommands.cs"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5dbfd35f6c8ce369728fcaf1a2fb1adaabf54b8dc922bbf4aaa3902d02fae39"}},{"ruleId":"D2","level":"warning","message":{"text":"BlockHelpers.CollectSemicolonBlocks (cognitive 16): BlockHelpers.CollectSemicolonBlocks has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio.Editor/BlockHelpers.cs"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"b400ca360ae7dae30836d9c67069608b4501421e8ac7a78da25af201100bb767"}},{"ruleId":"D2","level":"warning","message":{"text":"SquiggleTagger.GetTags (cognitive 16): SquiggleTagger.GetTags has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio.Editor/SquiggleTagger.cs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"00556ff0428c0bf4f5d9fbf3a851f597977fd8ca25bfc6ac3bc83894459e034c"}},{"ruleId":"D2","level":"warning","message":{"text":"TestStateTracker.ProcessSourceLocations (cognitive 16): TestStateTracker.ProcessSourceLocations has cognitive complexity 16 (threshold 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio.Editor/TestStateTracker.cs"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"ceb82c3c3a6c65e3200ef0a594fd1386030fadbcc132069c92f8cf2c559180fa"}},{"ruleId":"D2","level":"warning","message":{"text":"ValueReadTracking.rewirableSiteIds (cognitive 16): ValueReadTracking.rewirableSiteIds has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 4 (10 pts), error handling 2 (5 pts), boolean chains 1 (nesting depth added 9). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/ValueReadTracking.fs"},"region":{"startLine":605}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1d973211a09e6bbbbda7ea0cf03660042d4938707b4a7af792954eef7c1455a"}},{"ruleId":"D2","level":"warning","message":{"text":"ReloadPlanning.recordShapeOf (cognitive 16): ReloadPlanning.recordShapeOf has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 5 (15 pts), error handling 1 (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/ReloadPlanning.fs"},"region":{"startLine":1077}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2a461bf3014c703908d083c2fac7e693f65484bcc531605702358ca965ef4d3"}},{"ruleId":"D2","level":"warning","message":{"text":"GuardReachability.eligibility (cognitive 16): GuardReachability.eligibility has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 5 (15 pts), boolean chains 1 (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/GuardReachability.fs"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c1f355c92f36331b3ed788a31683f5f6d8612d521374ac438c828e4d3d69fb0"}},{"ruleId":"D2","level":"warning","message":{"text":"SessionHealthModule.classify (cognitive 16): SessionHealthModule.classify has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 5 (15 pts), boolean chains 1 (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/SessionHealth.fs"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"310ad3e2d0d034294dfbba49f1131a9f4618afad9fa932106236cfb8cf8dd8ca"}},{"ruleId":"D2","level":"warning","message":{"text":"DaemonState.probeDaemonHttpAsync (cognitive 16): DaemonState.probeDaemonHttpAsync has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 5 (12 pts), error handling 2 (4 pts) (nesting depth added 9). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/DaemonState.fs"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b0124dcdd7134e4468f1fa8ac4ffdd9b254d08bba5bbbb26f334bd58158deb0"}},{"ruleId":"D2","level":"warning","message":{"text":"SessionReloadModule.ofPayloadJson (cognitive 16): SessionReloadModule.ofPayloadJson has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 6 (8 pts), if/else 1 (4 pts), loops 1 (3 pts), error handling 1 (nesting depth added 7). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/SessionReload.fs"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"7100d38755068aef2310ee304183a5d60c3e474d873e622234b3d1ebd79b88d9"}},{"ruleId":"D2","level":"warning","message":{"text":"AspireSetup.loadLaunchSettings (cognitive 16): AspireSetup.loadLaunchSettings has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 6 (15 pts), error handling 1 (nesting depth added 9). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/AspireSetup.fs"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"93085f0bebd98353483db9bad92ce2f970af4e9006aed8344e32bebaadcd9b8c"}},{"ruleId":"D2","level":"warning","message":{"text":"WarmUp.openWithRetryRichCore (cognitive 16): WarmUp.openWithRetryRichCore has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 6 (13 pts), loops 1 (2 pts), boolean chains 1 (nesting depth added 8). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/WarmUp.fs"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"deca859346932fb88c1b7445a06b8b865a5bc3965b69aa04d725c29306b85526"}},{"ruleId":"D2","level":"warning","message":{"text":"WarmUp.openWithRetry (cognitive 16): WarmUp.openWithRetry has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 7 (15 pts), boolean chains 1 (nesting depth added 8). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/WarmUp.fs"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6f9a5f2ca6165d220747cf019b620bed12eb8e49d81c374b90f115370c4c3fd"}},{"ruleId":"D2","level":"warning","message":{"text":"MachineProbeReader.fromCgroup (cognitive 16): MachineProbeReader.fromCgroup has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 5 (15 pts), error handling 1 (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/MachineProfile.fs"},"region":{"startLine":449}}}],"partialFingerprints":{"codehealthFindingId/v1":"4277c92801f8bd443b896f5e6123146803656788162c72ef6d2d00c1dbdaa239"}},{"ruleId":"D2","level":"warning","message":{"text":"NativeResolution.install (cognitive 16): NativeResolution.install has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 5 (12 pts), error handling 2 (4 pts) (nesting depth added 9). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/NativeResolution.fs"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7a167f1b5c30c51c32e5525cdb3f8a0d9a421a8c0d4c9a1bcb214b0b932a099"}},{"ruleId":"D2","level":"warning","message":{"text":"MemoryShedSim.scenarioOf (cognitive 16): MemoryShedSim.scenarioOf has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 6 (15 pts), loops 1 (nesting depth added 9). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/MemoryShedSim.fs"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"00d2162fedc594df66d9c7320523ba8f6376e9cd6bb5528705451a52627c0c4e"}},{"ruleId":"D2","level":"warning","message":{"text":"LiveCheckPumpSim.runOp (cognitive 16): LiveCheckPumpSim.runOp has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 8 (16 pts) (nesting depth added 8). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/LiveCheckPumpSim.fs"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"d60f6696b1d9df1f1da5f748a7a2264dc26795fc05fc43e0b4b0009a2fff2a78"}},{"ruleId":"D2","level":"warning","message":{"text":"SourceStateSim.decideWith (cognitive 16): SourceStateSim.decideWith has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 7 (16 pts) (nesting depth added 9). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/SourceStateSim.fs"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c765c2c2acbd8ee9deb03e8f11a3770d9e7aff46eca5626a2402e82833adce6"}},{"ruleId":"D2","level":"warning","message":{"text":"DashboardFragments.renderFrictionPanel (cognitive 16): DashboardFragments.renderFrictionPanel has cognitive complexity 16 (threshold 15). Drivers by points: loops 3 (9 pts), match/switch 4 (7 pts) (nesting depth added 9). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DashboardFragments.fs"},"region":{"startLine":2799}}}],"partialFingerprints":{"codehealthFindingId/v1":"24c04600adcfb01cba16024d2cf4593ce9d368183be4579f5baeb0996068f1dc"}},{"ruleId":"D2","level":"warning","message":{"text":"McpTools.setLiveTestingForSession (cognitive 16): McpTools.setLiveTestingForSession has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 6 (16 pts) (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Mcp.fs"},"region":{"startLine":2450}}}],"partialFingerprints":{"codehealthFindingId/v1":"133650b11d701adf764fe7064e2eb0a95ef83ba1107245bf2a46490c117d61f8"}},{"ruleId":"D2","level":"warning","message":{"text":"Draw.resolveJunctions (cognitive 16): Draw.resolveJunctions has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 4 (12 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 9). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Draw.fs"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"f967bf5a792f312e2d763beb61ea84cabcd152184b754c1354546049ad5c92ac"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs/DaemonMode.fs: FileTooLong \u2014 3041 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 54 functions. The bar is 500 significant lines; this is 2541 over it, 6.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":"SageFs/DaemonMode.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"735bb50454ec6375826e5fb367f01878561203b32ec87fe10853ad530bba4dad"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/Extension.fs: FileTooLong \u2014 2933 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 124 functions. The bar is 500 significant lines; this is 2433 over it, 5.87\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vscode/src/Extension.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd4a5d309499cabb161407af812591ed79f83f2d0d76fb9606ade766f8dd2e20"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs/McpServer.fs: FileTooLong \u2014 2917 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 78 functions. The bar is 500 significant lines; this is 2417 over it, 5.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":"SageFs/McpServer.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f56976ea7ea15f0d23d42251b6f88c1de1a86e97909c6a239139f0905017198a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Features/LiveTestingTypes.fs: FileTooLong \u2014 2890 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 2390 over it, 5.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":"SageFs.Core/Features/LiveTestingTypes.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"853ce5392a6174469c67c9f99b6ab84ec1711e4e54caf22695fa085a5f2545e8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs/DashboardFragments.fs: FileTooLong \u2014 2841 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 107 functions. The bar is 500 significant lines; this is 2341 over it, 5.68\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DashboardFragments.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6337d8641e4297d0303e89a3cb8b258df99dc0edd2544a0996c906d8a5cbebc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs/Mcp.fs: FileTooLong \u2014 2346 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 115 functions. The bar is 500 significant lines; this is 1846 over it, 4.69\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Mcp.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6c3d34b672bdea499e4bc0c2c1f410fe6faa3f10a5e3b6e17644adb27903bbe"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs/Dashboard.fs: FileTooLong \u2014 2236 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 70 functions. The bar is 500 significant lines; this is 1736 over it, 4.47\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Dashboard.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"39351437b430538997943da34a94d6302eaadc65d965450418f819e956081dd9"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs/McpTools.fs: FileTooLong \u2014 2160 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1660 over it, 4.32\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpTools.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7f742ee86d1d1b0c8acd36ef6e536fb521c6b0a08f30657be14b3a47a530be0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs/SageFsApp.fs: FileTooLong \u2014 2091 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1591 over it, 4.18\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/SageFsApp.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"70f47a9f1d2829b6c757e9b9b108b90028a078f55d131a253c410ccb309ad9bb"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs.Core/AppState.fs: FileTooLong \u2014 1536 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1036 over it, 3.07\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/AppState.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f72107152bc8589449e4afa4f42f3f257bfae09100704eaa1434eb71e3868b09"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs.Host/WorkerMain.fs: FileTooLong \u2014 1434 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 934 over it, 2.87\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Host/WorkerMain.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dd4f9e0d652158501e3f47156822ec8528eb44d7d04e54eda32139e3df0d345"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs.Core/SessionManager.fs: FileTooLong \u2014 1202 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 702 over it, 2.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":"SageFs.Core/SessionManager.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5d5922eb1e39935ff2f8fc31057d2e4aa6cce47d3d0c3dd3ca05ad9ad7debe4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Middleware/ValueReadTracking.fs: FileTooLong \u2014 1198 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 36 functions. The bar is 500 significant lines; this is 698 over it, 2.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":"SageFs.Core/Middleware/ValueReadTracking.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9546148a6656cd0bae5a18c3e42cc84bda62a8cde60265d39e2dbcfcc5f9918"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: SageFsTools: TooManyMethods \u2014 70 methods. The bar is 30 methods; this is 40 over it, 2.33\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpTools.fs"},"region":{"startLine":720}}}],"partialFingerprints":{"codehealthFindingId/v1":"75e547ca8c201f92c10090e3e83976634c78510646364a4887e2aaa26988a07f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Middleware/HotReloadCore.fs: FileTooLong \u2014 1158 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 39 functions. The bar is 500 significant lines; this is 658 over it, 2.32\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/HotReloadCore.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef393c5073253150f67115feda203729b4f2f46ba252589cdb4ee49f48c92711"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Features/LiveTestingExecutors.fs: FileTooLong \u2014 1105 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 605 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":"SageFs.Core/Features/LiveTestingExecutors.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"54c8326f671ff0542b98fe8c0d703ca999a03ac2de58f6ac8546ec393c9f0b02"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs/DashboardTypes.fs: FileTooLong \u2014 1044 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 544 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":"SageFs/DashboardTypes.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4b0d09e43554aa919ea390c04ca2f0b01864bd9a13bf649b92ebcfdc91fcb66"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Features/ReloadPlanning.fs: FileTooLong \u2014 963 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 62 functions. The bar is 500 significant lines; this is 463 over it, 1.93\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/ReloadPlanning.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"56724ee1019c6630f2e73fde8b9584d0579e76f07ad8a4a9af5605ebf3f81aa6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: nvim/Nvim.fs: FileTooLong \u2014 953 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 65 functions. The bar is 500 significant lines; this is 453 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":"scripts/lemmings/ui/nvim/Nvim.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb62b1f1904b6fd937ec1062282106db83b8fa7ab5c9d56d6b10cb2efdf31de6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs.Core/Cohort.fs: FileTooLong \u2014 929 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 429 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":"SageFs.Core/Cohort.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"adea99d7db1f69818ac49ff64b44abfbc882e1f6c4891e8f78b2abf5e6a1f99f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Features/LiveTestingCycle.fs: FileTooLong \u2014 928 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 428 over it, 1.86\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveTestingCycle.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"439d3594ab28a9ea0515153868c1f9e62d6542572ee9e747d9f635cfb950e809"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs/SageFsEffectHandler.fs: 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":"SageFs/SageFsEffectHandler.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3498a200ff2c086e70cd964ad44b1324fc6187cb7a1513248ca06fa77103d7de"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs.Core/WorkspaceHygiene.fs: FileTooLong \u2014 834 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 334 over it, 1.67\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/WorkspaceHygiene.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c11c13841460d2d0326c45dd97e820624906f005d7888fbc544d58208bee9856"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: SseWriter: TooManyFunctions \u2014 47 functions. The bar is 30 functions; this is 17 over it, 1.57\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/SseWriter.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d5f6b8c69aebc57f5108a31a7285a3f1375086d80b9ee449b23d5183bea9baf"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Features/LiveValueTree.fs: FileTooLong \u2014 773 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 31 functions. 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":"SageFs.Core/Features/LiveValueTree.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b430e425b95b3c294dcc8874120b4060cfb97e2ec84deeb721cfa3a152f76499"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: MetadataDelta/DeltaWriter.fs: FileTooLong \u2014 771 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 271 over it, 1.54\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/MetadataDelta/DeltaWriter.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0262a30e81354326f702dd4104d8f5b9d9f948e844fb65648a3038287d2fcb2"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs.Core/ProjectLoading.fs: FileTooLong \u2014 756 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 256 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":"SageFs.Core/ProjectLoading.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"697f866892e4e54bad620887164316b67d4ceb6cb9d34307b6a8cd62bdf788fd"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs.Host/WorkerHttpTransport.fs: 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":"SageFs.Host/WorkerHttpTransport.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"193c1dcdbe705960ccfe74b2b1e9f6cff198a06ca644652a6d6c90e580fa501c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Tweak/TweakLog.fs: FileTooLong \u2014 721 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 221 over it, 1.44\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/Tweak/TweakLog.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bdc8b063e4deb6b32696cf39d8da5ce6c60d1a6f2716a37f10dce52722c654f"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: NvimOracle: TooManyFunctions \u2014 41 functions. The bar is 30 functions; this is 11 over it, 1.37\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lemmings/ui/nvim/NvimOracle.fs"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"559220febc0bcb198b3c3c257932ad8ef89a5bbdad13461a7f21253c629fe375"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Middleware/ValueReads.fs: FileTooLong \u2014 672 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 172 over it, 1.34\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/ValueReads.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ced25076d78f29b5f11e2c135afc60ddee947bfaffa25256a0243ad5d4dff8b4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs/HygieneGather.fs: FileTooLong \u2014 656 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 41 functions. The bar is 500 significant lines; this is 156 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":"SageFs/HygieneGather.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d72c4a6175cc5789e060d03bb670c334f6759bd7f364678021d7d1041c49ebc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/SageFsClient.fs: FileTooLong \u2014 610 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 76 functions. 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":"sagefs-vscode/src/SageFsClient.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7dd54c7f2a95924f016384d6eb93be7ddffd22eac499811b0d9ff5118a72099"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: VscRun: TooManyFunctions \u2014 36 functions. The bar is 30 functions; this is 6 over it, 1.20\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lemmings/LemRun/VscRun.fs"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"111742f3b9f8f715093cea02a7e0dc8c66c77add1635f772174e1719ada625e2"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs/FrictionSqlite.fs: FileTooLong \u2014 589 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 89 over it, 1.18\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/FrictionSqlite.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"27f7a0114109deb829d93ba85b0494ed27f1a067d3fcec2a661bb42e9219fc9d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs.Core/HostAgent.fs: FileTooLong \u2014 561 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 61 over it, 1.12\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/HostAgent.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"73dad5848f5fffa2fe02176111e5b2459877c862f78fa4560ecdf5b84f3a4776"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs/RenderPipeline.fs: FileTooLong \u2014 546 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 46 over it, 1.09\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/RenderPipeline.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b5069fd2a03f93576c6bdd76312c23a4a1d1f805d00aa49312e9015e8b711c3"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs/EnvCheck.fs: FileTooLong \u2014 542 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 43 functions. The bar is 500 significant lines; this is 42 over it, 1.08\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/EnvCheck.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b763817a3b079c24650262bf21bd89dbdfd02b0e5adb7dfd2ef755dfd733060"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs.Core/SageFsError.fs: FileTooLong \u2014 536 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 36 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":"SageFs.Core/SageFsError.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f56e86428fc81b3fc73b2e935a5797deaf82751f6556b71fff8c34f04b033de"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: Cdp: TooManyFunctions \u2014 32 functions. The bar is 30 functions; this is 2 over it, 1.07\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lemmings/ui/LemDrive/Cdp.fs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"63b04780be7559df506439e018a0075f36c08a9cd1e6196cc41900f7fabd65b4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs/McpAdapter.fs: FileTooLong \u2014 530 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 31 functions. 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":"SageFs/McpAdapter.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"812a248bc8771a6adb66b03c6f0eb6f7b64fe0e41f2683d47444a77b72ec6bbb"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs/Program.fs: FileTooLong \u2014 524 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 24 over it, 1.05\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Program.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f7bf0abe1373f6a4a81a4b2dd0e0a6aca775e0fd3bea9be8dbe96b5c57f29fa"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: LemDrive/Vsc.fs: FileTooLong \u2014 518 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 41 functions. 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":"scripts/lemmings/ui/LemDrive/Vsc.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d793e497c698caa56cb1c19fe1f0f9eb1c8cd83f628aaa87feb7a22acc1e45bc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/LiveTestingListener.fs: FileTooLong \u2014 508 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 8 over it, 1.02\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vscode/src/LiveTestingListener.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3378021b70eb8cb5209d37d3ba07b107c1895d28ec050d6e6d1ab700b05e2a1b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: SageFs.Gui/RaylibMode.fs: FileTooLong \u2014 504 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 4 over it, 1.01\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Gui/RaylibMode.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f9330093263def4b033267d604c24f36b11b7ae7c82713e97d10465e5a6543b"}},{"ruleId":"D8","level":"warning","message":{"text":"Coverage not measured \u2014 no coverage collector is wired up: Coverage NOT MEASURED: \u0060--collect:\u0022XPlat Code Coverage\u0022\u0060 names a data collector that ships in the \u0060coverlet.collector\u0060 package, and this repository wires up none \u2014 no test project references it and no runsettings declares one. The absence of coverage here is therefore not evidence about the suite or about our analyzer environment: without a collector, \u0060--collect\u0060 produces nothing even from a suite that builds and passes. Add a \u0060coverlet.collector\u0060 PackageReference to the test project(s) (or commit the Cobertura/OpenCover/lcov report your CI produces) and real coverage will be measured. It is excluded from the score rather than counted as a near-zero defect."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"62e63e619c28f057e129f2997c965d32a457366a9ce18ca019ffb6bdfba85c99"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs/DaemonMode.fs: SageFs/DaemonMode.fs changed 123 times in last 90 days, max cyclomatic complexity 300 in DaemonMode.run at line 2116. 54 of those changes were fix/bug commits, and the other 69 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs/DaemonMode.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DaemonMode.fs"},"region":{"startLine":2116}}}],"partialFingerprints":{"codehealthFindingId/v1":"74d1038693b910bd8b8120db5d63730255e681d230e8e5f620c36b6e276e7b98"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Host/WorkerMain.fs: SageFs.Host/WorkerMain.fs changed 70 times in last 90 days, max cyclomatic complexity 231 in WorkerMain.run at line 561. 23 of those changes were fix/bug commits, and the other 47 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Host/WorkerMain.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Host/WorkerMain.fs"},"region":{"startLine":561}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0e69b29288d9e6e2746ca71d877693e0bfe66781485e8bc011f28fdfe25e37e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/SessionManager.fs: SageFs.Core/SessionManager.fs changed 74 times in last 90 days, max cyclomatic complexity 190 in SessionManager.createWithAlarm at line 434. 40 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/SessionManager.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/SessionManager.fs"},"region":{"startLine":434}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc4e8ba4b7b8c9b9924a79efa4db7847b7ec866503be20a061b0ac5c9b35a9b2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs/SageFsApp.fs: SageFs/SageFsApp.fs changed 47 times in last 90 days, max cyclomatic complexity 260 in SageFsUpdate.update at line 1121. 19 of those changes were fix/bug commits, and the other 28 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs/SageFsApp.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/SageFsApp.fs"},"region":{"startLine":1121}}}],"partialFingerprints":{"codehealthFindingId/v1":"da659b873877ac62232500be1d8f11ebeeec2e3ded1469a726ec61bb6cf3138e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs/Dashboard.fs: SageFs/Dashboard.fs changed 100 times in last 90 days, max cyclomatic complexity 81 in Dashboard.createStreamHandler at line 1218. 38 of those changes were fix/bug commits, and the other 62 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs/Dashboard.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Dashboard.fs"},"region":{"startLine":1218}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7afa8df471c34cf4cee28d8fcfbb2e430709343bfabeed819970f5083190e9f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs/McpServer.fs: SageFs/McpServer.fs changed 95 times in last 90 days, max cyclomatic complexity 84 in McpServer.mapSessionRoutes at line 2800. 43 of those changes were fix/bug commits, and the other 52 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs/McpServer.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpServer.fs"},"region":{"startLine":2800}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc3f4c149dfd70d2355027e7379ce1203c5db81e0d952a8aa4487ef066dae62d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/AppState.fs: SageFs.Core/AppState.fs changed 43 times in last 90 days, max cyclomatic complexity 168 in AppState.mkAppStateActor at line 1047. 20 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/AppState.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/AppState.fs"},"region":{"startLine":1047}}}],"partialFingerprints":{"codehealthFindingId/v1":"75343fd24016360beca7a9780f5031df4c406a0f66eeb1ef846f1150d609e025"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs/DashboardFragments.fs: SageFs/DashboardFragments.fs changed 79 times in last 90 days, max cyclomatic complexity 90 in DashboardFragments.renderSessionsForSession at line 1519. 32 of those changes were fix/bug commits, and the other 47 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs/DashboardFragments.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DashboardFragments.fs"},"region":{"startLine":1519}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fbadb713c0653d9133a1ec74bc1c353849060fbc63cbaec4daa0e02b6a2b2d7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs/DashboardTypes.fs: SageFs/DashboardTypes.fs changed 64 times in last 90 days, max cyclomatic complexity 58 in DashboardTypes.parseEditorAction at line 1449. 18 of those changes were fix/bug commits, and the other 46 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs/DashboardTypes.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DashboardTypes.fs"},"region":{"startLine":1449}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfe75b40b9670f04b0676964d505ba97346ee1c66d1be4e541048b5d8f6327c4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs/Mcp.fs: SageFs/Mcp.fs changed 117 times in last 90 days, max cyclomatic complexity 31 in McpTools.resolveSessionId at line 418. 51 of those changes were fix/bug commits, and the other 66 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs/Mcp.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Mcp.fs"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd90bcd4296ee585786bdd0539f915ab6d0244ad5dde1dd969ad76803875e610"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs/McpTools.fs: SageFs/McpTools.fs changed 57 times in last 90 days, max cyclomatic complexity 43 in McpTools.blockerKindOf at line 34. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs/McpTools.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpTools.fs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c6c9d9788ed6076a52585003fcfa437f6c5e0d9d0ce4e20446f5635930e6cc5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Cohort.fs: SageFs.Core/Cohort.fs changed 18 times in last 90 days, max cyclomatic complexity 127 in Cohort.decideRaw at line 853. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Cohort.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Cohort.fs"},"region":{"startLine":853}}}],"partialFingerprints":{"codehealthFindingId/v1":"d79269bbc61dc0cb5bb024ec5c4f937d9b06525c4f118d8914de6d8da9ee951c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.FsiHost/Program.fs: SageFs.FsiHost/Program.fs changed 19 times in last 90 days, max cyclomatic complexity 101 in Program.run at line 136. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.FsiHost/Program.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.FsiHost/Program.fs"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"b144cb459c1fcfe226d2bf2e7e12ace209ff2f03ff5b68fd6c1363ea9b33363b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Host/WorkerHttpTransport.fs: SageFs.Host/WorkerHttpTransport.fs changed 24 times in last 90 days, max cyclomatic complexity 72 in WorkerHttpTransport.startServerWithShutdown at line 331. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Host/WorkerHttpTransport.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Host/WorkerHttpTransport.fs"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffbb13d986f6e75bef04d56f924e474ce4c69b7bfd50d24f7dd4192e1f443580"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Features/ReloadPlanning.fs: SageFs.Core/Features/ReloadPlanning.fs changed 28 times in last 90 days, max cyclomatic complexity 45 in ReloadPlanning.stripCommentsAndStrings at line 906. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Features/ReloadPlanning.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/ReloadPlanning.fs"},"region":{"startLine":906}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0547d4a1ddb3de6c0637a432483925a7b66ed4b45a232f9d4878cf1d445540e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/SageFsError.fs: SageFs.Core/SageFsError.fs changed 22 times in last 90 days, max cyclomatic complexity 45 in SageFsErrorModule.toFields at line 603. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/SageFsError.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/SageFsError.fs"},"region":{"startLine":603}}}],"partialFingerprints":{"codehealthFindingId/v1":"77b4f480b4fff087b673c735abfe1325e3c60dc7d273a431fd40a957871bb327"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Features/LiveTestingTypes.fs: SageFs.Core/Features/LiveTestingTypes.fs changed 28 times in last 90 days, max cyclomatic complexity 30 in TriviaNormalization.normalize at line 95. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Features/LiveTestingTypes.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveTestingTypes.fs"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bcd3858cb13f10a3dbe382b8bbd36017dc18e0f4ee3cc9e51b111dbd19bf1e1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs/Program.fs: SageFs/Program.fs changed 24 times in last 90 days, max cyclomatic complexity 30 in CliCommandModule.parse at line 118. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs/Program.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Program.fs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0a247aa399b15491efc0f4f7de4eec42c0f09f5b4603de21a38fd3e24d5ce5b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Middleware/HotReloadCore.fs: SageFs.Core/Middleware/HotReloadCore.fs changed 16 times in last 90 days, max cyclomatic complexity 41 in HotReloadCore.applyDetourPlan at line 843. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Middleware/HotReloadCore.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/HotReloadCore.fs"},"region":{"startLine":843}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbbdd77e492f1b956308a57d885dbf1d57edb8471be23cc3f40e87673c49d055"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Features/LiveValueTree.fs: SageFs.Core/Features/LiveValueTree.fs changed 9 times in last 90 days, max cyclomatic complexity 65 in LiveValueTree.buildNode at line 542. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Features/LiveValueTree.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveValueTree.fs"},"region":{"startLine":542}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d6d647e5bf4aaef38d4736eee97c51bc57bb77f99bfc9322d212e6454763443"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs/SageFsEffectHandler.fs: SageFs/SageFsEffectHandler.fs changed 4 times in last 90 days, max cyclomatic complexity 142 in SageFsEffectHandler.execute at line 341. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs/SageFsEffectHandler.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/SageFsEffectHandler.fs"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1f610892be379c79d978c30b524d7c224fe3b2e38fb4b8217d77c75faf2a26f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Middleware/HotReloading.fs: SageFs.Core/Middleware/HotReloading.fs changed 19 times in last 90 days, max cyclomatic complexity 29 in HotReloading.hotReloadingMiddleware at line 213. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Middleware/HotReloading.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/HotReloading.fs"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff718fd358a9232fe2ae097c54e7299cff6b6038aa45549330f62e3f4a564d5b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/ProjectLoading.fs: SageFs.Core/ProjectLoading.fs changed 26 times in last 90 days, max cyclomatic complexity 21 in ProjectLoading.loadSolution at line 664. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/ProjectLoading.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/ProjectLoading.fs"},"region":{"startLine":664}}}],"partialFingerprints":{"codehealthFindingId/v1":"9af6d13f923028b6f7896e7ddc9f663d49b2a9086446de9758ee3559db1c03c0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Features/MetadataDelta/DeltaWriter.fs: SageFs.Core/Features/MetadataDelta/DeltaWriter.fs changed 6 times in last 90 days, max cyclomatic complexity 86 in DeltaChain.write at line 492. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Features/MetadataDelta/DeltaWriter.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/MetadataDelta/DeltaWriter.fs"},"region":{"startLine":492}}}],"partialFingerprints":{"codehealthFindingId/v1":"577860015315685ab695afed1925255505af6ff1539167b9fc06bc2f10ae4fee"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.FsiHost/FsiProtocol.fs: SageFs.FsiHost/FsiProtocol.fs changed 15 times in last 90 days, max cyclomatic complexity 33 in FsiProtocol.readValue at line 335. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.FsiHost/FsiProtocol.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.FsiHost/FsiProtocol.fs"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"48d22544d551b1cec4e5251b57b6f34f4fb1619ddb05e2608facc9dfedbd7f54"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/FsiHostClient.fs: SageFs.Core/FsiHostClient.fs changed 16 times in last 90 days, max cyclomatic complexity 26 in FsiHostClient.start at line 483. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/FsiHostClient.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/FsiHostClient.fs"},"region":{"startLine":483}}}],"partialFingerprints":{"codehealthFindingId/v1":"88d034bd240f8c03a2ca7f9d5e0bd053fdb9757f819680889f9ef9d86a5668bd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/HttpWorkerClient.fs: SageFs.Core/HttpWorkerClient.fs changed 16 times in last 90 days, max cyclomatic complexity 25 in HttpWorkerClient.toRoute at line 13. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/HttpWorkerClient.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/HttpWorkerClient.fs"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e7bc0716e3def8a918fd24fa8279ad92d78f959330592f8b0f64b0f38179597"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Host/AppRunner.fs: SageFs.Host/AppRunner.fs changed 16 times in last 90 days, max cyclomatic complexity 24 in AppRunner.launch at line 322. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Host/AppRunner.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Host/AppRunner.fs"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0e22da52ac6931d607f3c629f5ee286986610a328c3b35d53db301f4f441a1c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/AppRunOrchestration.fs: SageFs.Core/AppRunOrchestration.fs changed 16 times in last 90 days, max cyclomatic complexity 23 in AppRunOrchestration.runApp at line 239. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/AppRunOrchestration.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/AppRunOrchestration.fs"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ffc8d4622e17d4ddb99c32e9e5c5d33c257b43cebdf71ea02c845d54b820c2f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/IsolatedFsiSession.fs: SageFs.Core/IsolatedFsiSession.fs changed 12 times in last 90 days, max cyclomatic complexity 28 in ProjectFSharpCoreIdentity.rewriteReferenceWith at line 317. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/IsolatedFsiSession.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/IsolatedFsiSession.fs"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1fa10248c2710ffc1b6ed97bc8c24485aa4f816784de4ec0612cd5a4f62573a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/SessionBuild.fs: SageFs.Core/SessionBuild.fs changed 12 times in last 90 days, max cyclomatic complexity 25 in SessionBuild.runBuildAsync at line 441. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/SessionBuild.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/SessionBuild.fs"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"6207607e44a997bd334b306cc7a82e06b0043805ff341db2a615fb986cbcaddb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Features/ReloadOutcome.fs: SageFs.Core/Features/ReloadOutcome.fs changed 14 times in last 90 days, max cyclomatic complexity 20 in ReloadOutcomeModule.describe at line 400. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Features/ReloadOutcome.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/ReloadOutcome.fs"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbed40ee582a45a288a7d5c8bf497f92be17bdf279b9e6841a3886f604003752"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs/McpAdapter.fs: SageFs/McpAdapter.fs changed 7 times in last 90 days, max cyclomatic complexity 40 in McpAdapter.splitStatements at line 282. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs/McpAdapter.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpAdapter.fs"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"477a9b5422bb894c58742e2d78f28e5bae057bb63e9de74aacb33efb71bf2606"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Features/LiveTestingExecutors.fs: SageFs.Core/Features/LiveTestingExecutors.fs changed 13 times in last 90 days, max cyclomatic complexity 20 in ReflectionExecutor.invokeWith at line 55. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Features/LiveTestingExecutors.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveTestingExecutors.fs"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef5cba129cc5bdcca18db69f53941757ce1dd990dbf492edeaa63f50a85a1e5b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/AppRun.fs: SageFs.Core/AppRun.fs changed 16 times in last 90 days, max cyclomatic complexity 16 in AppRun.describeState 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/AppRun.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/AppRun.fs"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c766e08b8d00f99df422cfb8baa00001943affc59bc31d9108ad374a37fc799"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs/McpStdioBridge.fs: SageFs/McpStdioBridge.fs changed 8 times in last 90 days, max cyclomatic complexity 28 in McpStdioBridge.run at line 133. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs/McpStdioBridge.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpStdioBridge.fs"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4d632609f6ff6497c45e8f6ea84785cbbd725409fae9ebcd678a831b4b52a4f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Features/MetadataDelta/MethodDiff.fs: SageFs.Core/Features/MetadataDelta/MethodDiff.fs changed 3 times in last 90 days, max cyclomatic complexity 72 in MethodDiff.diff at line 182. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Features/MetadataDelta/MethodDiff.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/MetadataDelta/MethodDiff.fs"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ecff7643607b397d26d1f30f1052ed757ebb5c5b3761ce210fa6d32cb40137a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Features/Tweak/TweakLog.fs: SageFs.Core/Features/Tweak/TweakLog.fs changed 13 times in last 90 days, max cyclomatic complexity 16 in TweakLog.foldEvents at line 333. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Features/Tweak/TweakLog.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/Tweak/TweakLog.fs"},"region":{"startLine":333}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ddfbea996f6535a6539325631c5443b99420ca17422023f28204d5bd186f73d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Features/ReloadBroadcast.fs: SageFs.Core/Features/ReloadBroadcast.fs changed 12 times in last 90 days, max cyclomatic complexity 17 in ReloadBroadcast.refusalCaseName at line 53. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Features/ReloadBroadcast.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/ReloadBroadcast.fs"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"873a92457012d55d18381c51cec77e2dfe043814a557a7949a3e1250c428d183"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/HostAgent.fs: SageFs.Core/HostAgent.fs changed 12 times in last 90 days, max cyclomatic complexity 17 in HostAgent.afterEvalStep 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/HostAgent.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/HostAgent.fs"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"37c6f5d7c7dd17717ec2d9a025aac2094a71e401547b83e985253f7f2f7b194e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs/McpPushNotifications.fs: SageFs/McpPushNotifications.fs changed 6 times in last 90 days, max cyclomatic complexity 34 in PushEventModule.formatForLlm at line 95. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs/McpPushNotifications.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpPushNotifications.fs"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dc1a47d18db2475b2588463b4b84c4c0bc5a818f051739aaed9ac2290abfa42"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Middleware/ValueReads.fs: SageFs.Core/Middleware/ValueReads.fs changed 7 times in last 90 days, max cyclomatic complexity 28 in ValueReads.fateAt at line 273. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Middleware/ValueReads.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/ValueReads.fs"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"dceeb8ceca40869463a83465a16ca3e0850b1965badb25ec71ec641034de5888"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs/EnvCheck.fs: SageFs/EnvCheck.fs changed 9 times in last 90 days, max cyclomatic complexity 20 in EnvCheck.sdkCheckFromInputs at line 314. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs/EnvCheck.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/EnvCheck.fs"},"region":{"startLine":314}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d3388e46ce6be20e2819e1aa3368005b3320b3693aee19bea6bb840e22e2191"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs/FrictionSqlite.fs: SageFs/FrictionSqlite.fs changed 4 times in last 90 days, max cyclomatic complexity 43 in Store.create at line 250. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs/FrictionSqlite.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/FrictionSqlite.fs"},"region":{"startLine":250}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b6c1b040a69cd9d20cd1fa71f50a6aa02b31212a09750003cb980d80ddde971"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Features/LiveTestingCycle.fs: SageFs.Core/Features/LiveTestingCycle.fs changed 3 times in last 90 days, max cyclomatic complexity 55 in TestCycleEffects.decideAfterTypeCheck at line 76. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Features/LiveTestingCycle.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveTestingCycle.fs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2ffd027f809f8c115fdbf8a1cba5423bab0f2b40bf4d3f8b7becbd39abca9a8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Args.fs: SageFs.Core/Args.fs changed 10 times in last 90 days, max cyclomatic complexity 16 in WorkerConfigModule.fromEnvironmentWith at line 120. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Args.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Args.fs"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a92d7f4100bb71d6a50f2b9da0fb5fe1f4d2ac23188915808c8080b4caf48c1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Middleware/GenericReload.fs: SageFs.Core/Middleware/GenericReload.fs changed 2 times in last 90 days, max cyclomatic complexity 80 in GenericReload.reach at line 193. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Middleware/GenericReload.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/GenericReload.fs"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"6de0a2c755b979683fc5b3b82deb840ff251ac26a19f045a7909540189db7240"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Features/ManifestPersistence.fs: SageFs.Core/Features/ManifestPersistence.fs changed 4 times in last 90 days, max cyclomatic complexity 37 in ManifestReader.read at line 125. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Features/ManifestPersistence.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/ManifestPersistence.fs"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"5adecee06162ccf2cfc80b91942ece75a3cef5f403a668b13b0b1e08c62126c2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Features/TestCachePersistence.fs: SageFs.Core/Features/TestCachePersistence.fs changed 5 times in last 90 days, max cyclomatic complexity 29 in TestCacheReader.read at line 325. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Features/TestCachePersistence.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/TestCachePersistence.fs"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc03854c3e05d127a0af2e346217d0cd8113cc77e7985bfdaa483f0aae01bbae"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Middleware/CompilationContext.fs: SageFs.Core/Middleware/CompilationContext.fs changed 9 times in last 90 days, max cyclomatic complexity 16 in CompilationContext.transformWholeFile at line 327. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Middleware/CompilationContext.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/CompilationContext.fs"},"region":{"startLine":327}}}],"partialFingerprints":{"codehealthFindingId/v1":"9afb3deb3b067981da927c9a19afb399aaf0f4316d55c9b2d26100f6d3a54f40"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Simulation/TweakSim.fs: SageFs.Simulation/TweakSim.fs changed 6 times in last 90 days, max cyclomatic complexity 23 in TweakSim.step at line 323. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Simulation/TweakSim.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/TweakSim.fs"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"41a0e86fc37c563a93e417e505bbcd50730f5ef374ee1be81954c7b46224011a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/lemmings/ui/nvim/Nvim.fs: scripts/lemmings/ui/nvim/Nvim.fs changed 5 times in last 90 days, max cyclomatic complexity 27 in Nvim.parseShellCommand at line 325. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- scripts/lemmings/ui/nvim/Nvim.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lemmings/ui/nvim/Nvim.fs"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4f2f0066734ec54508001f65d5990be50e51f7f591a6af3966fe0bab2f984fd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs/DaemonClient.fs: SageFs/DaemonClient.fs changed 2 times in last 90 days, max cyclomatic complexity 53 in DaemonClient.actionToApi at line 167. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs/DaemonClient.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DaemonClient.fs"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"12274d0c2e1cb8f8f988a9316663a6f0c0ff70ef15aa01870a10429809d233af"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/SessionHealth.fs: SageFs.Core/SessionHealth.fs changed 6 times in last 90 days, max cyclomatic complexity 16 in SessionHealthModule.classify at line 123. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/SessionHealth.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/SessionHealth.fs"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c19c1f761fb9c795046e9c7829b1d4ddf2221ec16d99b00f0cf86c28ef16f36"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Features/MetadataDelta/IlCanon.fs: SageFs.Core/Features/MetadataDelta/IlCanon.fs changed 2 times in last 90 days, max cyclomatic complexity 45 in IlCanon.canonicalize at line 226. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Features/MetadataDelta/IlCanon.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/MetadataDelta/IlCanon.fs"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"d23ca8a3bf82c6483b06d5e954b93b0f6125a7d00b37b2eee97723c16ea695dc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Features/MemberEvaluation.fs: SageFs.Core/Features/MemberEvaluation.fs changed 3 times in last 90 days, max cyclomatic complexity 28 in Evaluator.RunGuarded at line 136. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Features/MemberEvaluation.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/MemberEvaluation.fs"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a556605274030c971ffcd4d42caf8c44d45c3c2efb36fd84b4485eec6024d50"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs/SseEvent.fs: SageFs/SseEvent.fs changed 4 times in last 90 days, max cyclomatic complexity 21 in SseEventModule.toJson at line 161. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs/SseEvent.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/SseEvent.fs"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"79848c3576d56b5040438bb7e455786514349a40f3054b7a22bf6497b31a47bd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Middleware/ValueReadTracking.fs: SageFs.Core/Middleware/ValueReadTracking.fs changed 4 times in last 90 days, max cyclomatic complexity 21 in ValueReadTracking.reflectionSitesOf at line 549. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Middleware/ValueReadTracking.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Middleware/ValueReadTracking.fs"},"region":{"startLine":549}}}],"partialFingerprints":{"codehealthFindingId/v1":"67c81231177d75aa5abe6939585e0c2d4061603ad0449844d3f2c8fe966dae50"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/WorkspaceHygiene.fs: SageFs.Core/WorkspaceHygiene.fs changed 5 times in last 90 days, max cyclomatic complexity 16 in WorkspaceHygiene.classify at line 587. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/WorkspaceHygiene.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/WorkspaceHygiene.fs"},"region":{"startLine":587}}}],"partialFingerprints":{"codehealthFindingId/v1":"88dbb9b4da1d6089a92f2a867bd89925416004efd09005a4464e23c112acd065"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/ExpensiveWorkLease.fs: SageFs.Core/ExpensiveWorkLease.fs changed 4 times in last 90 days, max cyclomatic complexity 19 in ExpensiveWorkLease.requestCore at line 324. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/ExpensiveWorkLease.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/ExpensiveWorkLease.fs"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"caacdfcc3f3e7fb8cfc750312b23d8f5b5e3b568f5a3d33831c87a8cd43162eb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Features/EvalStore.fs: SageFs.Core/Features/EvalStore.fs changed 4 times in last 90 days, max cyclomatic complexity 19 in EvalStore.materializeScope at line 359. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Features/EvalStore.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/EvalStore.fs"},"region":{"startLine":359}}}],"partialFingerprints":{"codehealthFindingId/v1":"a45dcfbb710e826fb967ceb37ca7eb3b7e57068ecc0df46535698b8b1a5eb71b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Features/LiveTestActivity.fs: SageFs.Core/Features/LiveTestActivity.fs changed 5 times in last 90 days, max cyclomatic complexity 15 in LiveTestActivityModule.shortLabel at line 217. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Features/LiveTestActivity.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveTestActivity.fs"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f1ae4cce997fa6180707d2399451e731ae6f95213799d6e4d4e9571c3809245"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/WarmupContext.fs: SageFs.Core/WarmupContext.fs changed 4 times in last 90 days, max cyclomatic complexity 18 in SessionContextTui.detailLines at line 223. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/WarmupContext.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/WarmupContext.fs"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"689cd89712285607ba78d20bdefd03bfe1631a571a3948df9e9e9a20cbc344c0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Features/RestartSubjectDecision.fs: SageFs.Core/Features/RestartSubjectDecision.fs changed 4 times in last 90 days, max cyclomatic complexity 18 in RestartSubjectDecision.unscopeableOf at line 52. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Features/RestartSubjectDecision.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/RestartSubjectDecision.fs"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"753fdf866ebfb1da0e335386195cb1979f8cdbebb6ab06e0737be4ce33b7397d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs/TerminalUI.fs: SageFs/TerminalUI.fs changed 2 times in last 90 days, max cyclomatic complexity 36 in TerminalInput.mapKeyWith at line 325. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs/TerminalUI.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/TerminalUI.fs"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4d76ea8a9796b6a5d6c72896732d82b57b9ee15e81d1e482f615ab53fdf07e2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/MachineProfile.fs: SageFs.Core/MachineProfile.fs changed 3 times in last 90 days, max cyclomatic complexity 23 in MachineProbeReader.storageOf at line 368. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/MachineProfile.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/MachineProfile.fs"},"region":{"startLine":368}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b6edc385a99872e0d4a5780fd1912bab036978dc5464f1f845a5f4845d9dbc9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/McpBridge.fs: SageFs.Core/McpBridge.fs changed 2 times in last 90 days, max cyclomatic complexity 30 in McpBridge.decide at line 188. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/McpBridge.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/McpBridge.fs"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"3dfa9a849823326ad20281ff0dadfc38adf1052a839507f1e9af5ef55183f674"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Features/CoverageInstrumenter.fs: SageFs.Core/Features/CoverageInstrumenter.fs changed 3 times in last 90 days, max cyclomatic complexity 20 in CoverageInstrumenter.insertBeforeWithFixup at line 148. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Features/CoverageInstrumenter.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/CoverageInstrumenter.fs"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"913c0bf12f11a2709c29db605a4e79507eac1335d5cfc011c8f0e54046d709d3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs/CohortInspector.fs: SageFs/CohortInspector.fs changed 3 times in last 90 days, max cyclomatic complexity 17 in CohortInspector.search at line 319. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs/CohortInspector.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/CohortInspector.fs"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"c354b280e97a7d360da767064e22c9d206b2a64e8f0da1e0b6c402129d2edab9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Host/Resources/devreload.js: SageFs.Host/Resources/devreload.js changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in devreload.es.onmessage at line 158. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Host/Resources/devreload.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":"SageFs.Host/Resources/devreload.js"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"e049c97befcc03bef531d730b2931804611d953ec3baab6802b09285c7248a2f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs/Resources/devreload.js: SageFs/Resources/devreload.js changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in devreload.es.onmessage at line 158. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs/Resources/devreload.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":"SageFs/Resources/devreload.js"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebf0503a1ae01a0978751f44e89e7ee019bbd02b889bcd758da5b9a5e6db4a66"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs/CohortGit.fs: SageFs/CohortGit.fs changed 3 times in last 90 days, max cyclomatic complexity 16 in CohortGit.rebaseCommitsOnto at line 279. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs/CohortGit.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/CohortGit.fs"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c7bf8d09e7862cdf2ccab58e6e0528c5370a73f3c2ac3757859eab5687a12af"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Simulation/HygieneSim.fs: SageFs.Simulation/HygieneSim.fs changed 2 times in last 90 days, max cyclomatic complexity 24 in HygieneSim.applyOp at line 246. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Simulation/HygieneSim.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/HygieneSim.fs"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"af849e6461f1f98ff0307f7dcb4f5116ba4fe8f016f8fb13dc5763d037a44ad5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs/McpCohortIntegration.fs: SageFs/McpCohortIntegration.fs changed 2 times in last 90 days, max cyclomatic complexity 21 in McpCohortIntegration.setIntegrationRef at line 82. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs/McpCohortIntegration.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/McpCohortIntegration.fs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"99b546d79b1ab7e8bcf78740ebb3d606e10b045808a81f2bc0a8ac1c5a5a14ef"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/EvalActorDecision.fs: SageFs.Core/EvalActorDecision.fs changed 2 times in last 90 days, max cyclomatic complexity 20 in EvalActorDecision.decide at line 139. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/EvalActorDecision.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/EvalActorDecision.fs"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"831663ba570b0e19cf67ee64538303fa23d3b72678852dd939a97af8cb4cf5db"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/CompileOrderInsight.fs: SageFs.Core/CompileOrderInsight.fs changed 2 times in last 90 days, max cyclomatic complexity 19 in CompileOrderInsight.analyzeWithReferences at line 156. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/CompileOrderInsight.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/CompileOrderInsight.fs"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"c56407c4031f5ef3a3861a4d9e562c3547c374ce39af86442da1d73edf968b35"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs/HygieneEdge.fs: SageFs/HygieneEdge.fs changed 2 times in last 90 days, max cyclomatic complexity 19 in HygieneEdge.removeWorktree at line 32. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs/HygieneEdge.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/HygieneEdge.fs"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"d34f8db747fa1f27a11f51c5d70be59bf1b33aef51094bcf2d1c2d6a7b5dcf8b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs/HygieneGather.fs: SageFs/HygieneGather.fs changed 2 times in last 90 days, max cyclomatic complexity 18 in HygieneGather.readProcesses at line 192. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs/HygieneGather.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/HygieneGather.fs"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"12f249e3315a8cc20908be801a45c25ae85180c5cdb20c45f0ec16baf4368dc7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Features/Tweak/LiteralEdit.fs: SageFs.Core/Features/Tweak/LiteralEdit.fs changed 2 times in last 90 days, max cyclomatic complexity 18 in LiteralEdit.valueOfConst at line 77. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Features/Tweak/LiteralEdit.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/Tweak/LiteralEdit.fs"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"417209a0d949dd421f2bd4279f84298e82b1af2130940367cbbdd741c9b5871c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/RuntimeCompat.fs: SageFs.Core/RuntimeCompat.fs changed 2 times in last 90 days, max cyclomatic complexity 17 in RuntimeCompat.parseRuntimeRequirement at line 79. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/RuntimeCompat.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/RuntimeCompat.fs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"81be451575f30d488393c496eda802f573bced00e11f78fe8fa18a198f703e34"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/WorkerSpawn.fs: SageFs.Core/WorkerSpawn.fs changed 2 times in last 90 days, max cyclomatic complexity 16 in WorkerSpawn.startWorkerProcess at line 28. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/WorkerSpawn.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/WorkerSpawn.fs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8296afacdbd6b86cc40d36b5bb00c5561d4358eb203711345404c9e16aaa0da"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Host/DevReloadInjector.fs: SageFs.Host/DevReloadInjector.fs changed 2 times in last 90 days, max cyclomatic complexity 16 in DevReloadInjector.install at line 131. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Host/DevReloadInjector.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Host/DevReloadInjector.fs"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"f43571181a6dadc317a6ca2d915c03f196ff9988573f8a245878403fe4ed3854"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/Features/Tweak/TweakAddress.fs: SageFs.Core/Features/Tweak/TweakAddress.fs changed 2 times in last 90 days, max cyclomatic complexity 15 in TweakAddress.walkPath at line 283. Frequent change and high complexity in one file compound: schedule 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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Features/Tweak/TweakAddress.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/Tweak/TweakAddress.fs"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"34d6d3ddbeb821c8833ae47f5c328743b15df5c48e5bc33c64793f0e3fa1ca86"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: SageFs.Core/HttpOriginGuard.fs: SageFs.Core/HttpOriginGuard.fs changed 2 times in last 90 days, max cyclomatic complexity 15 in HttpOriginGuard.decide at line 230. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/HttpOriginGuard.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/HttpOriginGuard.fs"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"9435a45011c2c4f9898ada73d644484da479a29445e02d2e595aaf62a859b226"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: SageFs.Core/ActorCreation.fs: SageFs.Core/ActorCreation.fs changed 14 times in last 90 days and 8 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 8 (its worst body is ActorCreation.createActorImmediate at line 97), 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(isolation): a project\u0027s pins reach the host, or the session says what it could not do\u201D; \u201Cfix(sessions): a session whose FSI host died on its own leaves Ready and says why\u201D; \u201Cfix(fsi): stop rewriting \u0060use\u0060 to \u0060let\u0060, which was silently dropping disposal\u201D; \u201Cfix(isolated-fsi): resolve the project/host FSharp.Core identity mismatch (#141)\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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/ActorCreation.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/ActorCreation.fs"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"131c0ef97c7599035739b93e4b03f633069542e7dd5d7d71854b4239741f44cc"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: SageFs.Core/FileWatcher.fs: SageFs.Core/FileWatcher.fs changed 10 times in last 90 days and 8 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 9 (its worst body is FileWatcher.watchableDirsCapped at line 157), 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(watcher): a watch root that is the home directory or above it is refused and reported\u201D; \u201Cfix(file-watcher): report a watcher\u0027s Error events to ComponentWatch\u201D; \u201Cfix(watcher): switch to one recursive watch per root, not one per directory\u201D; \u201Cfix(watcher): stop the file watcher from silently starving on build-scratch dirs\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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/FileWatcher.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/FileWatcher.fs"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b0f2204f256d0abcbbc41c1e5fc86b165948f8991e95ede06aad4f3bd82c67d"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: SageFs.Core/DaemonState.fs: SageFs.Core/DaemonState.fs changed 9 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 13 (its worst body is DaemonState.probeDaemonHttpAsync at line 254), 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(machine-tier): find the data directory without running DaemonState\u0027s initialiser, so the tier is settled before a wait is read\u201D; \u201Cfix(logging): report the log file the sink is writing, not the one its date implies\u201D; \u201Cfix(logging): bound the daemon log, honour SAGEFS_DATA_DIR, make the filters reach the file\u201D; \u201Cfix(watcher): stop the file watcher from silently starving on build-scratch dirs\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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/DaemonState.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/DaemonState.fs"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1fefe31bf107784c870ff0a2a77d03835f9a62152e22931a95c2e1534386b63"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: SageFs.Core/ErrorMessages.fs: SageFs.Core/ErrorMessages.fs changed 7 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 13 (its worst body is ErrorMessages.categorize at line 23), 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(live-testing): use the compiler\u0027s own FSI naming rule, not three string heuristics\u201D; \u201Cfix(eval): don\u0027t send a module/namespace header to FSI as if it were code\u201D; \u201Cfix(eval): runtime exceptions lead with type \u002B message \u002B the user\u0027s code line (roast UX-3)\u201D; \u201Cfix(diagnostics): thread the FS error number through classification\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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/ErrorMessages.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/ErrorMessages.fs"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"05231283f89c5ac184aed52e373d8afa6cf7cadee548d2c7eee6992395733cb8"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: SageFs.Core/WarmupReplayCache.fs: SageFs.Core/WarmupReplayCache.fs 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 8 (its worst body is WarmupReplayCache.ignoreGeneratedFile at line 278), 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(warmup): the cache ignores itself in git, so a new user\u0027s first git status stays clean\u201D; \u201Cfix(dashboard,warmup): stop leaking ex.Message; write warmup cache atomically\u201D; \u201Cfix(warmup): don\u0027t replay a source file\u0027s open of its own internal module\u201D; \u201Cfix(cache): lossless failure-kind codec \u002B content-aware warmup fingerprint\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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/WarmupReplayCache.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/WarmupReplayCache.fs"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8e8577a8a76e5a7463faa375e3b9825f53bffdf6dc0b4e580852b3db30a9f93"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: SageFs.Core/Features/InputHashCoverage.fs: SageFs.Core/Features/InputHashCoverage.fs 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 6 (its worst body is InputHashCoverage.trustBeyond at line 153), 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(cohort): a landing is verified against the files evaluated over the build, not coverage alone\u201D; \u201Cfix(gate): a test\u0027s cache key sees the files coverage cannot, trustBeyond and seenFiles\u201D; \u201Cfix(gate): a test whose coverage hit nothing has no cache key, so it is always run\u201D; \u201Cfix(cohort): fold the daemon\u0027s own semantics version into the landing-cache key (roast-7 \u00A77)\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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Features/InputHashCoverage.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/InputHashCoverage.fs"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3400235ee3ae35328ea12523947a25da7a8b2e763db64e6afbb50806ea68e18"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: SageFs.Simulation/TweakSimInvariants.fs: SageFs.Simulation/TweakSimInvariants.fs 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 12 (its worst body is TweakSimInvariants.whyKeptAgreesWithGroundTruthAfterMultipleRounds at line 289), 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(tweak): GREEN, whyKept sees across any number of compaction rounds\u201D; \u201Cfix(tweak): GREEN, rollback resolves correctly across a compaction boundary\u201D; \u201Cfix(tweak): GREEN, no Option or bool stands in for domain state anymore\u201D; \u201Cfix(tweak): route every production error through a real type, not string\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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Simulation/TweakSimInvariants.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Simulation/TweakSimInvariants.fs"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"7761430f0048b6f221fd89acc734b6508766735e579098917276a37f8a9532ce"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: SageFs.Core/ShadowCopy.fs: SageFs.Core/ShadowCopy.fs 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 ShadowCopy.shadowCopyFile at line 101), 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(daemon): drain deferred shadow deletes, and stay quiet when a non-Ready worker refuses a fetch\u201D; \u201Cfix(daemon): make --ttl fail-safe and fix run_app\u0027s missing NuGet deps\u201D; \u201Cfix(shadow): a hard reset sweeps only shadow copies whose owner is gone\u201D; \u201Cfix(loading): robust project loading \u002B warmup transparency \u002B dashboard UX\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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/ShadowCopy.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/ShadowCopy.fs"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"beefedfe2ad8f5a0e182af4b2e9c235fac7c310cdba75307b02255ef9977347f"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: SageFs.Core/Features/Verification.fs: SageFs.Core/Features/Verification.fs 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 13 (its worst body is TargetedVerification.describeBlocker at line 358), 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(verification): let a blocked evidence outcome outrank the plan sentence\u201D; \u201Cfix(cohort): fail fast on a terminal integration session, carrying the reason\u201D; \u201Cfix(session): fold FaultReason/WorkerPid/WorkerPort into SessionLifecycleStatus\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-04..2026-10-02, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-04 14:48:47 -05:00\u0027 --until=\u00272026-10-02 14:48:47 -05:00\u0027 --full-history --no-merges -- SageFs.Core/Features/Verification.fs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/Verification.fs"},"region":{"startLine":358}}}],"partialFingerprints":{"codehealthFindingId/v1":"f888f5a92994e526da21ec94c5f5a4545cb3b56b11dde9e843ffd0422ba72ab2"}},{"ruleId":"D17","level":"warning","message":{"text":"BarePragmaDisable: #pragma warning disable CS0649 \u2014 the disable is closed again below, so its scope is not the problem; what it records is no reason: there is nothing on the directive line, and no ordinary comment attached to it either side. A suppression is a decision somebody made, and without the reason the next reader cannot tell a considered exception from an unexamined one, so it is never revisited and it outlives the code it was written for. Put the reason on the directive line \u2014 what makes this site legitimately different \u2014 or fix what the rule is pointing at and delete the pair. A rationale in the member\u0027s documentation comment does not clear this row and is not meant to: it explains the member to its callers, and the next person to touch the suppression is not reading it for that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio.Editor/CellHighlightAdornment.cs"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec43e50546d832ba1399a7a359799c3d85e306e8c2ab9042dd08184d9db4f916"}},{"ruleId":"D17","level":"warning","message":{"text":"BarePragmaDisable: #pragma warning disable CS0649 \u2014 the disable is closed again below, so its scope is not the problem; what it records is no reason: there is nothing on the directive line, and no ordinary comment attached to it either side. A suppression is a decision somebody made, and without the reason the next reader cannot tell a considered exception from an unexamined one, so it is never revisited and it outlives the code it was written for. Put the reason on the directive line \u2014 what makes this site legitimately different \u2014 or fix what the rule is pointing at and delete the pair. A rationale in the member\u0027s documentation comment does not clear this row and is not meant to: it explains the member to its callers, and the next person to touch the suppression is not reading it for that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio.Editor/InlineEvalAdornment.cs"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6f6a35f255604c2318576c07a35a0575a51aa6a26cb6c0a1221f893a85e053a"}},{"ruleId":"D17","level":"warning","message":{"text":"BarePragmaDisable: #pragma warning disable CS0649 \u2014 the disable is closed again below, so its scope is not the problem; what it records is no reason: there is nothing on the directive line, and no ordinary comment attached to it either side. A suppression is a decision somebody made, and without the reason the next reader cannot tell a considered exception from an unexamined one, so it is never revisited and it outlives the code it was written for. Put the reason on the directive line \u2014 what makes this site legitimately different \u2014 or fix what the rule is pointing at and delete the pair. A rationale in the member\u0027s documentation comment does not clear this row and is not meant to: it explains the member to its callers, and the next person to touch the suppression is not reading it for that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio.Editor/InlineFailureAdornment.cs"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4c977a18f83a6f13788e97a7805f31e8e4d505c6763f8a8e24d951a57b7e6a1"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio.Editor/DensityModeHelper.cs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"b42b1868cafcecfb50843ca0f4132f74a377fbc19371a5c4dbbc9261d548aca4"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio.Editor/InlineEvalAdornment.cs"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d5403e4b65f82bd561333ba1fd964ee0ff745416528bf167e576b61ac0cbc79"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio.Editor/InlineFailureAdornment.cs"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"a964a4adb73974d00a3a9b835e5a6b0a92b47d936f49b57e0d04be3395f087ed"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block \u2014 the error is discarded with nothing recorded, so a failure here leaves no trace anywhere. Narrow the catch to the exception you actually expect, record it through whatever this codebase already uses to report problems, or \u2014 where swallowing really is correct, as it often is on a teardown/dispose path where throwing would mask the original failure \u2014 write down WHY in a comment on the catch. The comment has to give the reason: a note that only restates the swallow (\u0022ignored\u0022, \u0022do nothing\u0022) is read as no explanation at all and leaves this row in place. Any of the three makes the decision reviewable; all three clear this row."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio/Commands/ToggleDensityModeCommand.cs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9176a51a2ca688db88f86f97e1407ef476c51c2dd461bf89a6135915b6595b7"}},{"ruleId":"D17","level":"warning","message":{"text":"BarePragmaDisable repeated across 16 files: The identical BarePragmaDisable (\u0060#pragma warning disable VSEXTPREVIEW_OUTPUTWINDOW\u0060) appears in 16 files (16 occurrences) \u2014 a single repo-wide policy (e.g. a Directory.Build.props decision or an idiomatic suppression), not 16 independent debts. Decide it once centrally rather than file-by-file. (Every occurrence still counts toward the score and metrics.)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio/Commands/CellNavigationCommands.cs"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"a07e085d0c33afab9222ff8ca4f77a0ef34facb6a847d0f64145a0fa11e6fa15"}},{"ruleId":"D17","level":"error","message":{"text":"WriteOnlyPrivateField: private string[] PolicyLabels \u2014 assigned 1 time(s), read never \u2014 this field is written and never read anywhere its type can be reached from, so the state it keeps answers no question: every assignment to it computes a value that nothing observes, on every instance, for the lifetime of each one. It reads as a flag the code branches on, and nothing branches on it. Delete the field and its assignments \u2014 or, if the value was MEANT to be consulted, the missing read is the defect this row is pointing at, and the branch that should have depended on it is not there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio/Commands/LiveTestingCommands.cs"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"705682e3310d1748ddca55d212567ef79932b8d9b1ecd5643b5093a61361fb67"}},{"ruleId":"D17","level":"error","message":{"text":"WriteOnlyPrivateField: private string[] CategoryLabels \u2014 assigned 1 time(s), read never \u2014 this field is written and never read anywhere its type can be reached from, so the state it keeps answers no question: every assignment to it computes a value that nothing observes, on every instance, for the lifetime of each one. It reads as a flag the code branches on, and nothing branches on it. Delete the field and its assignments \u2014 or, if the value was MEANT to be consulted, the missing read is the defect this row is pointing at, and the branch that should have depended on it is not there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio/Commands/LiveTestingCommands.cs"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e56acab3b516a3611227e25ba5787ac0df067dca9457da013400a8d6d554caa"}},{"ruleId":"D17","level":"warning","message":{"text":"BarePragmaDisable: #pragma warning disable VSEXTPREVIEW_DIAGNOSTICS \u2014 the disable is closed again below, so its scope is not the problem; what it records is no reason: there is nothing on the directive line, and no ordinary comment attached to it either side. A suppression is a decision somebody made, and without the reason the next reader cannot tell a considered exception from an unexamined one, so it is never revisited and it outlives the code it was written for. Put the reason on the directive line \u2014 what makes this site legitimately different \u2014 or fix what the rule is pointing at and delete the pair. A rationale in the member\u0027s documentation comment does not clear this row and is not meant to: it explains the member to its callers, and the next person to touch the suppression is not reading it for that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio/Services/ErrorListBridge.cs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3ecfb1270fd6885a0307152f8f18551ebadf87782977f671d51463f59ce2b94"}},{"ruleId":"D17","level":"warning","message":{"text":"BarePragmaDisable: #pragma warning disable VSEXTPREVIEW_DIAGNOSTICS \u2014 the disable is closed again below, so its scope is not the problem; what it records is no reason: there is nothing on the directive line, and no ordinary comment attached to it either side. A suppression is a decision somebody made, and without the reason the next reader cannot tell a considered exception from an unexamined one, so it is never revisited and it outlives the code it was written for. Put the reason on the directive line \u2014 what makes this site legitimately different \u2014 or fix what the rule is pointing at and delete the pair. A rationale in the member\u0027s documentation comment does not clear this row and is not meant to: it explains the member to its callers, and the next person to touch the suppression is not reading it for that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio/Services/TestDiagnosticsBridge.cs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"647da64f85caf188ebc316065c3e785199cd18b04fef3b8a96e95aba904b1a6e"}},{"ruleId":"D17","level":"warning","message":{"text":"BarePragmaDisable: #pragma warning disable VSEXTPREVIEW_CODELENS \u2014 the disable is closed again below, so its scope is not the problem; what it records is no reason: there is nothing on the directive line, and no ordinary comment attached to it either side. A suppression is a decision somebody made, and without the reason the next reader cannot tell a considered exception from an unexamined one, so it is never revisited and it outlives the code it was written for. Put the reason on the directive line \u2014 what makes this site legitimately different \u2014 or fix what the rule is pointing at and delete the pair. A rationale in the member\u0027s documentation comment does not clear this row and is not meant to: it explains the member to its callers, and the next person to touch the suppression is not reading it for that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio/Services/EvalCodeLensProvider.cs"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"14b57b4c045dde1faafee23d112db4d1ef357d3f180b4c4fe6b47619e4190923"}},{"ruleId":"D17","level":"warning","message":{"text":"BarePragmaDisable: #pragma warning disable VSEXTPREVIEW_CODELENS \u2014 the disable is closed again below, so its scope is not the problem; what it records is no reason: there is nothing on the directive line, and no ordinary comment attached to it either side. A suppression is a decision somebody made, and without the reason the next reader cannot tell a considered exception from an unexamined one, so it is never revisited and it outlives the code it was written for. Put the reason on the directive line \u2014 what makes this site legitimately different \u2014 or fix what the rule is pointing at and delete the pair. A rationale in the member\u0027s documentation comment does not clear this row and is not meant to: it explains the member to its callers, and the next person to touch the suppression is not reading it for that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio/Services/TestCodeLensProvider.cs"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"d73254a944e3b892d66a362d350878eb163abc97d2a6311f77c2340c5364794e"}},{"ruleId":"D17","level":"error","message":{"text":"WriteOnlyPrivateField: private Timer? _vitalsTimer \u2014 assigned 1 time(s), read never \u2014 this field is written and never read anywhere its type can be reached from, so the state it keeps answers no question: every assignment to it computes a value that nothing observes, on every instance, for the lifetime of each one. It reads as a flag the code branches on, and nothing branches on it. Delete the field and its assignments \u2014 or, if the value was MEANT to be consulted, the missing read is the defect this row is pointing at, and the branch that should have depended on it is not there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio/StatusBar/StatusBarManager.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"e95f0e2466d12807cca25b9730274e3db925b5f24d6e2bb5ef1b8c3d71276b22"}},{"ruleId":"D17","level":"error","message":{"text":"WriteOnlyPrivateField: private VisualStudioExtensibility extensibility \u2014 assigned 1 time(s), read never \u2014 this field is written and never read anywhere its type can be reached from, so the state it keeps answers no question: every assignment to it computes a value that nothing observes, on every instance, for the lifetime of each one. It reads as a flag the code branches on, and nothing branches on it. Delete the field and its assignments \u2014 or, if the value was MEANT to be consulted, the missing read is the defect this row is pointing at, and the branch that should have depended on it is not there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio/ToolWindows/HotReloadData.cs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"253707bfdc35fda2c310a6f1e7aef6d146b3a9c298fd1af6e34b28fb9927f5fa"}},{"ruleId":"D17","level":"error","message":{"text":"WriteOnlyPrivateField: private VisualStudioExtensibility extensibility \u2014 assigned 1 time(s), read never \u2014 this field is written and never read anywhere its type can be reached from, so the state it keeps answers no question: every assignment to it computes a value that nothing observes, on every instance, for the lifetime of each one. It reads as a flag the code branches on, and nothing branches on it. Delete the field and its assignments \u2014 or, if the value was MEANT to be consulted, the missing read is the defect this row is pointing at, and the branch that should have depended on it is not there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio/ToolWindows/LiveTestingData.cs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"290dab6013385c6dd2e41b13d53213fc7d434dd574cc937112d94bf16480b4ec"}},{"ruleId":"D17","level":"error","message":{"text":"WriteOnlyPrivateField: private VisualStudioExtensibility extensibility \u2014 assigned 1 time(s), read never \u2014 this field is written and never read anywhere its type can be reached from, so the state it keeps answers no question: every assignment to it computes a value that nothing observes, on every instance, for the lifetime of each one. It reads as a flag the code branches on, and nothing branches on it. Delete the field and its assignments \u2014 or, if the value was MEANT to be consulted, the missing read is the defect this row is pointing at, and the branch that should have depended on it is not there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio/ToolWindows/SessionContextData.cs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b397b4e156d26e8ecc5464ae63956ee320e866f6c6d3bc446eee2ee1ca41eff"}},{"ruleId":"D17","level":"error","message":{"text":"WriteOnlyPrivateField: private VisualStudioExtensibility extensibility \u2014 assigned 1 time(s), read never \u2014 this field is written and never read anywhere its type can be reached from, so the state it keeps answers no question: every assignment to it computes a value that nothing observes, on every instance, for the lifetime of each one. It reads as a flag the code branches on, and nothing branches on it. Delete the field and its assignments \u2014 or, if the value was MEANT to be consulted, the missing read is the defect this row is pointing at, and the branch that should have depended on it is not there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio/ToolWindows/TypeExplorerData.cs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae9fb8752261c1744711adf19e34afcb777aee1ecd343b612b33b7f30f0759f2"}},{"ruleId":"D17","level":"error","message":{"text":"NoWarnInCsproj: NU1608 \u2014 this warning is switched off for the WHOLE project, including builds years from now. It is raised by the build itself \u2014 the packaging, restore or SDK step \u2014 about the project as a whole, not by the compiler or an analyzer at a line of code, so there is no call site to narrow it to and no per-site directive that could carry a reason: this element is the only place the decision can be recorded. Say WHY here, in a comment on the entry, or fix what the rule is reporting and drop the code from the list."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Directory.Build.props"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dd2c0f1bc6fae94c476742a893c35de7153943503c0bde5fd83e9da0475b18e"}},{"ruleId":"D17","level":"error","message":{"text":"NoWarnInCsproj \u2014 known-vulnerability alert suppressed: NU1902 \u2014 this is not a style rule being switched off: it is the dependency audit reporting that a package this project references has a KNOWN, already-published security vulnerability, and the entry deletes that report for the whole project \u2014 for this package and for every dependency the project takes from here on, including ones added long after whoever wrote the line has moved on. Nothing in the build will raise it again, so the next reader has no way to learn it was ever accepted. Upgrade the package to a version carrying the fix, or replace it, and drop the code from the list. Where the fix genuinely does not exist yet, keep the report and stop it FAILING the build \u2014 demote it to a warning without silencing it \u2014 and write down which advisory is being accepted and until when, so it is the acceptance that expires rather than the alert."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Directory.Build.props"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9d2b43b8ab53514fb9bbd8ddf35937ba1228fa45d7b655a08e2167b6f72e42b"}},{"ruleId":"D19","level":"note","message":{"text":"Documentation: contradicts the code: The survey states 33 modules in SageFs.Core/Features/* as of the last update but the module count (and tool list) has grown beyond that and the MCP tools referenced are no longer registered. Update the stale survey to reflect the current module count and the live MCP tool inventory."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/FEATURES_SURVEY.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9a0962836c41f35ca92c653583ae590a5ed32f577a7fe345eae87937725b90d"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4a2557cacb98c98044507488e5b7ba39832ee54d2b84612cfdd8bd512e71063d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"21b2ad8981cbabaef66f21fdf9fdb603136880f309a4dab14826737ea09b2816"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ec5e9046faa2ad3912dd3122dfa1c72697c605eb589973c3370b5527a49b9c87"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"56398bc34383e011c7b3ffafafd115e37a2b47b31458c0ec23b09562304d19bd"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7c99b6b813f09fb9390188dbbb632434f854c01c7e59f8a6ee4daa05796711d4"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"138f00c5af7cdd6dd323efb63e97840ceeae64cdbb09e2c4bb11c97bf8483b05"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f25d3b22c188a4a308aba6946d2e325a9b7be03658b86f171ddc2254acb5efa4"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9d04133b8fb82313497a016d99a199b74ec46dd95be35e37baf2790941c3ad9b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b9cc67656b103a7d5225333ff1ce4f17b11159688648fad411f0c06a233c14f5"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3447f8e0aaea023e77c3463bb4d858ff307f4bfe2bb0fde5701c4a139d989c58"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"192020670e1a99f35bfcc9d97f2e7c9f75799092d73ac9a17879b6a41c84bbf4"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7c371df584c15b54f646ef30d17eb1365a8da144fcd082f019229f37d32e9d66"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"379fe0b49dbd77b993ea9f27008f923bfbbb20eed6b0a7b85f081d1cf8135d78"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"58f1954ea455c2bf12fbb7ab16ba56351e0e86cca8838cf389372f914212b62c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d9784a7afc486587d448cef418a34c81dd0804ea28d608c6e69ed620c4241453"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"59f097f1fef4d99ee02a1d7beab0f20be80bac7604a237089cbadb860523c13e"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"66774a3cf9bc21e32f614cc57fecd30365022bc0477a74fe5c2048576dc445f1"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"29ff915bac5f3394344f97985e50cf866f2dd47244f8cb9ac9b2136230588653"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"38c59e613c078776b96805111c3465fdaac07f138257ba9ea0905861cd358cfa"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"aa3c6c3db9fe95343a1ba752811b6cc7ef0237d04df7fde9a5bdd0821eb009b6"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ffdf2d38d6483579349b30446c7a369c46d2e06c19e1e2f44ac277a54a42c55d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"dcc1cc351148c784cef56497f9f21631882a05cd31b85d5cafa828560bdea431"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0dff581f26e9173d33a5a78446292a4f1136484e3f4d72f0f5c3fb28687fdd5a"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f8e529a8cae573e98202ecd45e983b6f29ef66de605458d45147aa7e55c931c5"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"eab32d057121e2332137a5c47e6c21120609d4e99b9423baa55e8e9e4f1c39f4"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b191d57168ea5084c4a8578c47a45243fc9ac87dfe9b5d44dbc0ed19eaa64be3"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"fc81024983b5225ddffe4a87752c02d128351130f44d71efb3d3440d666c75ab"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"73baeacd6d5487f30a1b28e60feb5543fc98f185afb747e95fb234597b589a81"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3d754ee2ba8b5aee201a1209861330199138e6c17110efa9435ab0ad00c7e238"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c1d299aa4f6034974f2e813c8ff49a480e388c462da94f0ed279bf1f039975bc"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"de032bb3a0dc973f9c1b945e543539af68b2236717497c5c7b4206f7214ebe0d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9e4d02a5adfe77b11dd9efba89d3319346833e031ca9c384b231dc3bf05a77b2"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f70303efa976fbb878c85fb3bcea35088e0430ee59819f6b6249352c7657ec6b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f653b90465d2f7fceef6c50195684d47b96b3163d55fa4c031143617f18b2040"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3e8c868e120e545e8cae553e6cb8d4763b3e1a701b064847bf37337210394b70"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e5d52af6998ad6a0426891ce7877185b62356c1f2764a273718e04080e3eeef9"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e15546c521b03b26ab61c7c1e9d82cb94a12acf438dad83e517449ddf6e96549"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a5220f9e9b8e74d0490800175cd9fc19b31c25fd474b6b1613b6ab952e4942a8"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"16e01bd5dae125d459f5f623ded243c89ee0f4ecb7903189bae87494212b7608"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"662618d1858d27199c821a8658e462e6c30383f6f959f985e136535ea7c8d002"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6087633b041ad3c976c664cf3384223614686a6c5359cf17789d716f52c6bad8"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2ae9bfe708559d0d6a033036d7c2d77feccf5d857aa3b2d02e3f8dc7802180ba"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d8f017719994fd40d5d6abbc2627b75925c3b2f2b416baa3ec479bf49844780a"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3dcc2898491850728380205c30032d75ca9df7abed1918e1bb88cf0cc004e14b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d7dfa815ce3af759874312a6bb3322b6022962d82d887c9c9fbc70a77273b672"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"dea5339ccd9819d07e2d2024f935520e38030d09149caa89c0bd255c1630eb7a"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"aad84d9dbdcdf72b8b494f116c56d49976e274dfb532e11f193424bccb0103c8"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b36ae6dfb0be90fdd3d8b7aa862311bdd1684d53b9e123d81bef141766e506fd"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ed3d53efe65d0d32f44ba3bef519ce2dda6932f581fe3c8b19789e6221142666"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2d003da3de9971d93fc3a15802c23d4c075ea4392b3dcc55de1c513418e8bf77"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ba13d03fce118b3525c71ac3576cb4ff6cc4b0180c13626c3bed258fd027ec19"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"231531c985f5cabc2f7c903be369517b5134b14fabb15a8876d2fe8b6f1f46fb"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5a22d0418398e9f1c2a8a59a0ce968864f93608ea36745f665c3f9276d5cd2ac"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"06bf78754f05b79b0c4a0dc06c4fef01ffbb33147bcd8af9e37618fd391c00b1"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ca579e7fac0ec430b20e76f306aefbc2d9e98e748d90df49d1bbe93628e65316"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4db2cf4ff5062f371db452b5e2810d802ea6fa86452e4b94356c59810597ff3e"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"346142c4c9ed0d18f521a5879a93fb9212f42e41940a23bbcd31b0f6c55ad097"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b85aac700b02e9034d20e423bc2fd6815b6d11157f164022a6c7044d48e49566"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"76522f936bf2e69ba8c81f9c659b2e2c2a01e0abd4ecc691caf15dce2e970adf"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"dc870184cc2f39aba1bd9ff61a80142c7934ed93b9f1aab1db187a1f2d15cd0c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b0027ce10352422001f821581e6ef6e25a1c3fdd21ba44d415f825dbaf504d28"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"881e5b06b4280f5b75cafee1c1b25e17ca303ef5e636d6f0fde4a6ea7052c340"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"31386813feedef0938a319694af2bdf1294c83c7e5ec110f5dc1e06d27e83603"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"69a505359f33bf0cb814d983536a6ca02422ae7ddc4d24ae1ca2682585156c78"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d71d21be7a17d374b51ef6f91c7f2083ecfcff5dbdec940e0899ac4aaae8f8b4"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"557f2a44f6cf4e47e3b280452f104c9cbf7adccdc23862a271474db29dbb0eab"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"65e955f4fbc142a6919490a5394eed0cb0f1b90f04cbe1ed58c96c78eeb935b8"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d60b11cc3164904aa8736802e3118eca01553e856bb1c2f322ec37d1bdb3ed70"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"47cccc658359550462ea51d12677005895dc60f076d6aaa8d49aa08cb12ad54a"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"eb32332028f3b3ff087cf16a4727f7cda0ced1ff9e55d5d3c37f06023bad2b7b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d55805fbf1f175ec08764d3b031eb01fa180639602ee5c7d21e8bdce4b67598d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"12d90ac93062b673a22ed64e8f8054dd6d33f6ed14624259eaf93cf2bb2ed486"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b29cbf0753b1c4c4172888d580324d6b3d45b53fdbf9af0d4905823e0867531d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"87f09c39297c7ef9ce8dc27dba91a85084d68cb44158d2a944234b84a986d243"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f3862a3821c5343aabcabbeb3e539423e6770dfea3880f00d8438d1e56e71a3e"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"256cba5fe66d30045ca0e6aae42733d099fcc619af6f0bfa5c65e1b43065e056"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7ab8f1dbb5cb9ba0e6689df8413cab4ea4ed0fcc3a09f1237f2bfca440220768"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5b65af83696df2fd3870915a9693aa4263483a277a3aa0ba4771de6c8edfde5e"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"048e7fd68971df944b17a7e310270f76e989f26d6779db0e9793c4ed9c982a25"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9df6fe339b96ddfaa03341687a13ab5e5967fbf5f0ba4fbaaae0c58d5e2b621e"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"baf24472f71372e018ba1334b5201a968acf446381af96ff141f94f8cd6525d9"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7b37eff90fd22af0ec850cf12639d109f3dc7f8d079bd3a68ab2b7fc638b5eb4"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"dda7c796ee42b9a8fe1b8836ee800852eb8816f45f237ae4cc06a67d28e09f37"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2c8b9d3e0f824783810ac060fe55567a25b9f59b608c5a63394eab7a33dcea65"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d103b733e92dbd288210eaff2eb4716071bb0da31476e3fb29409b3d35ce8211"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6c4c14ff495e13fa5d5adfdcee8f656282f51d8e7dfa6bdaded031f9e3bc043d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ff65ce12aad382513238518b134724c142747732d74f102239cfeea18f6c1579"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b6037f80ce70cd704cdee5ab75b7d2faa4b1aea429ac7a1ebf761b1a202f6037"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2f0515948aa0ddf6a12ccb2f7bc33876f9c0b193972c5c8f7ef10506ad711852"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b962ba8167dcc7812c1c354040200b7ef6347cce22c49d66b1ffc6d60022d333"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"418d997a45684b94ac26a548cfaeaa66383715c2ca061916c42eebd3be8c1e2c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b203e39761f786daadb62390285141aaee17c07146ef414f4ade465d7474ad44"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"39ab1cd5195ea23a6a2a024dec7baca32f1e85f39e9c8c572207ee34b610f432"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d43813dfee4a78ffe189751f3b75fe3a968e344b3dfcc73320986226783790a9"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"43fb773758f99cffe5e4d7e0e2faf0f0c1963f36fda70ddd0172b8b262e60598"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"49cde3b3521d740297515debd47bc7e966f3490d4bc7ad50d831ea12e6e8a26e"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"932344ad6b71a5fe43389d61be1e306bc7212a4f435429125c09a2a0853598c1"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a1e0722e049b23f11ec795abb6a55668c68fb84dc1e74c7b4c82bd7307ba32a5"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ed2666146cb489e0ba7239ad7fe10cba391ffe11effa15d3df1c6569139b58a5"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ee62a03d6561adb87a41ea4ce5e43fa7b336f518e4fb18ec4a2f96b4dd092838"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d27a6f9d3a792c7a3158553a802f24cccac3452c35efd3bf715900584b93e855"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9983971319af378de735cece394b2a348a0d48ad980070845acc83e412c0efb4"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"bef8c0128ceffb953aa1a1eec7308e2b358ae89c183304247dc4bf978849143c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f8bf00d1d60fc20e605c551ca0c5403a45c8a82be03cfc18c2816ec742dae460"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"892e7d706ee39a0eaef4cc41da5c41c241764ef32855b44c26de07cbc6af8600"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b9c5f618009a4cf14762200305ae7b6063685f12626918ed995ed3a8960d743b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"96380a134c9133570e989232a306780825f30338c7de70b771dd70d65466548a"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2e14a62550ea7b2febc97e3c14d11f530a4442e24d1c4e4bfdb3d5f92ec09eb8"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"51d1e0acb74679da7efd06e7de94850dfca69860933868799eaf1581c926218c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"280f31282931f3aa95aadc61b0dae93547d622b210b39c3a934cbb925678becd"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"803225274865a22884cc7b849093ddcd5567d6177e1a1cd47944c46c968cbfeb"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"69e73a728e85f8035fd5956ad8ea30031f7cd5edbaf1a707a678502f5cf3b773"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"70b22957d78163c9a81760b60b4b68b1b2192e009df4a4b101ac7230da2ee536"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"964f70da2b8ad60e344e79ca066e788d894376a73f1e6bc8236a8fbf27448100"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4abd862374124f9f4123676378f38cccf9c7158ac0813ba502a0b5f894d92a71"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b3e131ecefcaa6d56db0f64ac20efaa0e885f9230787b4a643214d59e6dc25f8"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"677dc7e2b129af592886eceb0b7241ea7ab34019524d865f925c21e325a67cb1"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9f198857c14b20ac2b2b78ff079aacfde6588b477d3cccd5d7f1c9b933ed7eef"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5de4fee270d79bde689b9efa0962a8794f971dbec3734fe1315370db367e0bcd"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b36515dc1b4e4e17e9994687a152bde6d10aeadaaa04dc53d41e0c59f4b5dced"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e388fc31c34ad2c6ae2a98bdf0929c238d4b0a9189a056f81355ea9af2736047"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d373288ad05d463ebef59bcddf3a4f1bce47cda2617446efbeedb1eabe4ac9ba"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0176cb2023e65d9634470e3ce2311c1b390bf4f98916c928e28922903cbf6a23"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ac70b796b1ae58a23d1323aa6d5bb0f22224c4362c1dc038005610f2918d4b1e"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d799b4b099626ecde74bf7a94fc3e1726d0af8451a153323e3ede5ae21521a30"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d75be692c4d87d490527de58efb120acfde7f4dead28feb3552bd249efdbf7b1"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d64c8f8e48a98d0e0d73f395c985b9ae88b3803cbf6ecd35a9f1822f91c00c6e"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2def1aa27835c0d0b9de573432c91da72bd7f0f046c8e73e2ed4eb7e4a08daab"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"411facc37e81e0382dffc11cfb450f0b24d2855b09a5d2b062cd2db7549df9a0"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"372349d7b4602d7481bd68259746e32b7eaa301016691603b8c3246af8eefcd2"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f7840a5594b852151565e43eb28f32bc89545cd18995746541eb6c7fc83a0056"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1d2811dfb9e14a003f40852d6782b0e8ae6ea569d739a4e8bf2120d3ce512103"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f7d7df6c94766487f6d23b7b5e76a49e8f3f8a3ec8c5498f98eb6ffff6034cb9"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"004d4b15457031cdc7e011711092d7e53c997487c797b5dbc941ece37b3fa87c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ba7b64e3988a430fc081e69fbd74e1e3151d169a7a622f0fe8c8c3b0cf0dba32"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"aec34cdc91ab7f39263eecba8140c215d417bd9a6ac2ab149fc3f25c36e74400"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"262ff73c96a9e1f1cfe6d846147ab79cf20f011cd046da4dac25f880fffa57d6"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7128acfdd23e0fd1c35cbe740bd2c753569544b6b363bec9418b0259fc3a8161"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c945b6a784235b26ffc564711618c387edf1edcdcc9946d55b8b2e4f26129906"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3baf25cb8dcc8aaaea9b4fb43ada29903a3fa4a5dcc9761af9e02155119d4735"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1b9a3b230e53f02bf0098ec0355876b881c601941fd98e4401141b628299b455"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"425f7118884f690457bf86acab5cee94fc78a93cf078b2ab6d6a9924837354a1"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3c1b90cdb66b37c98a255dc054ac09d446918b8b429fe38e5897207d00e1c388"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"81d47fea039a7d9e08db6705667f559542c19069e33b80644d63d264bb30fba3"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"31b5e5cf784f8d4fcecf8f4e41116f68fd0887bb9e7d54a1733bd6605fafd857"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8d71f4c64efb4e5a022c96f74d570e203306c9d155ae563eca3b79950d4eb3c9"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0c7e9aee5b783cee7133ccd06f0b57def8bca0fde426a6409e452be06672b309"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"93c524094e37bf7c6b5393d6c1372a5bc126a8a66628464bafe758da2b33a487"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"755fdee89cfadc63dffc66cc92b44ef660e7f450c9b1a1c660ff4207aec7f059"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d33828e218da8e3269539cd700d9605f81d6244efaa8098155e1b331a48d23e0"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d614041c589e9e795f764ce0110a2250ebf9d66089a631f3ab6c2a1620ffcb03"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b207097ff009d64270e8630ea610f49e6189ca131cbd2e33f1b1cf6e91ae6219"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"aa13b25b543ddd289a85890154c321bc059a5008f027b5efd814d270a9790a02"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f1f14763bac7a3f7b8d3f81573322da3c71e6af9e02e008eb06744fb98517019"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6c3149a52154a6ea53f10ef43881dc1e066e4da5cd7cce7ad3da61da664b9c52"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a71dc58155cd8da105f1513f941512c15e8240fa06e9a1940562e00544680fff"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c897e79c68915baf557a126958875292f908eb316ce13f7a6e23c189252cccad"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"467e16147c3413ec757b09cf9fea2613a2e814d7bb64cb4a9ea0aca8ee0fc493"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e22a55eea8716d341070f13eb8a5efc16cf635730061b49a650d233e1bc51cda"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"153b8c065e2f50ecb30056e7cb58a0ae5835b1d9b346bf7ccae838f54acfdcad"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3dcdcb8664c3010fec3ba146256a1858c539e282addf5298121ad2f4b376d048"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"25c70765d0f262e48fdc0f09d110de78b36952b148b1ab523751a9989675093b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2b92df4651c470956c409ac227a258c6a5a8f420dd65e95e736c96bb61f69c2a"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"403dc5d2ba5fb11099e1249c34b1baaac692af016e0dc56827208c9666419fb5"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2e92f88814ec70e52fcdb4d40ab83c0e8fdd6aac4c628f3dc808090ad3233ef4"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8a9d02bfd279e95b0f510987147fe84b82539a1f5966a42c0563f18f7bc8c0f8"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d1051bcfb97d7e8eeae83582dc5be02149b47a2eda9f826267f3f10c967ecf4d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"15d74acad6d0f20a098887aa08f7a7e78c3314317362027092a35869347d04b9"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"28ed777584f8277ec6146b3db5267f8f1e4ace20130ba7e97854a5d515fd75b3"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f2ee279478a6cbe776df7d9c168205fbe9e9d4c3c5a055befea6814d29543c93"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"951490aacf0a25a8a9bc17c8cfcc06468dc5786f483f2af68be41733ff1ee299"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"16bd375889acd9f757159ee33385d2317ccb6050a349a26b07b5861ae62fca59"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"cf2e1cb8c38320a63af40d5c548b9bd2da3a2921b5f363cd93096b72b1c3de0b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9dd94381c5c1771d1d9091668a7c36a29244bf8628bbff8059957f1ebd45a004"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c2acdb5f34e0c90d20a039c7041f3cea9b27e13aace9546f67795406c87458e7"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ef386ed56d996d90aaa3416944492c4745c87c5e6d42adc862533eaf40a49e98"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2c6f16f2279c61cc82fc67ccc7dd4bf8b0614586382379463a5a12ab79f08bce"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5b7bae5eec1349e819d3f0d6b17211060e4acbb6dda00ff76dc1ff0a71d73d2a"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"431b715a04ace15c4f8077a57d0d05a5b677cde11bd12935ece5184b5997ffc0"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d4d8370d25f89ebc6eba05a23a249d75c5110c1fdc0b4a8eb1b1397f98de5de5"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ca10839e69902da10e9ea36a34210c9ad4ab741ebda4ad7ba9b1140b32aa62c2"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"eafa4719ffb315e7ecf2b9a443d4bb50d47c8a701ee7d2244236cba3b06bf380"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b24199a76cfcce31169c80f99128caa8d2ab42f1e391b090c74a950b7eb5de7d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4633e1b70df419ad46c9e8d98a3b51a5d3b5a54b278a3aa6cb61cda9fdaa89ce"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"84c22c3906e21d5959116d458a07c36ed9b05a3daabfcbe392a54fd82a8e6700"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9c4d1abcfb731dca1c42cd1696489985339b91d3dd6c0110994203ec4c15c98f"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"34f25174fa9f76423ae3e984c1ee48d4f06d88eeb923a6e1455d0613f25254fe"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c03ea56cf8665ace8699c0f2f4a47ac7949a49ba7b8bfb521e7f3703d41dc776"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ff887095f7c04c6b2039a4d88895a4b6d5fa050831082fce08220e83ff639a2d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a14ea95ef389da0b8a530153b4c0b6f40feef82df8fe8222656daf6340b86a40"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1276eb53a7d1737d69c85c3a59a8ddbde07f0e545684a2bb392fd20ebb5daf1d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3959d5e7b5d4f147809bbb1052e8d5269963acbd8cbe54c8d82c7cf0eb9ded73"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f539946c29b3f176e106e4156759c1831fb16c434c7cb59a5ed5642acd8a8b85"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5506d18da3ca71bb9655336fa6cfdbbc50c93feccdb57e81eb52f70242d8a6f9"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3673742a91b52940d13bc74203c184dc1be08bfda126ded04fa17f4b19bf7ae1"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e8eb49f775f52686fbe24fcf6b16ad843e30af716367932f3849f71cb309cc98"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7fa1e7fa3de0b46b2af390f3678e5d7b3cb0b678f7cfd62432c149402995dbf5"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4adab5bbb7b79f9e950ffd80cb4fdd0f62be899a6e4325a8ab19c94ac687ea57"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ad005f5b9a4a8665e2cd672aef836adfaffb98a41af8ddd63fffcf7a7974447c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d87c465a83d5d892f8cca17e3df4ff7e27746308807d5d198f6396e6343a6bba"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"cdbbb3e2897a495866280593a2a2c275fd2bd2855a2bc710d0cc6f2d657f175c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f8ccabbd57f8614afa47e3171838c90fc9de34048b01407f3a533634e09e4486"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"932cb926a561c89045b7175b772bf3fcb045bafcdaa7e010f674b4bf53768969"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5abcab3a362cf30cd1f977dc73e3a5499d975239982c09a000c5da3aa711d192"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a4b271ef1a352eb8f230e05f9e77b8e0404d808d40ed23bf91b95f8ba880d927"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"be6177ba89906a815292025a3eae95f3d8130eca983136a66ddb9db477bdcec1"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f36a118296fafb2b515f2ec8d0f85b689d615d03883f10a7542dca6f6437486b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5b0dd3ecee5a9b2b4a2afe9b2762e7d91fa6c6c3bc0608aec3437163c0748f4b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e512f1c8db69ed80c487abbb856d19960dfd39b674e63cc046f34564ac2706f1"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"09dc5e0aee7ba1e56b3f368637fe197607e3858fa383e391e3788a98f31c87e0"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0cf8bbf69128772dff8646609b0212e1d13f1e0d64525cecea66dde947331e20"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e943ddabb6c0a51a53b170af4b43a8cbfc3167ec1c599e34315a4616e4ca3ac1"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7357a28f012a23cac182a549d6312f5b5b1b30f7951923dac708ebb454eb2eed"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a8f01bd7098ac52bfa9641e91783e7ffaf24432376eb809207455950fe8b3113"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"deff22cfdf435471f904dd5c7485378cd3159e141238c9092c17e5a03cda5895"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3c76e03e0410cdfce6fc3c573470aad806c23578bbe703360707abee757ecadb"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"12d64de1075abc101ad8fcc2a23f47c69afcd1dd9215d38ff7eb88d42dad8b9a"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ca2f424918f6a0efe80c1eaf5d7a12d2e44ea24baa435af434ddc93ec91b3448"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7d09a2a4765e18233a23c5677845e46cbf7855b419d5e8aad5cbffbdaf588af4"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"031b46b2337ed27a2d4378f3cb30b5b3c4edb9a34c28895e41373d1d7728a566"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c897b122ca49c75157c95e436a73d10f4d6e1af030d8de95c59b9929ade064ef"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b573d2a68fd4b30084459651768cc76ebb7f973089f737a89b05af8c63ced163"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"03587b40dd28b3da95b883adf475629309f06fe8b64dbbfca9259fc14a9cd50b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"15ca366c2e9882568200fd1d39c1205df72f175c30427bd0bda3c4515eb80b1e"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"93c1601f7ac7d707d67ac124fbd0604a95244782b81508b43c4196c9ac34e8f5"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b4ae39340b9c936d34a70cc93daea6333f08cf7ee62dd3e4686a3f2e80c1abb8"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b821e90f5b986cd8d3431010e3dae395ebb78e90d916fe628d56d19c238334f4"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d23fc982bc86f266627f7830e4b909914829218bd0cd0adfee015332671c85b7"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b2607e1f39b45a1bf5d9e981c6b923622651a90dc2e421dd9292a2b62858ed75"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a09bd1d42b24d73fec2dd90467340ae155859f4088cce8ba4912ec72480522e9"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"417740f51d7c06f53d2572869ec7d10100fdd42b2772f126781680ff0ab13549"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"70bc8a9c2f5ad8346d5b9acc1cb9bc657ed9a99431d7f7bdb64094aa8c367be0"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"139d65544ca032f83dfc7b2d41bd4c84bd7c399cef6d63d27398a8bf81b3cf2e"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"aa950cefc7227ab3ffca43fc8297db109c1d6d16af39787a5652269065ec3804"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"89a0fd26d3000301c79b8d3e80a753fd4df68501b6ee6d8c952db91e813a4f7b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d5ede3c22e281eda144285dfd1b8446607c90cdddab4782b577c6d7d4d8d08c4"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"18e5baea00b64701083fd30e998393b4c47623084489d1f148f8a3ce0239d003"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d045d0b46d389415c3ee61f81239237798bbd2465a14b18496ee871da63c89fe"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e995bbe85687602406b8b2ca7f4022d0771c40f5e5b1cf0ec4e24bf857545a37"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ec64ecee2ab7f7871c9058e9e13a92fea4e3bdc8a7113ec9d60afcd0f6ecc234"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5971aae2ecfca6da01b8f6c72f9f42aea26e64cca323333c041b4ddc7a8c328d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6b58e318176e29d7f8b837f8070e9bce3cfe51f9c521113116915607b293a0bf"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1f20d445876f1ad6f39148bd66636e4d1d6aeb2d277aca1226f535f5b27659a0"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6bca92dc1b1d294029400f6dbebb13eecaf3bf9a47df1db4710604708560a6a6"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"529b4e1bfdd2d833faab5b75641a0f4cda47e5e0493d754e2db71195f5491113"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b01b14076c6252f2e64985b1806e925928db0fb29cd4ffaa44d78e480ade057c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e70a3c01995bec184b7c2f9049ec13c766b7fe55f77057827071d401dcd1b027"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"cb6d621ed91cf288cb1d2bbabb9ddfd365282f4a6cda94642ab64cc0c3aa25be"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"22749e92dbd44ef04be1da2d2a1cf0068f86ceb8a8278730a7ca04f774f5b1ea"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c44db33a6281f9fd3dff878cd6588b8fdbaa810bb7cc84264102638454327cf3"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d92af56080bc1982b9ffb4d37d4268e1b8d982894358913c3bbad203d427ff69"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8cd20b4c87b7f4fc95959e5f81110b21b5c25c9574bc01ec8f8637272efacb4c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"cf4b7ee5613b12d56409ccc60c7a598f1bb537ad5581e6d22888e0c95f5da1ba"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0c31f5ced6d7a6abbfd56cf43224c9738ac3b7b7452a82a4939ec981869754d7"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"bc56122c98544d3356a2611150d60083bace9d97d8a3a1d503d96bdfe7d87095"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f2d5f8744756550a55f67b6f0502679d82175b958277fd052101e230cde99c6f"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ba0376b2a0ec81b31f81fbc07e057523d24765209803f64614952075eb3b4c5c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"02ed9b19c24f830aaa6f22be57c4001a3a768fea4cabb70c24917c1c69d1722c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e0fe48badf4c7a0feaf424e4368a0a6bd6b1b35336f9b6c82eb43626a4f69d70"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c5e87343b7e4cd6a14812a828d21a26eab7b8b7f26ffee1ad1fb87a77829ebb0"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"269186e2c06bf5dfdbae8693ef78ea720c46c4b53d2d4f84e98634cef96153bb"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"48e394126757bf4e06709c440ed6d3ceb6adfabf8ae08cb2e941c085a041ce1a"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b4730ff8b3b9de8d8b441fd03b1cea83616734d8a414e9151974ecacfc210ade"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8a1516d72b7cd0dde6540679ee54ddebdc08f89682fabe9717f0e9ba10d536f9"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3a1308932ef29dddf97e1499705968894f03dcf59ac47d8d65be6afd7d435d55"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ed80ed1974f095a5dfd8c38ec1d99ae87a69d433acf8ab14ada4f075751ada02"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5e1a5ba1ec24a7279dc14e2642d2fe782048b5202ed2a8952d9b243d2505ca79"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f42e11c58c5e86fc95e566c7ce5cd9fab1c39095ab697380c796a6fe108b60d1"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d7d28283e9dbd956d0d0173b4c89d1ebfb1714667d5c472919822e5059ff9cfa"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"53f44a65065b387391f2bb48779aacdf1a3102f7682eb771e3b5a4874296ff72"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"00e9ee14793d4eb9c93c2c4e6bad40f7b480fa03788669d8f7f8956aeabbbe4d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b359d2801e8f30c9fcf6c325388814692a67a3cd91d446e5d1bbb679f983ce39"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"aa632145c3e8450971f9191af4367a00e2ccc4e0c64b47dedb090a903336f111"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c8c08181030c4c3fac9579e92d9bbadb70f80bd8dc0b8fd46e8c5858e6400a99"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b7eaa93431fe60277f786b42e46d05891c95ffc97c41ae05845988f5103b53e0"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"42d5488441c586a643336dd4b73a1519d1258c5b0836844337325b214d435746"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"adb82e3872798456c7c3203e3019e969dab13bfcf34bc43ac53ae1f7a74dbd0b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5dbc3a7ace5bf093343d2e88799bb2a0b947b38a3d7c1e0db2114a4a027a2f54"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ef6f5ef5c6f84e00bbdecd1330485d576f458a00076979dbce17018835663fc9"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a35c61ccffdd2b30a63fade31a2a72329691e4d796f19fbaf0073bbd7de5a89a"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"466c931bf7ea2f2bdebf0a343815152067f73f85ef64e8e3e20c94138660b3e0"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"17f140d64f644e7524f99ff37bd92d7842038ee3a406fd814d113c7cae6b33a4"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6e414a85b433f5e9f2e17dbf80d036d5da40589909ada6f1485143b3d7f166d5"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"12408e0d39712ba71549f6f1a44e827b15e1a19f4595c3b2f2d2b28b0579f4ed"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3d1519f237c46d1afaff751ae12ca92a50edd4fc4163cb61f75f83bc7ec42582"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5364f237ad26a0ecd2f71a120e2b27bc6014782f8dc041cce588f1f55c291191"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9ff48f792f03cf6053afad9659e92690237f7d0e358081f6b806a757c721673e"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"67ce32eb5b7af917b0ed7b50cc01fe043e15dcd9d988426e309063a2ec728653"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3dbf3a73d98e60b3ca588bee742e7cc9df8505c10a62b660fd29a0030abeb08a"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"620fb1ddedca082f860108d18926144d211f430bf4ebacc11520c467c95307ca"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6233ca0f9aefc4930c4442d55156018bfb0a7f92b596e658eb97630b8fea393d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"56447f3f7e50b6a42b091980da19ec5451d1ec8a82dd58cc7ae799cf7edc47af"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2ef4b1ad4429f1dc1cf238c848bb935c6d199ded7f48f74f9e8d39da0706b659"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"255e4bedb4f90f327fbac78a272576287633d35ab87b51da1e9e8a18239e8812"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2f1b6159d9599544b5be5416d228ca4dd866e45cd7edb56a6f2f0c993e8daaf4"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ba2615838390c34bfbcaf088d4b3d4d1855cc2d379e20141a7f42a14a27d37c1"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"538ee1fe4ff9ac97f8d59d0152ebc77d308c8d8298648cecfd77fbf3d8263076"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9538a1b1f0f45b560d6d6ad5dda28624243dc6acd9ad249b6ba159729a3b4f6c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ffe248b4f2c8f47c713d06eb1df3d7b3bfd82058df9f8bd14cefdaa75429e5d6"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"702c366b36f3cea3da028a416ea6ffd1dda75a4c8379daf9dfb11d6024bc648c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b8a2c444992d392e09b9d60b74b526ac49971d52d53b5708353b9c09019e457d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"06cbfec3fea1c5d27666169f9a43126d5188cf0a54487a45b538ca0c37962e80"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e0544236d1bd78e9cf2d83e833e78a963b8d887a0cc27104a30978afdfd201ac"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ca9d0d49ac24c6b41ac9451905a67ef0a7fdadc2f3966fb9bd446e0a063d4824"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"789e70838c78ef67c874964cf137792ab212aa91a85d196e91850b0bf6d09fe4"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"bb9d53eafd503caa90271c1654a66cf0836778e58dd55c4e619e3c7131f64035"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"97cff8643b4694a961b3280cba71208da790dcd16a23c549b04ebcfb078e8635"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4fa3cdf9108bcddf7d55ee5d953803cd41be247314f64b70f0a5576cc7287ee4"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3be59525c74965246bd3950f9232c6810ee2162b088f029f68084f873eaf7274"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c8ecd1055a9878d96b42df2522200968a4b6e3444167e6c61a17f4cffc35bddb"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"340443effbf3b20ff5e35c193f62ab28d8e9a1792ec14b57114debaa515e92cb"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a8104b85744913181fdc43c97d71679f0768118ff58617dc0c9a08b53914e6e9"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ec856e1678d1622d5987a1c21a41bcae9bc0c07d988095f2887ceeb17ce5c93d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"cf12abb9bf37c0d94c61ad97edc3f44b7c149ac3f3803e13d753ccee9311c671"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a22d4b6444bce291e4830ecba97482087c46bef493128253a0490cfa7e1091e6"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d03406be08c8d419f7f394fbf095140f9389838ef4b56b951c92dad196e97af9"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"990b56bae055445c198fb1596f989e4a67b5fae7d43e821b416f6d4abb734ea4"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"42697c5c9a38264f10714d32b08a5d6586c52e0bbaee74056cc59a2b1a56b0d1"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"561296af5eda7770c58a2c828906645c97d0f60784efcb223dd0f59e8a97d232"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c10d628f7245dc741534ae3d2ae952be69db4e001b4c98711c713f746c1ad0c9"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"15e12d70472623d4dc4459bca4e71d297a99f584e5e69b5fd857c3df87299ad8"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2758179b1d234cf62faf107612e62d970207b7d3b619a58a7ad1e285b8b97926"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5c5cabfebe934c17e09ac0fc0cf4d8bafa3a43da082c98e7693156b6a1933458"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3a36e36a18473aaa11f41809509e939b2c18de658d607f133941c2b2bc7319b6"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4bcf0e50278b59186f5fe5f1ff6a82bf2ed42a53840d60605c380de8b6774df7"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"19df075985a1af5bcdf5476b3be4ce6d8b2a491f276b14885999a3287bba0048"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"34654217d7010e23b86f9af727fd71303ca2ebc3ee8c8b772477abff98483782"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1da9df0245230c0091d6f69cb6bd18b06b5963e2676e2ebec16fd212ee88ccf8"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"85e21e29dff1d483adf6eb91f48bfd54f606f2faeabd0a8bcd825fb4e0b45d97"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6410744a8a70496915ac93409e147aa1d652888fa702396ef8d39360902cd6dc"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"39cdc4d763b57900bf50942a6bddf89261c5813fd2831730732028e7d2307d81"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e872e0c07153ab67c0afc0293f77188da11f9dc6eba078f70f8adb1790f89a42"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ac702e0a01df0051b0003e7e8c40e7caf298ce5e8bf1c7ff590758befdd1552e"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4dc2fbf27e6b50dc8cc855b466f09efbf9360b31f368df5b095be0637b4e253d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"29d9135399461ae0608520da9b969bac16d66cb89b8f324f9760b6db350bfaff"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7205aeffcbb86d9bc8d490d2e9ce31f0972dc7d17cc4a6324b1348ee09c5515b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"db087ef8eb2e0315c72fca963ba16d298be29eb6bbbbd2feec964344f5fb0064"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"90a0ef6b5444e938ac30e7b723fc78527155c42f5e326d51ab2db9a3c96a9afd"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1293c2c113be33dcceac6719a4ff6e20c5eb614046e5bdf2fc1e6e89093c05ef"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"426fa01789aa639510d08709199dafad03ae0f1fe1c765c235d4d476cc54e9f7"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e02e1a66437d316118d10ecc0bde5c66b47671ff383d3a1c3892d2ea1545bcae"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3fe6e1a68946f10bd407c7265977d1671a12201ae82c99be79b903a77e1d3e3d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"047bee048d7ce4a2423a0388dcb26b80d88f03c7f412b576284b78ece296102f"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a4c99cc40ebefebd54e50711f2fd28a45260a892964a10d08f8a875b0f736710"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1a8a4473d515cc8190320fa4eb46a5ae23e1ba0bde43bf1465d1ae9cf245bdcd"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"35c083b0323b229e8b4fd9d3d84237c0f486b56070ef18bd5d14db55d46499ea"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"724a0bfa4267d223584e812fd4baedf02426e1fca1cfcb95daa41bbc94ab8c6c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f69503f49a16184812678496356dbff1516fdd7a0279fed5ca67be75f8bd109e"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"43d0532abedfd8dd746e497a069d5ca9985947b643b83169cd1ae1c2a6024623"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"aa91f39cbcd8010ddda6caacc64b0dbcdd1db906e9ccb787d646c51de03306d4"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7f6a2276c554ac302275aef95b5b09ee3b70938672fffb215b1dec0f7cf1d937"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"db5c1bf458fe1ecde852e56443eb833be08330a0fbdd380699460262c2a037c7"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f4e05670a5b427ce9f728d93963d4516627b8ec4fa41001e3f431709866042b9"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6d6a920907e8c0d079e33c645fcaf763f84e294b6d15acc999f05fb3ea6922ae"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1ef33d78cb1748916eaa94feca6e8d94eba872bfa70cef554d642b9abfed8137"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d596aa1fb54bb771f751447a9b46c411962681b02925ba2147ee8c6ee6731a3e"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e0ee4b554a94b7e282e4017707745a72e31e69386616bc26d99340e09f5be9d5"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f8d12511a077e54f5507e2208062aefce61ec64cd9e9706da31ab4ae45363348"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8a1917bff99bb3b4fbe18d30bcf3e92d1c8a5189e42a84edac5a876a9ff4b888"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"59b376dc7e8df7f6fd619c3553a4879c2b8399abfd463ae28031f7097b48dea2"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2bddb3bd957a8d88a123c0390499632e7037c5fa9ba1af1ceed072b2d7b9f500"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6997662bec40aa5968662c5f08d6e23442c7c8cb8440b474d7f6d6f264636462"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"10b41b883e756f5c0a792b7e1db69811b6ed334d792283534b878980e645bc41"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"693fe22aa72ffbe6d174067f038407bc69ffbeb1f7ec88d8cc86d41d4397690e"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f6238d2555764a2f6b127c426ae49b81216818c4425d920f23608e146a73ca63"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6144331122c012a85c9849512eb62d4241c79daa272b2a70108adc34c97c71a1"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b12db8b1cbcaf09588a3fd7c476260740a710f84bae71f90c437fc3877edcd4b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6eb6d9418ec9dbf16defe583204ca3537d83c5953ee7193a9e04ac5b247917de"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"547b4ca23d0c73ff26451f698d5beef9a95d63403f05a8f2698bd2f718993fcd"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b2730716b59d9219b0926504ca1cd3875b663ab2e9a034959186f821d8d95d21"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"afbb36c59280126e8b5eb630679e81ecf95d462fc3b112db2807045bf2506c7f"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"61c25a37091259d94d0570025310d64f8455fb67488144255b9fa506734b4251"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"604a9aff6af8bd0939d15cb7ae3354b1fcd63ef97268205d8ac5614973269e56"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5fbaac0486c6eded5b8d5603fa8bc72a1d499361b2df25780e516cd9a41bca72"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f2ddc8716df07c9137ea0c66c38fb588095a316e10995301bbe3608016b5d8d2"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"af957869dda9f263ea5c13503deda210b3ed5fc81c9a49960b4ae5a278f4682d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"efb14245631286ca3d47f28801599201cf65d7a17d9ce39ddf02aa47d469a8fd"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"dda6f52fe0d9946eb3a2315b2cb487d2045c4dd3b913dc231318809ce2d7a573"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f55fec1f27a38c751c2601fd3d5213796a17f92f6e47898c051b123dd7bec2fe"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1d4f548c6a989a4fa8f912ce55c52a0d416a0a9d81078a752feb7883454bb7ae"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"13c691af01bd59343b65a7cca0a219cec5388033a90a6a196213340b7ea33949"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"517e86095f9125e39daf03f2a906398c69ed2c43b385131f79f4e244bf221dd5"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2356373037715ba6a5ba1c5dc3965ae0c6d91d700bf7b4f3220031c07f2421b4"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"796cf2dd78a9ac5c2a4369d3484df6aa5a834442b8a0b33aeda63efbec31cd08"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b086440d40757a0755c5c9270f3585cee9e47b0ea4358ab4827ea5c1dfcdc46c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"31b0a101d39469f75272dff83e7521f4de1597aad2cf1e7459a80467db3cbb42"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9b46432a4c0bf66632024f69a77793476480c93178778281e97ae23e5bf93bcf"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"fac29cbea436b3482acb2478318ea21cf362a1309ec28c529142ba0ed3236eea"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"dda78d1da797824f921e7be214eed324fcf66245cc76453db3f9c97279d07f40"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ce1df292e0515900666ce3beb2367e15cf0fe2d6ba81b8be50433daad3f90024"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6824d0969b0480dab92b2773df76a3a9c0cbef1c174cce17d42dcb17d6232982"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c0b7969409dc24275d34945cb3b90991974200a50b095ca6f1c7f46e328fbc64"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"cb11808a44754b5e6df22b3aa64c1096e898f403a20fcd9626d0d5123eb7ecae"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"687e9b057437b50020295c0458b6184cdfe4a352d267552553a4bae8e349529c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"323fc7223558416964e2be2839bf45afbad9c856e486ce800a95af83525455a7"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4e577fbdfe6c789451c06dc40fd70f2e815105009c1f8dc6de34949eb565dd4e"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"85c03a23559a2caa8cadf49112a5d77ea7776ea5e41137ef7b80b93efcefbc0b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9132e17ac98cd34ef98877bf9df72252995c3922712b64e5e8a5a4f315083eb2"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d91bded3fddfdb7d88271f72fc2ffc047a294ea679adfa7804c2023b672a4fa0"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5c4f924d4cdf8c6e3fe30b6db24699a76dfef5dfb0a26a450bd6dcfd04b3d258"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f44bad3fc529cc5775a3fa0cbacadffaab88e574831970e1da9615a0d80b4dd3"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"45d9b4976303965d99ffd0b4d83bc8fa14336a086ac87c96e9215840769fb2cf"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9db4c1b6098fdfbeb55012a98e171726f0255126e6a99f53daee96552a729990"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"73e37da3a8bed7381590ef49eb2e37e8ea606b2798364838bcaf0e1dd52df258"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ba6178626426e8fb1e9d0a2d86223225caa9a1d520324e3bdf415d0404059834"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9080f300749dbeedff944bc4598f37b737e1810ef320aa3d6b982ad5056d3a9a"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0989196cf55b2db380ca2f6550b988814e3f33c7a63ab31463e9eb9c94fc1293"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a29a3c6c3ccd85da33f97a8f302bed332a5681f636c987409af735e57458a52a"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e963710b805416c797855eb57997593d47ca9a27e55ba0a12028a64daf96d162"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6ecec4412f1b52b9058f46de6ba7b013a7364f24fee131a130106ac5fd17944f"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4ebea30d12452b7da7bd0ae7e5a60a69bd7e68f497d26daec41fbcb31d6ae711"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d32233f52762da1c041ef7f36fb37ac8329cffc83999ea4e57c877e7f6ab245f"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2ed558d26f5125a8f5cff604e020d33a7d995d39a34b17ce6fd6fb36b2ed34cf"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"22b358c9e6e9b9e070fb519098f4f13f1149312a37e3795d3ccc0228e05b2057"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"77930d30b15342331fd50392a86ce8a4139128f280b23157099e3d693d24efff"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"460766776e1b64ec47132d186349d8d9d03a2ed49357f877654089517623bfa6"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8d7c6bca93e689057cddc9f4ad1234fe512900c458d5df5c10cb744fde95c022"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a4cdb5e8addc0e5de73d0291d97a994560a80241ddd710b490bfa24763efc615"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e78e2e28f202ded769e3a81bf2c1218ea9207521a121ab225b08e5ae10d213bf"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e70d960bef7d68c89d89468c0a4c945a56818e2a3687da1236aae2f0fc06a830"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ae932263b61e04e3f73cf9164becf6d5bfc5b641dd94ed4ceb09b84789ed9f4e"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"38dc209bc72c61fc9793f4b6be786f080faa5568dadcd042df421e1bec78a8e3"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d9d96fdd174180b77114aa6758439a9c4960cf9cc1bde1e916f7e8565c626bd9"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2d1872318a45e29d26e5a388d6f3a540d4322172386aac795bbb6315f1fc04d4"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"42ffe8eec826ea892141ac575ce46acc1bee16750dbf0301a899b92552ee734c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"eff6606efd4d2670432114d8355b8f90d53c2e86a07a0a112d5c95e501bcfdf0"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"926df9af99fac0968194d20184955cd3edf150779640d8606c5a9c3aa0892894"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"71b9b1f0ece880aadb73e8fa77d5df0d04acb16fe6e8b7fc6e478edf088cb817"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e77b5771d95d2ebfdb91e9858584e5b287bd1f0d542511ec6b6177989b3782af"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8d6e99c07bd6de9453df620990a130b217d14d0db8783f37dd71432d75279a62"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e040528f928722c57c9f19e70597df0c9e85326c62f0d49f18081aaa33e929e7"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2be2dbb04ba6b691a4991e8dc65e07dc8be5503b7c8e4f923df2acc13a145f49"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"df79bfbc07d24e307be59a7fdafd38c83f6d8aa6bfa834051ba68ff7f99b9036"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b27b452105311871034217615883e9f166cc072ad50498df6083e271de780d5c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d8c9327d7e5e22d1d12b42671bf423df74175009b0f8734e5aa482ef3388c6b0"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"815ddb917253bd7aae5bd2cf2932bcd95cfb008672ad8233bc6089225772cc63"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"33bbafef9420905e1a09589d31828b4962e4a9b344d97ce3f1d931f293af2687"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"04c9ee295f0143db270a56dd8fc57a8ecde250964dacaa985d4247f243b4d148"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"74a2ba83f0570fd34bcf58e38b55efe15038f90eae1a8cb4505dd63cae749f5b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"55c241a7934486fda2f3072c9c78d5a5b5a62c30572525f100fe77944b74ee39"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"28572f25edab642178f9145893c34bed885a1a80ff051a3818a5a7083b91f00a"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"37f8a444bce665d87162ba3b5d336e872d561e83dedbf91a6571cd46f9871030"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f21686f1def08f9597b9214727d658c57ba95a7d76b441ba8db0a8e2ebb01bf3"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"fc37c732823f32455c6a9786d4f31d65c9d50a43b55c0b34e4589e44e97b7caf"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ef082291ba8192f4602e97c528707b5f838b7432d7d177636e504376bf6fb0ec"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9c08a1c94793c975477c858c0f757a2e301407884cd708785a6375143b1a3153"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a471147840e61d49b23e67cf181d048ec782213f44084a14bb33190faffd79b7"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3a6d7e0c8403975a5ea56ca15ad31549395601e949db3f639e5fcef1a2d4322f"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"624b1a7c0e9074692a2ff236644fd1f86acadb01d2c9938bb60ab6589baae67c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"092c303d5d2c8596f8f8575d4e79bb78f8972b4d147678138981cad102111f44"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"87f61f36eeda35441bb0bd9d30eb197a4c4c9d70fbfa9757ef0716fc427bf5dd"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5917a10d68b8019b527867bd05a53040cdc5188a85a7f184108e554220daee1d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f07cefe331643137a869059f3c392e68eb9abbb43f535b708a315b06b66bac2a"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"dc34ba8f06afefb7a346081f290ad7b84f33b6dd911e3ffc21ddc1f3cf6f8b4d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"47bb9114749377d1fa55a690778d8b8332764239aee610a59c3d39106c3bd4b8"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8eb59f3c24b511d868d029fe1d7751300c7cfe7147b5fa876e12950b743e7bf3"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7a9e6c675f9c9ab4e79bcad67e45bc75b225a7873dc62fc9c9e5e24273a7733e"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d86c916ec2543f93b31aceb9428b0acb8219a67ac1630786446736e0279fa8b0"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0dbe2959d6824e153a5081cac41d3a292b500e9a870516684aa9bad6660bdd0b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b7e7f72db063f91b8ff131819d78d61e1c98db0ca1d6df1db7e3e7db23f229d4"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"dc635e94303ceffa4832006f2f6f51a50d25147b6192c84dc1c5a06a9fc7d8d8"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5a11391097d9d2618a724b83f3de1a342a947942271b202dc8bb512b7dc24a50"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"bcb2ea1572d15a55911fb31188fd3b16a2a496173b8f84186711c161f4bf3ce5"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0db0010d40c793e9738a05dc461f9c2370f2dff19bc4f4a4557027be70aaf2c9"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ada1644f0203bf50795b64d5484696d06f66412522b3feee1af30227b0396d48"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ad718e4c3ae89267f9dd559a75ad04a6144a0dd9b2d978678d97f84e0ec4d617"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3b493499ab2a0f0bb118bdec77efa2981ce81e09128c15b0e61082d2f1eeda2c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a288b805481adbee50464d9170d3119c9da5dc9c5800875039c159a0be8e1642"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3881a4bcdf5fbd85b098e0203ae7a5db79e51bbae4b26968bd367dbeb682bdda"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6c32c967f10f5130671b7678eb6606d2e68b19e7449745859cfd8437339da3f8"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"82d67e00e3f05931bfe945d3a1f2d9ad7e68ead1929c8cfb9c273d50f17422d7"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ee8fb5cba5d1ac0367d38f2151f7935f0587c35f11457277bc9a11a85bfe0d25"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"48b0736f788eb49c71c794c72fdb5ce7e47bc33c65bd2ebfa7e3e6fc43503618"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8a9bec0cd2998b87f2f4f71d5a89429da88b842dc8cc30dff5173eafb7c2c84d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5fda48bd8857f1a7e2035f4fee6f7a894167bd56b37e3bf45393b8a08ff62bd2"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"71711fbf061fc22bfb0780c7072c45c956b2d5e0c9212f2f1d70f52a84393bff"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a1f1436384116834f58a9b2e59e8049cc0961872ff7d5a8d369cc7f5388d8bf8"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"292efe44c3a7cd3e245b885ce38ef959c6413236fb7ffe61cbf6675f97bbb837"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9d08a6396f0643a549c26320ec4ab5672335dab6b56575d948a2d6b020d06db2"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"56a1681c1c085c05384e2d4d1253e4ef65c343f3d47294074c59b510b6ae62db"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a85942be7817019022ad8f0aec7a6a0322348f074086d9ebc43bcce2163431cb"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3359f46fed4953be876e7015fb5a020e1a832567cbf1c005466e5a8ffe048585"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ab82300c199215f95c6d2e533d92654194112637febcf0781d4afd0a40e1cb11"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"fb96701cb422a51dd526e60006456d6c1d90954b5f94d324d2ab0c2a5b8bd920"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4a5105c6db408509109035f28c340cee9cce1a55f5f7ac19cfbc0c9f4785613c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b4de4c3acfa69ea2f392a8c7a48bccebd1a1455f1337bdde184865e3ba418873"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a6fe9c724f1bf11c84af6e946b9e58674ce7bd8cb693bdad29bd9898e55548a4"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"19517c368c38151416ce3be198ef361fdb7fc00d41f1d7eb749dbf56c5c1d637"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3328e50750263d4ad24afff6ec667bd0cc458fb3dcda46dd92dca45b612c38a2"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ee00e440e15cd80a8518f5b108fcfc3b855c8d2641099dd2f08221e11ced9f45"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3fe769e25a95615bcd0553cdf58407e99525ece2cc6dbd04d4891e9f54c73685"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b98c4f1ad02f48ebd1caa37ee3bb525b01355c462c1788cdea7add45bde99770"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4210a057346748101846be441e98bc4ac2e874f36aa29fdc869db56faddf0a26"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7abab2d2cd4c389323028ac1ba5006c730f751d89e57a2f4d5777e528f3d7da8"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"cecc28c74b98ea014397214f536d00d7bcdb7a50e2c96d8f332cc9bcb2afab8f"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2c3d1f89132b5ecf8121814ff6a2807ec9dcd6bbc6bce6743b7735dbeb49d5f9"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4329c1927c51790ac9e41dd131b732bf8eddcdb2d584ff1b7c7ad58a11e7d09d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f4fff64927c31ec155b55d6e7282ac3c3d60baa28aee7bcdc42ae002071ca68e"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1251844ff504440b101b8e4318e26c052e65955483e0d57f4a4c7e20907b4898"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ef91f6a660f6321c5228a9f5850bf3d7475c1725ba6be842081f8a643859cec7"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"30dce062423b04ba5ddfdd382458cf4504ce666caf805e81bcec79b0ed37aa0c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"cf55fdb005bf7528b0ab15247130124d955fc01ba76b7b3e43f1a76c693c5049"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"345c3b1499effb392158e6fcb304683408f7bd8761dc4ef9880cf48a78932630"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5d87a3bddbd49bcb501ad4221f4cb7ad255deea70e560e4190a28ed5115bbfea"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"375602456df406a608a3bef6ef2a3ec3653038e8b3beffb84b00bdb4644dfe8d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a50b5a269a1796418b87d783cc679c1c7c4b7b638ca8ad6089957ae0949af3fd"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ba7a5841222468d948172d853149f120d27bd7f50f6b77af98405f0a22589ce1"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"002b75958fe5239adf03661b8f494905c29190fdfbf417e95e5dba30ea243cc9"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"36ce5b1b39357a97a44796f50a5b165cc83ebf5227d27cf24753475d1b061e7d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"55ea8f1ca74e60dfa0c951ae0776525ffc4fa34590e7e233d7611c4c4a22373d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b1ee3dd40381520a0eda1813700b68755f771443fe933fb503369ee1927aa03d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"282d6fe9f51846c9f0d34ee9b0342e3c4ba21399c7d0e2f52858f6d99d2ac4bf"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"65b1d4e08d0324c489e2b4ddea3a350d60188728cc877a046aa4861627fd4ca1"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e614686ae27201e7701734433799fc02e31878427feb386206f49f6d4fa4de87"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0d29b6feaa76fd67281a205eff33bfd4ed0a5e7d8fe59e633cb022303c0e752b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"76dba1349b6eca1637ec93ec3954144ebf512f5db78b7732a3206fa1ae025306"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"23d6f798b40e50509b0fd3f6b5bd4d90e943a421a714ec30939367dd59e43edf"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"027ca9b35722b78be52649886b6a1cb7fc3632368bd2daa151c324dbc6283632"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"35295d84ebbf5e4b0a5e5d2aa0cf74c5379dddaaf2259b872e66ea79ca413d15"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3fabe3af7eedd31ff422ddf5ebfeb38f2edaf64b4971a579b8a1f88ba5435601"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7dc835cfc0497dbc5735d99e33fabf00850e931ed360af9bec9e01a44b521fd4"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f7f0bc2308d063886b85c98af182e943a8e7f15db7e1f4eb2444d9fa489fb3be"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"fc7e7023fb0f5c4cb9c24513f192c0044029e07b3432f41ebd4a6dd83b5fc04e"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"65d396a2f9ed2ebe0b711b88a2a2618780cb61872ff3b3bbb94aa13272136f61"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"50381afbfd36754fb2d70bbd5e7568a31dfc177a115d5e980d6dcc8e4f6abc72"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8d4a803ed1428aba0018bdd247f1bf0edc58030b9aea57e971ade6068db09e3b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"49ec2ce4e88bbb9b7a10667423596b2a088ac187635c76c7df97cec8a5ff3b4f"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"77b782759d487e005c894d09d3f48bc98c465b03f782764dfe0bd330b2c772b5"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2b87857752690841f5354324a5bdf52291ed35f9546657f63eb7b7b42356e2a1"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"12d4cc8774462adb903c9e5074327ba3a7fbe5b9a5822111c79c965e39fcce9e"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"746aeacbca3e0aef6070cddbf4a6f7baf97074999fcafdbfaa40af4d928f03f6"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4579faace1542236bd3dfd11b78ee09d7d67c156240de8459f8decceb24e2d05"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"813f5b480c06966ff2d9a28d31496c2e691ebd1249e7f781e64e92e75f663c56"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3cc51bc4b0c86bd594814a5747f06f43f476cfaae068fa43be610ea093d97862"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6bfb6238f476e4e4d082b264614cbe06380d0fa9b35bf206c4f0ffcb05d486a6"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"99d4d1d72d05950cb3c905b4352398c199f956e2616d4c6b77e95ff7b03a34ac"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0557ae513c6b8b609ad303456fece8cc63c783bbf51e2c13a696d4f8bb75ff92"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7414b4f0f944e29f4107b17c0eac4bf57301511720fdd5a95305d7186e590cba"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"fff9514e10da787bd38fac08ee2faff78a33d24fd2bb445a098d95b34602386b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f80f8391665970d9978e1e2836430dd7e440e00010da1a78fee333e301a13d0a"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"43e13fcd25c7b68d75aee89ae5a26326c190c995d7ba26f3b1cf9cbb35add970"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9d4e9a582d83528d82e324f66d388b24cc5026b2e7ed99ce11f7e0b48e5c8266"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"dd6b85ad134dfa7a63ef8d26ab60a83591c54dcd5f50ff0401858b9018ed7db8"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6923bc7b9e8a079c326b1c98932d0aeae55bfd354036160ccc452d002b1976fb"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b73b823571672ac30983020a842c584c38708783e13566b3f190347c7165a7d2"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8752c96a640ef2dc5faded779b6a166a0e33c3302fdab0f7585d0cefd2db7468"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"67b593e0dcfb62e6a141d7d40a10fe1849f43a490b2b5e6f6e1768c12005226b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f260a56e7030c1400199ffe28ba0ddd7c029830ed3e7cae2f534080941b4ac43"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"095a1703d61f33f6e9bd50677e80ae2d335798fade1655e5088efa87fdfafcdc"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3827a353b84852e91e9f60fa3284083ebc7b0559cef41fa8b570167d2d34a7d2"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4033b6a5953ce6a5dcfc56bbd30f1ce220f051c1efdace01a7a8f835fbc6714f"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"964a7302c4953c37277249a32ae0b6f42c260e0b0d3ad5b0c01ec1a7020153cc"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"fcc9275d9f8d1035899d459a916887bcebbce219e74dca5a1650455069f4f603"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"be0da872db79ec9d4fc2ce734dbf7ae0bb0d46f9fb5dd419bdea62bd72059ae5"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3e936374ebe45a8c954e64eae73ce370a33f4fafac30a6247caaab3a37d85793"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"79c01738b674b11da32339a170336db0ab2a11728e5fbd6fb9e807cadec2e6db"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b3c70bef4dd31fa8d855d029ffec6ca9ea2087b1ee8cddb4e101eafd0f94a883"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f969753b00b380857c00d9abdf1bfb9c0b96bce877f52e3e6a57358b79a88a8c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"28271b6d0b84f55212ee2559643f1f71ebd3caddf28282ab6fb806af11e9e895"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"acc7d65de01a00bb963783a8c4ca8cbb826043b60dd565974a80906ac8522af6"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d88d4413bc6fbd3fed9e9c0c5ee81f7976cf06fb0dc7d89cfcf6d336610c1033"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c2521914f6a5e807392629947a1f443712eea465acb88ac3f79cfb63576316ef"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7d38b3f8560e521c14338099aca6d60903885f1acceca418dc84e9a6dd0fa8b9"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5e9b6e1ea08eb99144622959f0b00097f2eae74a4ea5d994c2eafb978e2d3445"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5cfd9a0142df7ad2cf54059c076004f99e4bbe2d4495c3c7d82319eb8a3dae2a"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7d6239c17ecac5000d5cdf32fe38cdf1be899eb0c0c66db695154b1ed9be410d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e783d1edc64445b3206994ac5d837abad820f07d09ca15a783dcb359beb4b301"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"bed5c66a8f27864ce5791c1c4c50eef3cadc71518e71d97b0b6eb86dbd46e081"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4362e37a70f18f9af597fa777ab187e75607fd57fefef144c58619f2709b385f"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"366e80c54a4a30d1db216a7f64958f52827b5aae6ef4ae836457b6942724c709"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"fe4af9c8811d1744a09c05e3cf9b6e39d52be2cdbc0a7f5fdcb75b93f561ea92"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5c0ffaaee83016c267911e3675a9616b4d6d9c8e18bf635802a9cb1f6d5629f5"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d7f466fcd881e151b3089f364c66ce35d1174c263d1da217a2f34c91d365141a"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e19257cddb49d7880b5f3d5a37de6c4a48c79726b4954e61b429870355dad792"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"49cf872e2ec45d1598af19a36fac0b5b2765e87b92a2a6719e49f8f39d99bfe1"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c533e3cb1041b49cdc6c5dcd12279c1c640e605b3381dba85a9bfdcf49d58beb"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"39be71e2a9ad4e2e01f16b2e17eec3a6340c290bac9afd7de2f03fe9fc47ecfc"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e954251ce9dd5ba2c3be2c216668c0f711561bb5196479007a3bab0062c4e4bd"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"fffcd5bcfe9b221cce40484f1f68faf6f7aa0d7073007af25a30075c46c3016b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"21aa35d22947ff4b107edac561da1cb78b2c942be35ba8d13f40cbec2d4cea41"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6f654995e4ca7d49d30c86f81456b71fbb94b6a500ca3f69fa1d3fa4a2e7bc5c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"75b97faa671fe2654219c4f7adee97f60085377cb4289888226ce029e72806db"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"daeae278e25480b33efa57b8a8af1fa2ed2558c712ba1836e1bdf40ba7363443"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ddf772bca9393e4577ed62f5caed2ba51fdfda62789c5f7fe59ebc6d7e07b102"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a31dea5cfa91b70f5132c982a877f094326c56408e667c182bb3eb10ecb74335"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8476f0abe3c14664c9d130cb514282391c58bc5ff00d5517b91aecd6b8336bb5"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1e550a64ec50ef519e6a319b1e9f078b2e8a6c1c70265d5dd77ffa9b465163b6"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"542f818edb9cb8e879c8aaf179e16f5e9e871b982d2ae6cc53ada03368219405"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"dec29ba772e0d0ca97484727894ad67791d8203abb47d5336f42827fb150d995"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f3087eaeb10def0681938dae16eafd55c9212b5076bae75e5d1bada4ba223662"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1169eb2a4d0c2a3b2239f6ea6b59e9bc4ebb53ddfd01a4da1d27d81035f5b84e"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8e42dd2c4956c0290fe21d347ff2474c4768e73ceea1522df9bca8078e891d33"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"55ab9ec93a429bd98b90f18fc31bf2b14d7b6ec846be721de6298c7334a7c829"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ff9361de227cd0ed6a76192e8acacd8b07661b450d45a4afcb3738d2c25a70be"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7e8aed97e57347b0f7fa4ed7146d1dcc6159a7853c002179cfbf900371972dde"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9c4e5ad2c889b3173394f0deb51db3cf5a89a3190b656aadf225d6d76c0bbf98"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"06a7891d35332df34587bcc316dcb4813516a68a32e4e9e52a13ccb4d36ecf15"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ea98c6c83e1ad67c0ba0a7520467b12e5c3768ae559957e51a20fcb7e799e45b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"72fb906809fefa993ce64743d3cb670bd87700cde51f5b9265c60e20fae70e2b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2bfdddc6d479cde5e58dc0dc972db69535a867b8582979574a3d748a20ac9a81"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ba25b91f522a19171b93224f6184b3190442c1bf6f2e60e5ec7042ca1b86a892"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"da031e8a21d37f6a23c3f3424423fe8c2c1f484eaf9af40fe946e8ee7ef12ab6"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c9516c95cb26a45fce493c21c03f00083c82f576905b3646b1be0ccd8494cb2b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e1f1e7cfec516b81b319587a50e1f127164c6032b0fa10ce3614205faa07c13c"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7e4b9b3ee715ccf5467864d490a76d950e9afc33547659f992b2920added664a"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e021b6d6c5b4d0589a5058e11a50bf06116ba60a9462ef82a6f6d690c748ad62"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7027d4bcf45b87de59f8df36714e12c9b36a0e7e3a083a02a545a5d8228f19bf"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a5b3210138b3a147c832ffe58fc04c382aa6584dfd46ae6d5634583666b0300a"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c294816cef8bfd836e4609949f22c7bdefd618cfd9e9d81c79a393505c68b1e7"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6d239fe7b6b4d1b2751e846f1a879dd2faedda9aafa53aae239ea692d49c4f8d"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"378b4054becea823ca52705d936871ba6e2020c87cc762d2b4ab5207606b7862"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"853c317e31a273c29a287c54e658842757120de269bd9965b962ad0f66f20da8"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c3e8a85ab46108143f52dab5f4dcd33628637f26791387c753c040e56edda847"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8f85966be375f92c9db36ee03787278d32f1fa5c4f329832c1a4334d17a32faa"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0537ad2da251abfc910168f45ea9b75f96bc85f543bb1a7a865d8a7075ee0127"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5cf29e224ee26b8b931038881064fe8a94903bcec7aaa120d45ef3d4fad5a96b"},"properties":{"commitSha":"2caf0654d0a6da473ef0265d4c5612865fd8f8c4"}},{"ruleId":"D28","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3cdfd7beb31b791ae18dcb425e21eb157c842e7bbcd522cc330573c1a6538db1"}},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d6c016eaf9ca358ce72b638edb3f0dabd386e6ade35ea0f16ccdc6b78f59194d"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e27fdebd872266fac1e3da99f1bb709878b68b632941674880d71c6f3f1ec668"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d39310e9bb00aa573f7fd079fe7c80d223a65ae3b889c2b1511e99a7e58f1a6d"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6cd7dd8ce2cb5c04a2c1d6ebe0d105c0ff37322563dcca85e129c8d762d0c027"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9136fbaa92ea14ac7cbc2c95c3cb37cd0aab779eca11caebabf6e972a920f9cd"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0d69e3beab226c373b7bd1d84dd05efb1dfab99c067a123e2df341897ba4f5b0"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"85596d040b50e8d06ccf83dadb684cc46fea9d38409df08516cf63f9eb339c7e"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ce3e9240ab2f04ac758ffe84ab68ebc170702bb48693ce587ea5125a019f3c45"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"25226b0215ef855b4d4a41cc19772d2677b6ddba626d14650ab410f5e69de318"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e012b61272f2f206a21a61dbb7190fdab4e44c5e9fd674fac3cc14f372a95be1"},"taxa":[{"id":"CWE-269","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4fbc6df3d72864219648f8a5e2a3fe4857d204776cc76785ab693bf45ade35c2"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d75904c8723a31ba01c02a467ad73fa22eed54ca13ff19ae4442cb79f4d82afd"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f1b6f882d88cc52942c6902541aa85aa6ae1071cc7ec9160d1e5b6ed40c98ed5"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"565df8f8ef4075ae911cdf8c466e38818c244cf6e98a7e58bef8810c5ab7fab0"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"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":"f40f765f0dc9cac0f2815fe28804f7f49fb47070d00ab264d4dc672ee7f175da"},"taxa":[{"id":"CWE-1104","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-1352","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"093666b7acca4a6ab8adb3b6de814c4b294a1ed64645a3341f297d93eecc2123"},"taxa":[{"id":"CWE-1104","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-1352","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"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":"610ee500364178378c9949892ddde4a61ffb607978a972aa891a8896140fa280"},"properties":{"dependency":{"package":"ws","version":"8.18.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d468adb4445ffa47766716da02c1997f86054c82b16562886a556a55e16139c6"},"properties":{"dependency":{"package":"undici","version":"5.29.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"bd3946592bf24c3491d28b34e29d1662623d22fd215dfd8a93747711381c0c2a"},"properties":{"dependency":{"package":"@fastify/busboy","version":"2.1.1","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"85c1ef976c61a9cd9c0e04ebc96cdb89c82ade120fbfa5c33e7b02da12497e8f"},"properties":{"dependency":{"package":"sharp","version":"0.33.5","advisory":"[GHSA redacted]","aliases":["[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"eeeebc5408a1c71e0695da3a7a624363e0f5820e541cca1b2ba2a2e8903d4b2a"},"properties":{"dependency":{"package":"esbuild","version":"0.17.19","advisory":"[GHSA redacted]","reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"dbdb79c774253f38f3492f6e01b8ec4429ee8f39deee18bdeca64b2126aa7bd2"},"properties":{"dependency":{"package":"esbuild","version":"0.24.2","advisory":"[GHSA redacted]","reachability":{"kind":"production","file":"sagefs-vscode/esbuild.mjs","line":1}}}},{"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":"6f058934a795f375d6783270c60c74ad96d5590d53f3cc0ab44440ac09429624"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: Editor.fs \u2194 RenderPipeline.fs: \u0060SageFs/Editor.fs\u0060 and \u0060SageFs/RenderPipeline.fs\u0060 change together 90% of the time (9 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets). They sit in the same directory, and in this ecosystem sibling files there normally share one namespace/package \u2014 so a direct reference between them needs no import and this pass cannot see whether one exists. Read the pair before acting: if one file only DECLARES what the other consumes (a constants/types file beside its user), the co-change is definitional and the question is whether the split earns its keep; if they duplicate structure, extract the common part into a shared function or type they both call; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 9 shared commits counted here, the most recent 3 are \u006078888e39\u0060 refactor(core): move the daemon Elm kernel \u002B render stack into the da\u2026; \u0060b6f60134\u0060 feat(core): add SmartReset with soft-first/hard-escalation logic (at that commit the files were still \u0060SageFs.Core/Editor.fs\u0060 and \u0060SageFs.Core/RenderPipeline.fs\u0060); \u00600a75de86\u0060 refactor(pattern-match): convert if/else to pattern matching in 9 lar\u2026 (at that commit the files were still \u0060SageFs.Core/Editor.fs\u0060 and \u0060SageFs.Core/RenderPipeline.fs\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Editor.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0898ecaa774d5c4b547f70c71a904d9d414ddb06d45eece667435ced146286fa"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: DaemonClient.fs \u2194 Editor.fs: \u0060SageFs/DaemonClient.fs\u0060 and \u0060SageFs/Editor.fs\u0060 change together 90% of the time (9 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets). They sit in the same directory, and in this ecosystem sibling files there normally share one namespace/package \u2014 so a direct reference between them needs no import and this pass cannot see whether one exists. Read the pair before acting: if one file only DECLARES what the other consumes (a constants/types file beside its user), the co-change is definitional and the question is whether the split earns its keep; if they duplicate structure, extract the common part into a shared function or type they both call; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 9 shared commits counted here, the most recent 3 are \u006078888e39\u0060 refactor(core): move the daemon Elm kernel \u002B render stack into the da\u2026; \u0060b6f60134\u0060 feat(core): add SmartReset with soft-first/hard-escalation logic (at that commit the files were still \u0060SageFs.Core/DaemonClient.fs\u0060 and \u0060SageFs.Core/Editor.fs\u0060); \u0060d78a2dde\u0060 fix(core): resolve remaining analyzer warnings (at that commit the files were still \u0060SageFs.Core/DaemonClient.fs\u0060 and \u0060SageFs.Core/Editor.fs\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/DaemonClient.fs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee46af9b4a9eab3156d43d5d8f666e6f8166d830dd25d083cd0cfd4c9def2424"}},{"ruleId":"D36","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1b213f6eedd4b140d0bc37bdf1496f72811a643f34064f12518b32e9e83bcfc7"}},{"ruleId":"D36","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0e17f71490e4d120a48b2b2881ab866c93b272bef2febb673a3e8e42b2c288ab"}},{"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":"759dca709f1a032fb6f624ce672e6afb5558fce53ecf01fb73618c4d33923164"}},{"ruleId":"D36","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"eb00976a698a5d68999b7ee6d27206fd374e916853e7ff1ead5eed42386f043f"}},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"90f83b4fa27db32740afe9540c905f3c0499caed87f61049a8a903ecc95b41c3"}},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0752d0df7434000fcabf1048e2de30a7a1a8b982b3db9a19898c4dec199856b4"}},{"ruleId":"D36","level":"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":"c5928b81075799790cb18fed2980a6b6e8aa5072772041c9951633efe8eb3542"}},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d657599f6f99da1927d3377533dfc0888b34c4d84aa7d5579841fd72d0e39bce"}},{"ruleId":"D36","level":"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":"ace515990e7ee0f17b5c17e44dd168a5bdecf90804a3a3dd845cf05540978013"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: LiveBindingsPane \u2192 LiveValueTree: \u0060LiveValuesReading\u0060 (slice \u0027LiveBindingsPane\u0027) depends on \u0060LiveValueSnapshot\u0060 from slice \u0027LiveValueTree\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveBindingsPane.fs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c6180c5b58ccba85f09cede184be9643f0e54603c43bf78e51124c934aa07f1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: LiveBindingsPane \u2192 LiveBindingsAdaptive: \u0060Hub\u0060 (slice \u0027LiveBindingsPane\u0027) depends on \u0060State\u0060 from slice \u0027LiveBindingsAdaptive\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveBindingsPane.fs"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb90374c94ff832147a746108fa2f61489a0c4afff6f9af48b82caf95a3d745e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: LiveBindingsPane \u2192 LiveValueTree: \u0060PaneView\u0060 (slice \u0027LiveBindingsPane\u0027) depends on \u0060LiveValueSnapshot\u0060 from slice \u0027LiveValueTree\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/LiveBindingsPane.fs"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5401ad953313da34c153655938947c99a3b60745844a1f62e5fab35794f3196"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: FrictionTelemetry \u2192 FrictionTelemetryTypes: \u0060ToolFrictionSummary\u0060 (slice \u0027FrictionTelemetry\u0027) depends on \u0060ToolName\u0060 from slice \u0027FrictionTelemetryTypes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/FrictionTelemetry.fs"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbf0addb853501eb0055b70ffc51dfabeec2e18c5c484f1aeaed8a8619aa1366"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: FrictionTelemetry \u2192 FrictionTelemetryTypes: \u0060TopBlockerSummary\u0060 (slice \u0027FrictionTelemetry\u0027) depends on \u0060BlockerKind\u0060 from slice \u0027FrictionTelemetryTypes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/FrictionTelemetry.fs"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"30119603430f52b8c7b07bddad8a983b61dda8b8e084487306a725a32a4cb604"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: FrictionTelemetry \u2192 FrictionTelemetryTypes: \u0060TransitionSummary\u0060 (slice \u0027FrictionTelemetry\u0027) depends on \u0060ToolName\u0060 from slice \u0027FrictionTelemetryTypes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/FrictionTelemetry.fs"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a67482036f7379bb9e2c86e202a7afa98d284ae68b97007282611d1855e5a3a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: FrictionTelemetry \u2192 FrictionTelemetryTypes: \u0060FeedbackSummary\u0060 (slice \u0027FrictionTelemetry\u0027) depends on \u0060ToolName\u0060 from slice \u0027FrictionTelemetryTypes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/FrictionTelemetry.fs"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5458efdbb976d7b71141121c170d2756e57696319a028a761c36679cbe4bef9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: FrictionTelemetry \u2192 FrictionTelemetryTypes: \u0060ActionableToolReport\u0060 (slice \u0027FrictionTelemetry\u0027) depends on \u0060ToolName\u0060 from slice \u0027FrictionTelemetryTypes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/FrictionTelemetry.fs"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad6040d331a4b3956c345c7be9657f0edbfe62de4a787f60ec7cbeb42e311505"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: FeatureHooks \u2192 EvalStore: \u0060FeaturePushState\u0060 (slice \u0027FeatureHooks\u0027) depends on \u0060Store\u0060 from slice \u0027EvalStore\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/FeatureHooks.fs"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb3faf6dc3e2cf0772ab9076999a878084460ff66d14b7f47e988da13e0b3595"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: FeatureHooks \u2192 BindingExplorer: \u0060FeaturePushStateModule\u0060 (slice \u0027FeatureHooks\u0027) depends on \u0060BindingScopeSnapshot\u0060 from slice \u0027BindingExplorer\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/FeatureHooks.fs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"8283e04f85ed21df1372e63be3ec26423b30d3d48a286396d9ba52f570f738f1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ManifestOwner \u2192 DaemonManifest: \u0060Committed\u0060 (slice \u0027ManifestOwner\u0027) depends on \u0060DaemonManifestState\u0060 from slice \u0027DaemonManifest\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/ManifestOwner.fs"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"48f780aa4d20f0fa664f54c224ebd9a47a79d9d103c67edfaf93cc303763ca64"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: Events \u2192 Diagnostics: \u0060DiagnosticEvent\u0060 (slice \u0027Events\u0027) depends on \u0060DiagnosticSeverity\u0060 from slice \u0027Diagnostics\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/Events.fs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbed31bc8ff8facbe0bdda2d3c776f222c1919947b62de8466c57bda72455b59"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: KeptState \u2192 ReloadPlanning: \u0060Pending\u0060 (slice \u0027KeptState\u0027) depends on \u0060FileDecls\u0060 from slice \u0027ReloadPlanning\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Core/Features/KeptState.fs"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"84496227125453d8bdda4a51afc0da42247a5439966c39972d09366a41c488c9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: CohortLedgerSqlite \u2192 FrictionSqlite: \u0060LedgerUsage\u0060 (slice \u0027CohortLedgerSqlite\u0027) depends on \u0060OldestRow\u0060 from slice \u0027FrictionSqlite\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/CohortLedger.fs"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"092636f6511d09ad0ff133de4e6c6c9d466f7963cddb344ec108ebf78087f9d3"}},{"ruleId":"AXH1","level":"warning","message":{"text":"Runtime security header not set: content-security-policy: The live app\u0027s responses did not include content-security-policy (restricts the sources a page may load \u2014 mitigates XSS/injection). Observed by booting the app in-sandbox \u2014 advisory evidence for AppSec / CRA / NIS2 runtime secure-defaults. Set it at your reverse proxy or in the app."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"b142e47096a32517bde0bb9b78f7e564119c7f87e22fba4dccc0d1e3645d74c5"}},{"ruleId":"AXH1","level":"warning","message":{"text":"Runtime security header not set: strict-transport-security: The live app\u0027s responses did not include strict-transport-security (forces HTTPS on subsequent requests \u2014 mitigates downgrade/MITM). Observed by booting the app in-sandbox \u2014 advisory evidence for AppSec / CRA / NIS2 runtime secure-defaults. Set it at your reverse proxy or in the app."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"567d3eeb50a5678c0139a1d316c614c44cd4c4fb5db6fffa7795bc73d035966f"}},{"ruleId":"AXH1","level":"warning","message":{"text":"Runtime security header not set: x-content-type-options: The live app\u0027s responses did not include x-content-type-options (stops MIME-sniffing (expects \u0027nosniff\u0027)). Observed by booting the app in-sandbox \u2014 advisory evidence for AppSec / CRA / NIS2 runtime secure-defaults. Set it at your reverse proxy or in the app."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e7f2638203ac91f5b64c739d090b339c00a90f1007c83652152b402a6eb0cdeb"}},{"ruleId":"AXH1","level":"warning","message":{"text":"Runtime security header not set: x-frame-options: The live app\u0027s responses did not include x-frame-options (blocks clickjacking via framing (or use CSP frame-ancestors)). Observed by booting the app in-sandbox \u2014 advisory evidence for AppSec / CRA / NIS2 runtime secure-defaults. Set it at your reverse proxy or in the app."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"0e84499d19780ca121fad65e0f3bd2fc17b1268ce3079a5f40495749c54dc87e"}},{"ruleId":"AXH1","level":"warning","message":{"text":"Runtime security header not set: referrer-policy: The live app\u0027s responses did not include referrer-policy (limits referrer leakage to third parties). Observed by booting the app in-sandbox \u2014 advisory evidence for AppSec / CRA / NIS2 runtime secure-defaults. Set it at your reverse proxy or in the app."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"364ee3f006b552b8fee33710a1fbfb0c4fac59e927af9c4396e51940d9069f01"}},{"ruleId":"AXH1","level":"warning","message":{"text":"Runtime security header not set: permissions-policy: The live app\u0027s responses did not include permissions-policy (restricts powerful browser features (camera, geolocation, \u2026)). Observed by booting the app in-sandbox \u2014 advisory evidence for AppSec / CRA / NIS2 runtime secure-defaults. Set it at your reverse proxy or in the app."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6eac8a111f0bb913829dc090833718dca5ab8e5fba7350f9dcf68f1971010745"}},{"ruleId":"AXR1","level":"warning","message":{"text":"WCAG 2.4.2 reproducibly failed in a rendered surface: axe-core rule(s) document-title failed on: html. Runtime evidence (advisory \u2014 not scored); fix and re-scan to verify it clears."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"a152f745c16f064aeb9932e5d52584f548c37c248ac45bacf96a1a6ffc2e49e7"}},{"ruleId":"AXR1","level":"warning","message":{"text":"WCAG 3.1.1 reproducibly failed in a rendered surface: axe-core rule(s) html-has-lang failed on: html. Runtime evidence (advisory \u2014 not scored); fix and re-scan to verify it clears."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e2d0e1d2bf07ce04d82230fe7847e003479b78cd188efe60cc79686fb8ba8420"}},{"ruleId":"M3","level":"note","message":{"text":"No src/ separation: Production code isn\u0027t grouped under a src/ folder \u2014 it\u0027s spread across several top-level directories, so there\u0027s no one place that says \u0027this is the product\u0027."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"fdf7f5b24e313364d10170a5c2542959902fe0d26ed70edef3eaa10ec5bcdb1d"}},{"ruleId":"P3","level":"error","message":{"text":"NuGet vulnerability audit suppressed via NoWarn: \u0060NoWarn\u0060 silences NU1902 \u2014 NuGet\u0027s vulnerability-audit warnings for moderate advisories. Suppressed advisories are still shipped; they are only invisible in the build log. Remove these codes from NoWarn and address or explicitly accept each advisory instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Directory.Build.props"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"726947e938b618bed107ab8fe5ceed60fb8893ef97fa91919739da321108130e"}},{"ruleId":"P3","level":"note","message":{"text":"No SAST: No static application security testing detected. For this repository\u0027s stack, add \u0060semgrep --config=auto\u0060 plus gitleaks for committed secrets (F# is not a CodeQL language and has no language-specific SAST engine) as a CI step. What was searched, so you can tell an absence from a miss: the 20057 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":"P4","level":"note","message":{"text":"No release approval gate: Deployment is automated and no gate that pauses it for a human is DECLARED IN THIS REPOSITORY\u0027S PIPELINE FILES. What was read: every file under \u0060.github/workflows/\u0060, \u0060.forgejo/workflows/\u0060, \u0060.gitea/workflows/\u0060, \u0060.azuredevops/\u0060 and \u0060.azure-pipelines/\u0060, plus \u0060.gitlab-ci*\u0060 and \u0060azure-pipelines*\u0060 \u2014 with comment text stripped, so documenting a gate is not declaring one. What would have counted: GitLab\u0027s \u0060when: manual\u0060, CircleCI\u0027s \u0060type: approval\u0060, an Azure \u0060ManualValidation@\u0060 task or an \u0060approvals:\u0060 block, a Jenkins \u0060input\u0060 step, a \u0060uses:\u0060 step naming an approval action, an \u0060environment:\u0060 paired with \u0060reviewers\u0060 / \u0060required_reviewers\u0060 / \u0060protection\u0060 / \u0060wait-timer\u0060 / \u0060deployment_branch_policy\u0060, a draft-release step, a \u0060workflow_dispatch\u0060 promotion, or a release-event gate. \u2605 What this cannot see, because none of it is a file: a GitHub environment whose required reviewers are configured in repo SETTINGS, a branch protection rule, or an organisation deployment policy \u2014 all of them real, enforced gates that live outside the repository. If yours is one of those, this row is wrong and nothing in the tree could have told us. Otherwise: whatever reaches the release trigger goes to production unreviewed, so a mistaken merge or tag is live before anyone can stop it."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6c11e2dbd483b4b423b95ac61bfcc7af1d55351b28a20d2b1105b31cfe38cc60"}},{"ruleId":"R1","level":"warning","message":{"text":"Type Safety: 2 typed \u00B7 9 plain JS \u2014 the untyped files are SageFs.Host/Resources/devreload.js, SageFs/Resources/devreload.js, sagefs-vscode/esbuild.mjs, sagefs-vscode/src/LiveTestingListener.golden-tests.mjs, sagefs-vscode/src/SageFsClient.golden-tests.mjs, sagefs-vscode/src/http-helpers.golden-tests.mjs (\u002B3 more)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d00ee7953f55325a823d27e5db9657c80ca9b9861c0c0abf8fe487cd3fa586d3"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (272 identical lines \u00D7 2 files): SageFs.Host/Resources/devreload.js:1 \u00B7 SageFs/Resources/devreload.js:1 \u2014 these 2 files are line-for-line copies of one another \u2014 272 lines are identical, in the same order, in every one of them \u2014 so this is one fact about the file set, not a block to extract. An edit made to one file and not the others changes behaviour silently, which is the failure a wholesale copy guarantees. Pick one file as the single source and derive the others from it (re-export it, spread it into the local overrides each variant genuinely needs, or generate the copies at build time) \u2014 the few lines that differ between the files are exactly the part each variant should still own. Check first whether the copies are deliberately standalone deliverables (a translation file seeded from its sibling and waiting to be translated); where they are, the duplication is the design, and the honest move is to mark the seeded file as untranslated rather than to let it pass as done."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Host/Resources/devreload.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0297ca903a802b41c14f9d714aaab859af2506dccf632e3c79ab6905ea123ec1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): friction-receiver/src/index.ts:305 \u00B7 friction-receiver/src/index.ts:329 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"friction-receiver/src/index.ts"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"94371bc1c3b86e7e7a5dc51ec3df778582fd1ecc4d1d21d758d94aa634867a0a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): friction-receiver/src/index.ts:132 \u00B7 friction-receiver/src/index.ts:143 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"friction-receiver/src/index.ts"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"abf7f7f246b759e705ccf61526f9c5425b24cb36888e2fe2ad919249f2b3da54"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): friction-receiver/src/index.ts:153 \u00B7 friction-receiver/src/index.ts:161 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"friction-receiver/src/index.ts"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed08fa16cdc700ec7fba683460e1914a4ed89b2416f306676f858f3d5e07a2a8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): sagefs-vscode/src/http-helpers.js:13 \u00B7 sagefs-vscode/src/http-helpers.js:42 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vscode/src/http-helpers.js"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"823c290c6a0c5520faddc3221423480686f2d6d6c1963a0f24c3683481339d5e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): friction-receiver/src/index.ts:204 \u00B7 friction-receiver/src/index.ts:210 \u2014 all 2 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"friction-receiver/src/index.ts"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"87e4423fbcedc2959921f9cdcf72ab79bcd4d250f221a5ce87096b397204f688"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): sagefs-vscode/src/SageFsClient.golden-tests.mjs:59 \u00B7 sagefs-vscode/src/SageFsClient.golden-tests.mjs:66 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vscode/src/SageFsClient.golden-tests.mjs"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6c4d0e4202f6d9406122353246bcfeb09a62b039592ca4973571c3bf95c6c33"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 4 locations): sagefs-vscode/src/LiveTestingListener.golden-tests.mjs:252 \u00B7 sagefs-vscode/src/LiveTestingListener.golden-tests.mjs:264 \u00B7 sagefs-vscode/src/LiveTestingListener.golden-tests.mjs:276 \u00B7 sagefs-vscode/src/LiveTestingListener.golden-tests.mjs:324 \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":"sagefs-vscode/src/LiveTestingListener.golden-tests.mjs"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b6c91514cd741787b6cb028922562e78e73b01f1d431aefcff73094d1bdc52a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3 locations): sagefs-vscode/src/LiveTestingListener.golden-tests.mjs:260 \u00B7 sagefs-vscode/src/LiveTestingListener.golden-tests.mjs:284 \u00B7 sagefs-vscode/src/LiveTestingListener.golden-tests.mjs:290 \u2014 all 3 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vscode/src/LiveTestingListener.golden-tests.mjs"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9515061d55eda469865f258a92ad85e321f7da96c7c33f4674eb6f51aa7399a"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function renderErrorPanel (cyclomatic 24, cognitive 38): renderErrorPanel has cyclomatic complexity 24 and cognitive complexity 38; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Host/Resources/devreload.js"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"b980c94bb30c9fd40419948d27d2ae10364e4648b3331f28598e062a60315852"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function renderErrorPanel (cyclomatic 24, cognitive 38): renderErrorPanel has cyclomatic complexity 24 and cognitive complexity 38; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Resources/devreload.js"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"e06a0a361f8f59b42fbb1011dbd9585f149c4edf85bd8eb80bd11566bb95f64a"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function onmessage (cyclomatic 24, cognitive 32): onmessage has cyclomatic complexity 24 and cognitive complexity 32; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Host/Resources/devreload.js"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"9082560e53233fe7c68c2dc230f823d2731360837f06edd72c85099159e48d13"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function onmessage (cyclomatic 24, cognitive 32): onmessage has cyclomatic complexity 24 and cognitive complexity 32; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Resources/devreload.js"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"8302834ae4a25023bf25072923161824b781c66d8a37f242cbb93e29778c7f4a"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function fetch (cyclomatic 20, cognitive 22): fetch has cyclomatic complexity 20 and cognitive complexity 22; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"friction-receiver/src/index.ts"},"region":{"startLine":358}}}],"partialFingerprints":{"codehealthFindingId/v1":"10e7101a28a84488a61777b1ba01341b9c59f26553040fa31f2ae7b3223605de"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function sanitizeReport (cyclomatic 15, cognitive 14): sanitizeReport has cyclomatic complexity 15 and cognitive complexity 14; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"friction-receiver/src/index.ts"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"76ebeb4d4b12cdec8a0fc23ddd5c017f120bd4301141b451ccbc644632bf9a3e"}},{"ruleId":"R3","level":"warning","message":{"text":"Large Files: 1 file(s) over 400 lines (counted as significant lines \u2014 blank lines excluded \u2014 over production source only, tests excluded), largest first: friction-receiver/src/index.ts (409)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"cecee31b569df4f07e06db732f1ca037af27b5afef9023da51f9673d931a142f"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vscode/src/LiveTestingListener.golden-tests.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d28de7f4a63e7bc732cf0f9f7ed6ae5eaa420da65a015500f27f40c9df9e329"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs.Host/Resources/devreload.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"48da4f1580a07043e845c7dfe4068f89d205e49c82408f7b27003826e0e6dd46"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SageFs/Resources/devreload.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"090f2f05485f5a467a54b5828378848c844a54a27510f84ed53f9d05fcd7caa9"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vscode/src/SageFsClient.golden-tests.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6683d5574d803fe4ea5cde730d79c2352f210edf6e7f018954debcdbf03ff81f"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vscode/src/sse-helpers.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"91711f51b7a718cc73d489f922541b977e939117eddc1494a1e3858645e3b50f"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vscode/src/http-helpers.golden-tests.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8716b9154259cee606f612ac63d1e79d75959c596aa3381ecbf56b7002549b27"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vscode/src/http-helpers.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e85b4a2e825d2a6b2a03b23681d6b9b2834919bd77c6d9041b55fa00df7d4972"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vscode/esbuild.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3378ce2062e8bb84b65e23fb2db4c28d9550c69ccf6c60bd79d3e413ab3ae363"}},{"ruleId":"R6","level":"warning","message":{"text":"No lint script: test \u2713 \u00B7 lint \u2717 \u00B7 typecheck \u2713 \u2014 read from this repository\u0027s package.json scripts and corroborated against its CI workflows. A script counts when its name or command matches the step: \u0060test\u0060 for the suite, \u0060lint\u0060 or \u0060prettier\u0060 for linting, \u0060typecheck\u0060/\u0060type-check\u0060/\u0060tsc\u0060 for type checking. \u2717 therefore means no script or CI step under those names was found, NOT that the step is absent from your pipeline \u2014 a task invoked by a runner this check does not read, or named something else entirely, is not seen and is worth confirming before acting on a cross. A \u2713 means the wiring is DECLARED \u2014 a script or CI step under those names exists. It is not a statement that the step passes, or that it runs at all: nothing here installs a dependency or executes a suite."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"bc8e67e81453cf5399dd04786d18b232180426b135169175fee670bdd83ccb03"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~100 LoC): no import path from any entry point (7 application, 1 tooling, 2 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vscode/src/sse-helpers.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4974c1f03b20675ebcfa93af8e471370a11e272b162b9def6f0a02c8e79b8d8"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~54 LoC): no import path from any entry point (7 application, 1 tooling, 2 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vscode/src/http-helpers.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"519108671725cfcc484848eae10ca0bef40daffbb4ed3b9de771aada7ca4caad"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060s.StartsWith(\u0022-r:\u0022, System.StringComparison.Ordinal) \u0026\u0026 s.EndsWith(\u0022.dll\u0022, System.StringComparison.Ordinal)\u0060 appears character-identically in 2 files \u2014 SageFs.Core/ProjectLoading.fs, SageFs.Core/SessionAgent.fs. 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":"SageFs.Core/ProjectLoading.fs"},"region":{"startLine":1168}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d80bd0b60acf7b326319d84ca08eebdbc6cd8eebf88f76f103d33e94ad2bf19"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060t.Name.StartsWith(\u0022\u003C\u0022, System.StringComparison.Ordinal) || t.Name.StartsWith(\u0022$\u0022, System.StringComparison.Ordinal) || t.Name.Contains(\u0022@\u0022) |\u2026\u0060 appears character-identically in 2 files \u2014 SageFs.Core/AppState.fs, SageFs.Core/OpenReplay.fs. 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":"SageFs.Core/AppState.fs"},"region":{"startLine":599}}}],"partialFingerprints":{"codehealthFindingId/v1":"a83fc1dfd748125671297d45cb3fb194f60a30b33cc5b65257647455e95ab2a3"}},{"ruleId":"X2","level":"note","message":{"text":"Not all async methods take a CancellationToken: Only 92/98 async methods accept a CancellationToken, so in-flight work can\u0027t be stopped early when the caller gives up \u2014 whatever ends it in your host (shutdown signal, timeout, abandoned request, user cancel). Thread a token through the call chain and honour it at each await and loop; where a method genuinely cannot be interrupted, omitting it is a deliberate choice \u2014 judge against your hosting model."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"bf623a92fb752b336427856888a9b386c434e686662a2cdc1bba21832c0a048c"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch\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":"sagefs-vs/SageFs.VisualStudio/Commands/FailingTestNavigationCommands.cs"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"21c13fecaf167c89923603bde7188308158916b81488f55d6fada554fc0f4d84"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch\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":"sagefs-vs/SageFs.VisualStudio/Commands/FailingTestNavigationCommands.cs"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"50810b4f4eee73555bf4ef3cae34410a62828993f2decff6f12ce9a80a2d0563"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch\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":"sagefs-vs/SageFs.VisualStudio/Commands/ToggleDensityModeCommand.cs"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"61933511c84b7de34e498a3a690621fc6146c4e882731cc6e9bb100d49c720b7"}},{"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":"sagefs-vs/SageFs.VisualStudio/Commands/ToggleDensityModeCommand.cs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"1eff9ad98e7222c2ddfe72f12a67a886ddd433c55dbe625fb5a0a61510992595"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch\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":"sagefs-vs/SageFs.VisualStudio.Editor/CellHighlightAdornment.cs"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"f78c3f2a2a41c931d66f13ed79be1193cefabb5c224642933327b023813bcdc6"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch\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":"sagefs-vs/SageFs.VisualStudio.Editor/Completions/SageFsCompletionSource.cs"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"1442fb526860a5c1a7bfe75f6acb11e2f1b858bbf6c680a96cf4e2287e50deef"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch\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":"sagefs-vs/SageFs.VisualStudio.Editor/DensityModeHelper.cs"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"3aec37ad68445695fdf16fb01c432669405f8872957f17c36f1722916b586e8c"}},{"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":"sagefs-vs/SageFs.VisualStudio.Editor/DensityModeHelper.cs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7acaeb359952252cbddaaff87a2226738a148a94a68ec121245590ef685d047"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch\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":"sagefs-vs/SageFs.VisualStudio.Editor/InlineEvalAdornment.cs"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"334b385cc36177360d87c51f77558768808ce8e4155ead614dfd3e42d8482d1a"}},{"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":"sagefs-vs/SageFs.VisualStudio.Editor/InlineEvalAdornment.cs"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0e719ece8e3092eaed549986c1ba64fcfc8727f4eaf020d96ca4ecfb3428bb6"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch\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":"sagefs-vs/SageFs.VisualStudio.Editor/InlineFailureAdornment.cs"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"43f29e727d1649f5b77f346772347358dcaf589dbfb711cfd9b48a04c2251433"}},{"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":"sagefs-vs/SageFs.VisualStudio.Editor/InlineFailureAdornment.cs"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"275af7b63157d34ba794870f7c9495bc243131dbea1a5b93a7f3592eeed69ff4"}},{"ruleId":"X5","level":"warning","message":{"text":"Symbol treated as nullable, then dereferenced unguarded: This method contradicts itself about \u0060linkedCts\u0060: line 152 writes \u0060linkedCts?.Dispose\u0060, which says \u0060linkedCts\u0060 can be null, but line 127 then dereferences it directly as \u0060linkedCts.Token\u0060 with no null test between them and no guard around it. If the \u0060?.\u0060 is right, that dereference throws NullReferenceException on the input it was written for; if \u0060linkedCts\u0060 truly cannot be null here, the \u0060?.\u0060 is misleading. Settle it one way \u2014 test \u0060linkedCts\u0060 once before the first use and handle the null case, or drop the \u0060?.\u0060 \u2014 rather than leaving the two readings side by side."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio.Editor/Completions/SageFsCompletionSource.cs"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca435ba917a51493c685415b4912b972b02ede5ab31055662b78d885db188d3a"}},{"ruleId":"X5","level":"note","message":{"text":"Null-forgiving operator (\u0060!\u0060) suppressions reduce the NRT score: ~0.2 \u0060!\u0060 suppressions per 1k syntax nodes \u2014 6 suppression(s) across the 36995 syntax node(s) in code where nullable warnings are ENABLED, which is the only code a \u0060!\u0060 can suppress anything in (a \u0060!\u0060 under \u0060#nullable disable\u0060 is inert and is not counted, and its file\u0027s nodes are not in the denominator). Each one tells the compiler to trust you about null, suppressing the very safety NRTs provide."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"93cfe05d4ad8c8c171267603b23dfe289b74842e38edd1b7bfed59cc32bda337"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060TryOpenDocumentAsync\u0060 swallows every exception into \u0060return false;\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let validation throw."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio/Commands/FailingTestNavigationCommands.cs"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"a59c1491be2eedba9eda1ce98acb46b1225f2cc1c18e7da1a038a3b29069641b"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060IsDarkTheme\u0060 swallows every exception into \u0060return true;\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let validation throw."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sagefs-vs/SageFs.VisualStudio.Editor/CellHighlightAdornment.cs"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd53faf2416c1dfaa8a1999fe14c9cf8a94f6d3f6ddad3bdea89e0f5b60669f5"}}],"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-1104","guid":"4c918cb5-b2a6-6c55-9963-a44ee464305e","name":"CWE-1104","shortDescription":{"text":"CWE-1104"},"helpUri":"https://cwe.mitre.org/data/definitions/1104.html"},{"id":"CWE-1352","guid":"5257f322-5cfc-6b52-bedd-0b9a526b4c7d","name":"CWE-1352","shortDescription":{"text":"CWE-1352"},"helpUri":"https://cwe.mitre.org/data/definitions/1352.html"},{"id":"CWE-1357","guid":"e4d2e772-757e-0a5c-bd7d-77052949d866","name":"Reliance on Insufficiently Trustworthy Component","shortDescription":{"text":"Reliance on Insufficiently Trustworthy Component"},"helpUri":"https://cwe.mitre.org/data/definitions/1357.html"},{"id":"CWE-1395","guid":"800e09e7-c11a-8654-9fa6-86f398995fed","name":"Dependency on Vulnerable Third-Party Component","shortDescription":{"text":"Dependency on Vulnerable Third-Party Component"},"helpUri":"https://cwe.mitre.org/data/definitions/1395.html"},{"id":"CWE-16","guid":"659db3ea-affc-8453-8add-c1218fbfcb92","name":"Configuration","shortDescription":{"text":"Configuration"},"helpUri":"https://cwe.mitre.org/data/definitions/16.html"},{"id":"CWE-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-269","guid":"70e1f5f6-81e5-4e5a-ba40-b541c3a346e2","name":"CWE-269","shortDescription":{"text":"CWE-269"},"helpUri":"https://cwe.mitre.org/data/definitions/269.html"},{"id":"CWE-353","guid":"09d7e902-d4ee-f05d-ae6c-0a1554d0c18f","name":"CWE-353","shortDescription":{"text":"CWE-353"},"helpUri":"https://cwe.mitre.org/data/definitions/353.html"},{"id":"CWE-494","guid":"b8a65e0d-e459-4a55-a931-fc1136482375","name":"Download of Code Without Integrity Check","shortDescription":{"text":"Download of Code Without Integrity Check"},"helpUri":"https://cwe.mitre.org/data/definitions/494.html"},{"id":"CWE-506","guid":"401d6455-56e3-0552-9a39-f77461673e3f","name":"CWE-506","shortDescription":{"text":"CWE-506"},"helpUri":"https://cwe.mitre.org/data/definitions/506.html"},{"id":"CWE-732","guid":"1da27e8f-b330-7650-ab63-bd61953eae5d","name":"Incorrect Permission Assignment for Critical Resource","shortDescription":{"text":"Incorrect Permission Assignment for Critical Resource"},"helpUri":"https://cwe.mitre.org/data/definitions/732.html"},{"id":"CWE-77","guid":"332c8ade-6612-9f56-a06b-d8d90b1a8750","name":"Command Injection","shortDescription":{"text":"Command Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/77.html"},{"id":"CWE-78","guid":"2e31ceaf-c7ae-2e5e-9661-cfb1362789cf","name":"OS Command Injection","shortDescription":{"text":"OS Command Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/78.html"},{"id":"CWE-79","guid":"fd45580b-e8c4-fc5e-8c2f-aa8fab0b4dbf","name":"Cross-site Scripting (XSS)","shortDescription":{"text":"Cross-site Scripting (XSS)"},"helpUri":"https://cwe.mitre.org/data/definitions/79.html"},{"id":"CWE-798","guid":"5e8f057d-fee3-995a-a0cb-9fc5b0d174d1","name":"Use of Hard-coded Credentials","shortDescription":{"text":"Use of Hard-coded Credentials"},"helpUri":"https://cwe.mitre.org/data/definitions/798.html"},{"id":"CWE-829","guid":"13c33925-97fb-5a5e-b40c-56d328b8a4d7","name":"CWE-829","shortDescription":{"text":"CWE-829"},"helpUri":"https://cwe.mitre.org/data/definitions/829.html"},{"id":"CWE-89","guid":"6d08fdad-37eb-c150-bbf0-d7d946863407","name":"SQL Injection","shortDescription":{"text":"SQL Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/89.html"},{"id":"CWE-937","guid":"16f316ae-415c-b354-a59b-1f7905f756e9","name":"Using Components with Known Vulnerabilities","shortDescription":{"text":"Using Components with Known Vulnerabilities"},"helpUri":"https://cwe.mitre.org/data/definitions/937.html"},{"id":"CWE-94","guid":"75e7f50c-6c2f-dd52-bf40-bf6c52b861fd","name":"Code Injection","shortDescription":{"text":"Code Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/94.html"}]}],"properties":{"codehealthPublication":{"public":true,"notice":"This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings \u2014 which rule fired, in which file, on which line, and how to fix it \u2014 are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.","securityFindingsRedacted":649,"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."]}]}