{"$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"]}]},{"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":"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":"D21","name":"Naming Consistency","shortDescription":{"text":"Naming Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D21"},{"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":"D27","name":"Navigability","shortDescription":{"text":"Navigability"},"helpUri":"https://codehealth.canine.dev/dimensions/D27"},{"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"]}]},{"id":"D29","name":"Static Analysis (SAST)","shortDescription":{"text":"Static Analysis (SAST)"},"helpUri":"https://codehealth.canine.dev/dimensions/D29"},{"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"]}]},{"id":"D35","name":"Change Coupling","shortDescription":{"text":"Change Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D35"},{"id":"D39","name":"IL Efficiency","shortDescription":{"text":"IL Efficiency"},"helpUri":"https://codehealth.canine.dev/dimensions/D39"}]}},"results":[{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): Infrastructure/Repositories/CuentaPlazoFijoRepository.cs:59-77 | Infrastructure/Repositories/CuentaPlazoFijoRepository.cs:84-102"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Repositories/CuentaPlazoFijoRepository.cs"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"f338ac5885607ae9d620d3a94fd07f802242a802b7f95b132c5ac45964cbf518"}},{"ruleId":"D5","level":"error","message":{"text":"Layer violation: Application \u2192 Infrastructure: Application (Application) references Infrastructure (Infrastructure) \u2014 dependencies must point inward (Web \u2192 Application \u2192 Domain; Infrastructure implements inner interfaces, nothing depends outward on it)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e27aca6f791fcbe2465e67f515025cce032234649858060654062cf706cdb54c"}},{"ruleId":"D8","level":"error","message":{"text":"No automated tests: No automated tests \u2014 the solution has no test code. 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 projects found in the repository."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"c9bf64cbb5a4ae13d6bcd01fa3bc8d2879d860c73bc67f176ee3c2cecb8adce3"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 6 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/CuentaPlazoFijosClientes/Response/CuentaPlazoFijosClientesResponse.cs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"52df519cbb0c711c4a4df3ef2d02d28190a95dc230bf0e33ded455ae15f46742"}},{"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":"D21","level":"note","message":{"text":"Typo in the name \u0027CuentaPlazoFizoClienteList\u0027 and its corresponding handler. \u0027Fizo\u0027 is a misspelling of \u0027Fijo\u0027.: Rename to \u0027CuentaPlazoFijoClienteList\u0027 and \u0027CuentaPlazoFijoClienteListHandler\u0027. (symbols: Application.CuentaPlazoFijosClientes.Query.CuentaPlazoFizoClienteList, Application.CuentaPlazoFijosClientes.Query.CuentaPlazoFizoClienteListHandler)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"b940364b3cec6836107545f984b01b4f691ef31db193af8a6132e5e3192473a0"}},{"ruleId":"D21","level":"note","message":{"text":"The client entity is named \u0027Cliente\u0027 in the domain, but the ID property is \u0027ClienteId\u0027. In the response DTOs, the ID is also \u0027ClienteId\u0027. This is consistent. However, the repository and query handlers mix \u0027Cliente\u0027 and \u0027CuentaPlazoFijo\u0027 contexts. The most glaring issue is the typo in the query/handler names mentioned above, which breaks consistency with the correct spelling \u0027Fijo\u0027 used elsewhere (e.g., \u0027CuentaPlazoFijoRepository\u0027).:  (symbols: Domain.Clientes.Cliente, Domain.Clientes.ICliente, Domain.Clientes.Cliente.ClienteId, Application.Clientes.Response.ClienteResponse.ClienteId, Application.CuentaPlazoFijosClientes.Response.CuentaPlazoFijosClientesResponse.ClienteId)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e06b4e2269cb2b5f70c1b4b3ca728bda187c2ead20d9a0a7e2c50917809818a4"}},{"ruleId":"D21","level":"note","message":{"text":"The concept of \u0027Address\u0027 or \u0027Location\u0027 is inconsistently named. Some parts use \u0027Sito\u0027 (which might be a specific local term or typo for \u0027Sitio\u0027 or \u0027Address\u0027), while others use \u0027Direccion1\u0027 and \u0027Direccion2\u0027. \u0027Sito\u0027 is not a standard English or Spanish term for address (likely a typo for \u0027Sitio\u0027 or \u0027Calle\u0027 or \u0027Direccion\u0027). \u0027Direccion\u0027 is Spanish for Address. \u0027Sito\u0027 is likely an error or a very specific domain term that conflicts with \u0027Direccion\u0027.: Standardize on \u0027Address\u0027 or \u0027Location\u0027 or \u0027Direccion\u0027 (if Spanish is preferred). \u0027Sito\u0027 should be renamed to \u0027Address\u0027 or \u0027Direccion\u0027 to match the other properties. (symbols: Domain.Clientes.Sito, Domain.Clientes.Cliente.Sito, Domain.Clientes.Cliente.Direccion1, Domain.Clientes.Cliente.Direccion2, Application.Clientes.Response.ClienteResponse.Sito, Application.CuentaPlazoFijosClientes.Response.CuentaPlazoFijosClientesResponse.Direccion1, Application.CuentaPlazoFijosClientes.Response.CuentaPlazoFijosClientesResponse.Direccion2)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"158b1610e9fd9f159461aa0654fbc2fb70ec5a86047732588db5236733275e99"}},{"ruleId":"D24","level":"note","message":{"text":"redundant comment: \u0022Configure the HTTP request pipeline.\u0022 \u2014 delete - Configure the HTTP request pipeline. is identical"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Api/Program.cs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"452c8ee96c445bd2457ad821aa717ff1e3990c8a54c9043963a2e25054db41e4"}},{"ruleId":"D24","level":"note","message":{"text":"redundant comment: \u0022Add services to the container.\u0022 \u2014 delete - restates Add services to the container."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Api/Program.cs"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"452c8ee96c445bd2457ad821aa717ff1e3990c8a54c9043963a2e25054db41e4"}},{"ruleId":"D24","level":"note","message":{"text":"redundant comment: \u0022public DateTime FechaInicio { get; set; }\u0022 \u2014 delete - the property declaration is self-evident"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/CuentaPlazoFijosClientes/Response/CuentaPlazoFijosClientesResponse.cs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"0469c52dd8d0cf80b13c011d2e9d093f3f7db804914161d1431c0c071d4da558"}}],"taxonomies":[{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d","organization":"MITRE","shortDescription":{"text":"The MITRE Common Weakness Enumeration (CWE)."},"taxa":[{"id":"CWE-1395","name":"Dependency on Vulnerable Third-Party Component"},{"id":"CWE-798","name":"Use of Hard-coded Credentials"}]}],"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}}}]}