{"$schema":"https://json.schemastore.org/sarif-2.1.0.json","version":"2.1.0","runs":[{"tool":{"driver":{"name":"codehealth","informationUri":"https://codehealth.canine.dev","rules":[{"id":"D1","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D1"},{"id":"D2","name":"Cognitive Complexity","shortDescription":{"text":"Cognitive Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D2"},{"id":"D3","name":"God Classes","shortDescription":{"text":"God Classes"},"helpUri":"https://codehealth.canine.dev/dimensions/D3"},{"id":"D4","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/D4"},{"id":"D5","name":"Coupling","shortDescription":{"text":"Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D5"},{"id":"D6","name":"Cohesion (LCOM4)","shortDescription":{"text":"Cohesion (LCOM4)"},"helpUri":"https://codehealth.canine.dev/dimensions/D6"},{"id":"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":"D12","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/D12"},{"id":"D13","name":"Secret Scanning","shortDescription":{"text":"Secret Scanning"},"helpUri":"https://codehealth.canine.dev/dimensions/D13","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"]}},{"id":"D15","name":"Churn \u00D7 Complexity Hotspots","shortDescription":{"text":"Churn \u00D7 Complexity Hotspots"},"helpUri":"https://codehealth.canine.dev/dimensions/D15"},{"id":"D16","name":"Bus Factor","shortDescription":{"text":"Bus Factor"},"helpUri":"https://codehealth.canine.dev/dimensions/D16"},{"id":"D17","name":"Explicit Debt","shortDescription":{"text":"Explicit Debt"},"helpUri":"https://codehealth.canine.dev/dimensions/D17"},{"id":"D18","name":"Solution Shape","shortDescription":{"text":"Solution Shape"},"helpUri":"https://codehealth.canine.dev/dimensions/D18"},{"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":"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":"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":"AX10","name":"Code composition","shortDescription":{"text":"Code composition"},"helpUri":"https://codehealth.canine.dev/dimensions/AX10"},{"id":"AX3","name":"Project dependency cycles","shortDescription":{"text":"Project dependency cycles"},"helpUri":"https://codehealth.canine.dev/dimensions/AX3"},{"id":"AX4","name":"Dependency direction","shortDescription":{"text":"Dependency direction"},"helpUri":"https://codehealth.canine.dev/dimensions/AX4"},{"id":"AX5","name":"Architecture \u0026 structure","shortDescription":{"text":"Architecture \u0026 structure"},"helpUri":"https://codehealth.canine.dev/dimensions/AX5"},{"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":"P2","name":"Observability","shortDescription":{"text":"Observability"},"helpUri":"https://codehealth.canine.dev/dimensions/P2"},{"id":"P3","name":"Security \u0026 performance tooling","shortDescription":{"text":"Security \u0026 performance tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/P3"},{"id":"P6","name":"Release Hygiene","shortDescription":{"text":"Release Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/P6"},{"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"}]}},"results":[{"ruleId":"D1","level":"warning","message":{"text":"Tracker.Calculate (cyclomatic 45): Tracker.Calculate has cyclomatic complexity 45 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/Tracker.cs"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"c93753fd6d12fdf2e3cd053d1ada106761b230bbbb2097a6c3d1eff70e25fc9d"}},{"ruleId":"D1","level":"warning","message":{"text":"Splitter.Calculate (cyclomatic 36): Splitter.Calculate has cyclomatic complexity 36 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/Splitter.cs"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"13fd51068746817dbf81324e5f8abf3d34e6b1438ab43c376c11675a0ad22101"}},{"ruleId":"D1","level":"warning","message":{"text":"ReadFarmSettings.GetInnerText (cyclomatic 32): ReadFarmSettings.GetInnerText 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":"CASSYS Engine/ReadFarmSettings.cs"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"caee7474dd6b01f0c6beee9f86c38f02ed9f9a4416d7c17367e778e30a356a8e"}},{"ruleId":"D1","level":"warning","message":{"text":"GroundShading.CalcGroundShading (cyclomatic 30): GroundShading.CalcGroundShading 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":"CASSYS Engine/GroundShading.cs"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ff239e03bb765b6673f54e5fc1a773f91b7d7f6cd2355b0c9e4be324c614017"}},{"ruleId":"D1","level":"warning","message":{"text":"Simulation.Simulate (cyclomatic 28): Simulation.Simulate 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":"CASSYS Engine/Simulation.cs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6a3cda929eac2a34f42e5f5b6ede2b9867aabe00d78cf9c1955d6ba81cdeb92"}},{"ruleId":"D1","level":"warning","message":{"text":"BackTilter.Calculate (cyclomatic 27): BackTilter.Calculate has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/BackTilter.cs"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"61d8c7731f92266d3235a4260fbab43ea832678c76d8d46cccee2397c3b5a300"}},{"ruleId":"D1","level":"warning","message":{"text":"ReadFarmSettings.AssignOutputFileSchema (cyclomatic 25): ReadFarmSettings.AssignOutputFileSchema has cyclomatic complexity 25 (threshold 15). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/ReadFarmSettings.cs"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"c71232d2608c63d58ed9470586593cfab84bbd1395fdcf8e8b02670d1cd3e740"}},{"ruleId":"D1","level":"warning","message":{"text":"GridConnectedSystem.AssignOutputs (cyclomatic 22): GridConnectedSystem.AssignOutputs has cyclomatic complexity 22 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/GridConnectedSystem.cs"},"region":{"startLine":255}}}],"partialFingerprints":{"codehealthFindingId/v1":"0eb1dcd29f70ecfeb1bda9de3bdcaff43cedc72266ffe04b4471ca059380440b"}},{"ruleId":"D1","level":"warning","message":{"text":"RadiationProc.Calculate (cyclomatic 20): RadiationProc.Calculate has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/RadiationProc.cs"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"dba9c771bfa05dc22f678e60b7a3f4d87b1ef061bcf62f26f5c266ecc9e3ab79"}},{"ruleId":"D1","level":"warning","message":{"text":"GridConnectedSystem.Calculate (cyclomatic 18): GridConnectedSystem.Calculate has cyclomatic complexity 18 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/GridConnectedSystem.cs"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c85b6a47d3dfe8ba67dd026554c1ee9d71ce1d8560c4400b28c7e70454bfe67"}},{"ruleId":"D1","level":"warning","message":{"text":"Shading.Config (cyclomatic 17): Shading.Config has cyclomatic complexity 17 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function, or replace a long branch ladder over a single value with a data-driven lookup or dispatch table."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/Shading.cs"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"8869a55c60b34eb1aed26933efd48cd3841d97e723b8d2d775d6ad0a57758985"}},{"ruleId":"D1","level":"warning","message":{"text":"PVArray.Config (cyclomatic 16): PVArray.Config 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":"CASSYS Engine/PVArray.cs"},"region":{"startLine":540}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ad5092a02def84492a7a2b5a588d270d1bb0d29ae09b68cf9691d3a8bb29759"}},{"ruleId":"D1","level":"warning","message":{"text":"Tilter.GetTiltCompIrradPerez (cyclomatic 16): Tilter.GetTiltCompIrradPerez 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":"CASSYS Engine/Tilter.cs"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c865642418b29ad1dbdabf442ca8f8cf487bc2b88f0ced768caef6d6302b65f"}},{"ruleId":"D1","level":"warning","message":{"text":"Tracker.Config (cyclomatic 16): Tracker.Config 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":"CASSYS Engine/Tracker.cs"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"beed2c5009c979d35a31a81f14b9a7841a1b7d0d1bc805a7d45a807025da686c"}},{"ruleId":"D2","level":"warning","message":{"text":"Tracker.Calculate (cognitive 104): Tracker.Calculate has cognitive complexity 104 (threshold 15). 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":"CASSYS Engine/Tracker.cs"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5eed8d44b2e91b923bdabd24679e429776baddcf8e0edaf98ddbe5100c55a04"}},{"ruleId":"D2","level":"warning","message":{"text":"GroundShading.CalcGroundShading (cognitive 103): GroundShading.CalcGroundShading has cognitive complexity 103 (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":"CASSYS Engine/GroundShading.cs"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"e99cf7566dfdc0da5c059fd6f75498200c60b8a8cb762ae7dd2098b52fa081bb"}},{"ruleId":"D2","level":"warning","message":{"text":"BackTilter.Calculate (cognitive 97): BackTilter.Calculate has cognitive complexity 97 (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":"CASSYS Engine/BackTilter.cs"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"01a19ff9c2622077065e442d1597b93a455ebad87b9f5bc47064ed8cb0745d38"}},{"ruleId":"D2","level":"warning","message":{"text":"RadiationProc.Calculate (cognitive 54): RadiationProc.Calculate has cognitive complexity 54 (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":"CASSYS Engine/RadiationProc.cs"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"60d4feae7e5ce5afd7dd844495cb3e4d9096a26d63abd22c79bd2abd02e26ce8"}},{"ruleId":"D2","level":"warning","message":{"text":"ReadFarmSettings.AssignOutputFileSchema (cognitive 48): ReadFarmSettings.AssignOutputFileSchema has cognitive complexity 48 (threshold 15). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/ReadFarmSettings.cs"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae6451780fdd5de92095dd0c7c737fcf64c1eaa49a2b5fa4f4ee2e6e67b51f3a"}},{"ruleId":"D2","level":"warning","message":{"text":"Simulation.Simulate (cognitive 38): Simulation.Simulate has cognitive complexity 38 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/Simulation.cs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"39ce306a6a653699c972c8ebf041de8790e0080213d16829025f7ee74dd1419a"}},{"ruleId":"D2","level":"warning","message":{"text":"Splitter.Calculate (cognitive 36): Splitter.Calculate has cognitive complexity 36 (threshold 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/Splitter.cs"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"57c9b81c8cb4b404cd77702477d3788533b57cac8c66ee234f661ebd92fb0cb5"}},{"ruleId":"D2","level":"warning","message":{"text":"PVArray.Config (cognitive 33): PVArray.Config has cognitive complexity 33 (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":"CASSYS Engine/PVArray.cs"},"region":{"startLine":540}}}],"partialFingerprints":{"codehealthFindingId/v1":"43fe400ccfd1164a89fdf286c63432a1cdaaa3a042ded19d5be8228d629597ef"}},{"ruleId":"D2","level":"warning","message":{"text":"Inverter.ConfigEffCurves (cognitive 22): Inverter.ConfigEffCurves has cognitive complexity 22 (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":"CASSYS Engine/Inverter.cs"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"815eaac594f7483ca57b60e70fa51dcc463510a6a4bd6ffc12076c465df6f3a9"}},{"ruleId":"D2","level":"warning","message":{"text":"Shading.GetFrontShadedFraction (cognitive 20): Shading.GetFrontShadedFraction has cognitive complexity 20 (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. This shape REPEATS in the file: one other method here (Shading.GetBackShadedFraction) 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":"CASSYS Engine/Shading.cs"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc380afe1e4f93e34c286a22c206bf4be6e03e72a21a2c83a7f8dfb21eea6c3b"}},{"ruleId":"D2","level":"warning","message":{"text":"Shading.GetBackShadedFraction (cognitive 20): Shading.GetBackShadedFraction has cognitive complexity 20 (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. This shape REPEATS in the file: one other method here (Shading.GetFrontShadedFraction) 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":"CASSYS Engine/Shading.cs"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"f21322093e0ef5c1a2da4bea2be3b25d5ada39d1fbce54b2c29c9d7e5e89ca52"}},{"ruleId":"D2","level":"warning","message":{"text":"Inverter.GetMPPTStatus (cognitive 17): Inverter.GetMPPTStatus 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":"CASSYS Engine/Inverter.cs"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"5095439d16555a683a6a2c836f21407b55d6127a111e7092acc79b683faa000c"}},{"ruleId":"D2","level":"warning","message":{"text":"ReadFarmSettings.GetInnerText (cognitive 17): ReadFarmSettings.GetInnerText 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":"CASSYS Engine/ReadFarmSettings.cs"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb6bd53b124180705e281fef8bfba5f3be3a67d9fadb39f96eaec50e4c89cd57"}},{"ruleId":"D2","level":"warning","message":{"text":"Shading.Config (cognitive 17): Shading.Config has cognitive complexity 17 (threshold 15). 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":"CASSYS Engine/Shading.cs"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2abea6e5823cdf4b4d21d6621d493e7337489f270dc2d4a6c3dabe085e820a5"}},{"ruleId":"D2","level":"warning","message":{"text":"GridConnectedSystem.Calculate (cognitive 16): GridConnectedSystem.Calculate has cognitive complexity 16 (threshold 15). 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":"CASSYS Engine/GridConnectedSystem.cs"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"045f610a77a8fd24cccf08af3df57ebca0b818b49aab122fd0fc29e8fb337e5f"}},{"ruleId":"D2","level":"warning","message":{"text":"SimMeteo.ParseCSVLine (cognitive 16): SimMeteo.ParseCSVLine 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":"CASSYS Engine/MetReader.cs"},"region":{"startLine":262}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ab5a58eb35d4027c48cb5e59ca98a539eab8e762522b7bc61d17839cdb22a77"}},{"ruleId":"D2","level":"warning","message":{"text":"ReadFarmSettings.AssignInputFileSchema (cognitive 16): ReadFarmSettings.AssignInputFileSchema 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":"CASSYS Engine/ReadFarmSettings.cs"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"8db7ccc6824f33bf81be9ecba5624b712c1ab1b565555d038fd51a4de2fabb04"}},{"ruleId":"D2","level":"warning","message":{"text":"Tracker.Config (cognitive 16): Tracker.Config has cognitive complexity 16 (threshold 15). 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":"CASSYS Engine/Tracker.cs"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"08af6e939e594d7766f45ba820bf5ecc6ab2bbd14e34205de9004b297f07336c"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BackTilter.Calculate: MethodTooLong \u2014 Calculate runs 119 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/BackTilter.cs"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1c6c0cde7a88ec46d10bab056ef69bba2dc63970afc83b6887e40e6585c9ff3"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: PVArray: ClassTooLong \u2014 460 significant lines (blank, comment-only and punctuation-only lines excluded), 14 methods. 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":"CASSYS Engine/PVArray.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"637010ea5693051222d9e6425598888a8a1113e390ac400c1f69f6bb3a49b92e"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Tracker.Calculate: MethodTooLong \u2014 Calculate runs 115 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/Tracker.cs"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"08cf507b137ebb417e165ca09d9a36e9f006b806fa9f11386b1ebd382f793a9b"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: GroundShading.CalcGroundShading: MethodTooLong \u2014 CalcGroundShading runs 106 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/GroundShading.cs"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"a736e7db1b007150ab5956b5768149fe47241ac70aa4bf896e0d33884500bb61"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Simulation.Simulate: MethodTooLong \u2014 Simulate runs 104 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/Simulation.cs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2f7448a334cc30f5902e9160ec5d35f77dcf739a4dc23ffae4d195e05b538dd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2): CASSYS Engine/Tracker.cs:287-313 | CASSYS Engine/Tracker.cs:319-347 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/Tracker.cs"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"eed5c5afcf327391a1661a073fd545649205cb8103386014ed3c55bd6ba17bc7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2): CASSYS Engine/GroundShading.cs:367-392 | CASSYS Engine/GroundShading.cs:409-433 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060CASSYS Engine/GroundShading.cs:367\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/GroundShading.cs"},"region":{"startLine":367}}}],"partialFingerprints":{"codehealthFindingId/v1":"6212253edab9a1db3d1120ed73bdb33defa2bbad6f2adaf9fbf8fb411a4e0a7e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): CASSYS Engine/Shading.cs:178-190 | CASSYS Engine/Shading.cs:240-252 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060CASSYS Engine/Shading.cs:178\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/Shading.cs"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a45d4ef7ba83eb9aec0f1a6b119a6aff54a123dc20b325206e52a028c247aad"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3): CASSYS Engine/Shading.cs:316-327 | CASSYS Engine/Shading.cs:350-361 | CASSYS Engine/Shading.cs:383-394 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060CASSYS Engine/Shading.cs:316\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/Shading.cs"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"b96af840685a904c7cba9b6fe0462a2bd0771272108545d449741bd2f6382bf3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): CASSYS Engine/RadiationProc.cs:228-238 | CASSYS Engine/RadiationProc.cs:297-307 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060CASSYS Engine/RadiationProc.cs:228\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/RadiationProc.cs"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"790b7b386cb009658970674ac4c7fda0533c69fbd8f716ec0b241073791e85ef"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): CASSYS Engine/BackTilter.cs:81-90 | CASSYS Engine/GroundShading.cs:76-85 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/BackTilter.cs"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"3aa655ea34865688da0dbe44c2b64963351717213f7de9063a1014dc00a42890"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): CASSYS Engine/Interpolate.cs:243-252 | CASSYS Engine/Interpolate.cs:254-263 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/Interpolate.cs"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f599af17c2c0480a43436d1e1216ebc49e4a8c776b4a41b3b9db9b535c2623b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): CASSYS Engine/Interpolate.cs:265-269 | CASSYS Engine/Interpolate.cs:273-277 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060CASSYS Engine/Interpolate.cs:265\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/Interpolate.cs"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"94cfae9971aafc3a861fd1e2a28cce9a3b2d9535fada0a001c7505bb61ec3079"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): CASSYS Engine/PVArray.cs:751-755 | CASSYS Engine/PVArray.cs:767-771 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/PVArray.cs"},"region":{"startLine":751}}}],"partialFingerprints":{"codehealthFindingId/v1":"15e1ab3d227baea3708aedcebaa6516f76c510bcf95b2ebc68f08c77b7362a00"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): CASSYS Engine/RadiationProc.cs:215-219 | CASSYS Engine/RadiationProc.cs:284-288 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060CASSYS Engine/RadiationProc.cs:215\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/RadiationProc.cs"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae458e3b94663d69a2f12680785c1fc85152dfb6221d0679fbe3ede774071e29"}},{"ruleId":"D8","level":"error","message":{"text":"No automated tests: No automated tests \u2014 no test code was found in this repository. Untested code is the largest single risk to changing it safely."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"3132564c6310e5d01a231f252a02d5d2f5a542c0a8fa29a14c89693f1e3df871"}},{"ruleId":"D9","level":"note","message":{"text":"No tests found: No test suite could be collected \u2014 nothing here references a test framework (xUnit, NUnit or MSTest), so there were no discoverable tests to count. Tests written as plain executables or shell/PowerShell harnesses are not collectible this way and are not scored here."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"c9bf64cbb5a4ae13d6bcd01fa3bc8d2879d860c73bc67f176ee3c2cecb8adce3"}},{"ruleId":"D16","level":"warning","message":{"text":"dormant codebase \u2014 no living knowledge left to concentrate: Every one of the 25 significant source file(s) was last meaningfully changed so long ago that no living knowledge remains, so there is no concentration to measure \u2014 the bus factor is not scored. This is not a clean bill: nobody currently holds working knowledge of this code (see D34 Knowledge Freshness)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"569d55ea5cb0330f13c125b289d07e5abdfcceac947a2c2645277937942e7d5f"}},{"ruleId":"D17","level":"error","message":{"text":"WriteOnlyPrivateField: private HorizonShading SimHorizon \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":"CASSYS Engine/GridConnectedSystem.cs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"eac6de2cc595c3da7bacb707d41d526574554683e652c36c093a578260d82738"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: improve accuracy (especially for n \u003C 100) by setting 1 only if \u003E 50% of segment is shaded \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/GroundShading.cs"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2e16c9fecc9433239fa359aa4bc9ac386b8dca75ffa579c28531b2c3578aa59"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: improve accuracy (especially for n \u003C 100) by setting 1 only if \u003E 50% of segment is shaded \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/GroundShading.cs"},"region":{"startLine":430}}}],"partialFingerprints":{"codehealthFindingId/v1":"6aa1bbc1797a5ed1ad1247ebf811b7e59dedeb9aadc16319b7a68010d044004b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: improve accuracy (especially for n \u003C 100) by setting 1 only if \u003E 50% of segment is shaded \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/GroundShading.cs"},"region":{"startLine":527}}}],"partialFingerprints":{"codehealthFindingId/v1":"c65031cf7ab86faf9c10fb38fc5da55939bcca5bf8a9db035b7d3e3f885ca650"}},{"ruleId":"D17","level":"error","message":{"text":"WriteOnlyPrivateField: private double itsSubArrayNum \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":"CASSYS Engine/PVArray.cs"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"b310e2c8036af824107c294de34e5fb8a0cf0f6a97f298bc958a35ddd64f2ca2"}},{"ruleId":"D17","level":"error","message":{"text":"WriteOnlyPrivateField: private double itsCollTilt \u2014 assigned 2 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":"CASSYS Engine/Shading.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef4b44ebcebb610fd30931acb9cd2370c0eccab6dc7a19c42bea88c498fd65d5"}},{"ruleId":"D17","level":"error","message":{"text":"WriteOnlyPrivateField: private SimMeteo SimMet \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":"CASSYS Engine/Simulation.cs"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"ced3040abc5c25ed0141bc4e09123d3e4e77a7553fae5d5d4d74a1b8dd21b5fb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //itsSurfaceSlope = Util.DTOR * double.Parse(ReadFarmSettings.GetInnerText(\u0022O\u0026S\u0022, \u0022PlaneTilt\u0022)); TODO: Re-evaluate. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/Sun.cs"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"08afcb42378e22c4ad466afdf95143acb8fcfbfe90e1ae1bf7744675388006e5"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/Transformer.cs"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f708cc8c7a8eaf3e09906861025500799176fdcf02633469e1477d3163c1624"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/Transformer.cs"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"de784035bb62136318cd3f793c0cd6a4dde69887ef6b7df8351407e25cc6b12b"}},{"ruleId":"D20","level":"note","message":{"text":"No ADRs found: No ADRs found at common paths; consider documenting architectural decisions in Docs/ADL/ or similar."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d2bea044ff79d7d275f5a91a6e2f548586178eaf480274c33960ad020c854631"}},{"ruleId":"D34","level":"note","message":{"text":"Dormant codebase: 25 of 25 significant files have no living knowledge \u2014 the codebase as a whole is dormant, not 25 separate risks. Re-engage owners or document before change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4c69f1e54b7dd6fe9029dd02df6ba8f8145b789f2f18dbdaa086c40ded49dba6"}},{"ruleId":"D34","level":"note","message":{"text":"Largest orphaned file: One of the largest files with no living knowledge remaining \u2014 a reasonable place to start a read-through before the aggregate risk above bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/PVArray.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c47cd4723b00f6b57c0c5ce084bd64e98742795836fee49953843e4264a7309"}},{"ruleId":"D34","level":"note","message":{"text":"Largest orphaned file: One of the largest files with no living knowledge remaining \u2014 a reasonable place to start a read-through before the aggregate risk above bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/GridConnectedSystem.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"12c90f0793673c59ff4c0a33d8b61757c5deea7917359393a77f5d9d63f85ac4"}},{"ruleId":"D34","level":"note","message":{"text":"Largest orphaned file: One of the largest files with no living knowledge remaining \u2014 a reasonable place to start a read-through before the aggregate risk above bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/ReadFarmSettings.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"001845080a9d9e7816a9372d3c5be55eaa8f7fcc52ee80b084fb49640adaca71"}},{"ruleId":"IC1","level":"note","message":{"text":"Commented-out code: A line of code has been commented out rather than removed \u2014 dead weight that rots and confuses. Delete it (version control remembers)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/BackTilter.cs"},"region":{"startLine":390}}}],"partialFingerprints":{"codehealthFindingId/v1":"106c800c5a36fe95bafdfe12588e15f5ecb9e624bee0b98d1b0cd827e24b7c3d"}},{"ruleId":"IC1","level":"note","message":{"text":"Commented-out code: A line of code has been commented out rather than removed \u2014 dead weight that rots and confuses. Delete it (version control remembers)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/GridConnectedSystem.cs"},"region":{"startLine":429}}}],"partialFingerprints":{"codehealthFindingId/v1":"32dc4b0e60a9b247872d4965dbcec8b141f783a171f7d3c2af1c2ed9e293bf40"}},{"ruleId":"IC1","level":"note","message":{"text":"Commented-out code: A line of code has been commented out rather than removed \u2014 dead weight that rots and confuses. Delete it (version control remembers)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/GroundShading.cs"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"f051485e67dd66912469422e8a37275aed9753a510ab7ddbc0a5e0239e041fc4"}},{"ruleId":"IC1","level":"note","message":{"text":"Commented-out code: A line of code has been commented out rather than removed \u2014 dead weight that rots and confuses. Delete it (version control remembers)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/Inverter.cs"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b3c8845d3bdca6a77d9d59cfaa2ec0f51c14ddc8bfa853f73f1668fbeaa353b"}},{"ruleId":"IC1","level":"note","message":{"text":"Commented-out code: A line of code has been commented out rather than removed \u2014 dead weight that rots and confuses. Delete it (version control remembers)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/Inverter.cs"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb446ea39dc6bf95322366bebb45e3b78ee4f178097807a4a66dfdb90bd5f073"}},{"ruleId":"IC1","level":"note","message":{"text":"Commented-out code: A line of code has been commented out rather than removed \u2014 dead weight that rots and confuses. Delete it (version control remembers)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/PVArray.cs"},"region":{"startLine":565}}}],"partialFingerprints":{"codehealthFindingId/v1":"685fb73c8f1bc9df1c5143845de3b250d50d8f6314fadcf7d70a5b69450f4845"}},{"ruleId":"IC1","level":"note","message":{"text":"Commented-out code: A line of code has been commented out rather than removed \u2014 dead weight that rots and confuses. Delete it (version control remembers)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CASSYS Engine/RadiationProc.cs"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"73713e6e62b1e8b67a9325f8fadfa9a4686b7d4ae2f33c73d3ebdfc607ad1d7a"}},{"ruleId":"M2","level":"note","message":{"text":"No ADRs: No Architecture Decision Records found \u2014 no conventional ADR directory, no numbered \u0060NNNN-title\u0060 documents in any markup this check reads, and nothing ADR-shaped by content. Design rationale recorded elsewhere (a design-notes tree, a mailing list, pull-request discussion) is not visible to this check and is not re-findable per decision, so a future maintainer cannot ask why one choice was made and get an answer."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"670b3d6e36a756d63097d0dfbf90afd5fc761308800b9354894a07c3f4e4aa14"}},{"ruleId":"M2","level":"note","message":{"text":"No architecture diagram/doc: No C4/PlantUML/Mermaid diagram or architecture.md \u2014 the high-level shape isn\u0027t documented."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"0c190e7c159d1850ee706c3ac4486e151e8a4fe169de4bf61436b9f399654f06"}},{"ruleId":"M3","level":"note","message":{"text":"No tests/ separation: No test surface was found \u2014 there are no tests here to separate from production code, so the folder question hasn\u0027t been reached yet."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"999e0c784909c76b6346a705ee63961fe363ed1cd6a94e3f80e2ebe7820ccd5d"}},{"ruleId":"P1","level":"warning","message":{"text":"No CI pipeline: No CI workflow found (.github/workflows, azure-pipelines.yml, .gitlab-ci.yml, \u2026) \u2014 changes aren\u0027t gated by an automated build/test."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"44f01af96e50474fba2df84d95ddf4f7e1d34c29c307830b9efc9057daa6b670"}},{"ruleId":"P3","level":"note","message":{"text":"No SAST: No static application security testing detected. For this repository\u0027s stack, add CodeQL\u0027s csharp pack (it analyses VB.NET too), or a security analyzer package (or \u0060semgrep --config=auto\u0060, which runs on any language) \u2014 this repository has no CI pipeline yet, so run it locally to clear the existing findings, then make it a step of the first workflow you add so a regression fails the build."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6e54424179c892f03ef2fd003130ac4bd43f39bbf3b1ca0a0143e25acb80ec87"}},{"ruleId":"P6","level":"note","message":{"text":"No changelog: No CHANGELOG/HISTORY/RELEASES file \u2014 what shipped when isn\u0027t easy to reconstruct for support or audit. (Versioning/tagging makes releases traceable, but a changelog records the what.)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"dda5aa5aed8cbb292c3ef2b733bc138f614293ae6426c85e98bf31ef330d9415"}}],"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-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-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-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-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":0,"secretScannerRunsExcluded":0}}}]}