{"$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":"D10","name":"Test Quality","shortDescription":{"text":"Test Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D10"},{"id":"D11","name":"Test Reliability","shortDescription":{"text":"Test Reliability"},"helpUri":"https://codehealth.canine.dev/dimensions/D11"},{"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":"D14","name":"License Compliance","shortDescription":{"text":"License Compliance"},"helpUri":"https://codehealth.canine.dev/dimensions/D14"},{"id":"D15","name":"Churn \u00D7 Complexity Hotspots","shortDescription":{"text":"Churn \u00D7 Complexity Hotspots"},"helpUri":"https://codehealth.canine.dev/dimensions/D15"},{"id":"D16","name":"Bus Factor","shortDescription":{"text":"Bus Factor"},"helpUri":"https://codehealth.canine.dev/dimensions/D16"},{"id":"D17","name":"Explicit Debt","shortDescription":{"text":"Explicit Debt"},"helpUri":"https://codehealth.canine.dev/dimensions/D17"},{"id":"D18","name":"Solution Shape","shortDescription":{"text":"Solution Shape"},"helpUri":"https://codehealth.canine.dev/dimensions/D18"},{"id":"D20","name":"ADR Quality","shortDescription":{"text":"ADR Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D20"},{"id":"D21","name":"Naming Consistency","shortDescription":{"text":"Naming Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D21"},{"id":"D22","name":"Internal API Consistency","shortDescription":{"text":"Internal API Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D22"},{"id":"D23","name":"Boundary Type-Coupling","shortDescription":{"text":"Boundary Type-Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D23"},{"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"]},{"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":"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 (21 lines \u00D7 2): Src/Apps/Records.Persons.BackgroundTasks/Program.cs:56-76 | Src/Apps/Records.Countries.BackgroundTasks/Program.cs:46-70 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060Src/Apps/Records.Persons.BackgroundTasks/Program.cs:56\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":"Src/Apps/Records.Persons.BackgroundTasks/Program.cs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"52b9cae7828dd4b004fbec8f536349affa165fd25aa9cd8d198cfdd77fef0649"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): Src/Apps/Records.Persons.BackgroundTasks/Tasks/PublishOutboxJob.cs:60-82 | Src/Apps/Records.Countries.BackgroundTasks/Tasks/PublishOutboxJob.cs:56-74 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060Src/Apps/Records.Persons.BackgroundTasks/Tasks/PublishOutboxJob.cs:60\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":"Src/Apps/Records.Persons.BackgroundTasks/Tasks/PublishOutboxJob.cs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dcf56c8f37c405155f847c36991e4599a8047a812ffe7728195f0c98f6cc2ba"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): Src/Apps/Records.Persons.Api.V1/HealthCheck/DependencyInjection.cs:27-40 | Src/Apps/Records.Countries.Api.V1/HealthCheck/DependencyInjection.cs:29-42 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060Src/Apps/Records.Persons.Api.V1/HealthCheck/DependencyInjection.cs:27\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":"Src/Apps/Records.Persons.Api.V1/HealthCheck/DependencyInjection.cs"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d416d7c12c76a10126a105d5d945c6fb602e4b6eb6ae09b3246c20535f7face"}},{"ruleId":"D5","level":"error","message":{"text":"Layer violation: Application \u2192 Infrastructure: Records.Countries.Application (Application) references Records.Shared.Infra.MessageBroker.MassTransit (Infrastructure) \u2014 dependencies must point inward (Web \u2192 Application \u2192 Domain; Infrastructure implements inner interfaces, nothing depends outward on it)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"3c58f0fbdc0254104a7b5363ce6a8e9c67bbae6d125023331fac968199f88988"}},{"ruleId":"D5","level":"error","message":{"text":"Layer violation: Application \u2192 Infrastructure: Records.Persons.Application (Application) references Records.Shared.Infra.MessageBroker.MassTransit (Infrastructure) \u2014 dependencies must point inward (Web \u2192 Application \u2192 Domain; Infrastructure implements inner interfaces, nothing depends outward on it)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"07d9acb987213a9cf1e904bba4e3d836caa375bfd262f129391b8d03bc72fcd3"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: My.System.Extensions: My.System.Extensions: abstractness 0.00, instability 0.00, distance 1.00 \u2014 zone of pain \u2014 concrete and depended on by 24 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"1d4231bd683e536534a14657dc3a040712ebc4baa2e113ce15b536839fa0ab19"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Records.Shared.Infra.Reads.DependencyInjection: Records.Shared.Infra.Reads.DependencyInjection: abstractness 0.00, instability 0.00, distance 1.00 \u2014 the shape a shared-kernel / building-block library has BY DESIGN \u2014 concrete and widely depended-on is what makes it useful, and this dimension does not penalise it (the distance is reported for completeness, not as a defect). Worth a look only if it has grown past one coherent kernel into an everything-bucket."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"8be66a601596551de3c3f928d6ae74f03b0a8f83488d6d49096af9e9f8a2b74f"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Records.Shared.Infra.Mappings.DependencyInjection: Records.Shared.Infra.Mappings.DependencyInjection: abstractness 0.00, instability 0.00, distance 1.00 \u2014 the shape a shared-kernel / building-block library has BY DESIGN \u2014 concrete and widely depended-on is what makes it useful, and this dimension does not penalise it (the distance is reported for completeness, not as a defect). Worth a look only if it has grown past one coherent kernel into an everything-bucket."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6f034c3e05fad0c2647b5a869f5b5152aed09de7dcc79a9a87c4f2e8ca11733c"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Records.Shared.Configuration: Records.Shared.Configuration: abstractness 0.00, instability 0.00, distance 1.00 \u2014 the shape a shared-kernel / building-block library has BY DESIGN \u2014 concrete and widely depended-on is what makes it useful, and this dimension does not penalise it (the distance is reported for completeness, not as a defect). Worth a look only if it has grown past one coherent kernel into an everything-bucket."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e6a61c981b3d281cd49e0393a37cffe7edfffb513399dfbee2653e71f5a75bb9"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Records.Shared.Infra.Quartz.DependencyInjection: Records.Shared.Infra.Quartz.DependencyInjection: abstractness 0.00, instability 0.00, distance 1.00 \u2014 the shape a shared-kernel / building-block library has BY DESIGN \u2014 concrete and widely depended-on is what makes it useful, and this dimension does not penalise it (the distance is reported for completeness, not as a defect). Worth a look only if it has grown past one coherent kernel into an everything-bucket."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e64860c4931268902201b964e5538e9fa6a6af62f0e3584d61028463ade1b900"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: My.Core.Exceptions: My.Core.Exceptions: abstractness 0.00, instability 0.00, distance 1.00 \u2014 zone of pain \u2014 concrete and depended on by 24 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"c8b00c5be97b448e697bafbb5396154c5b1adbef5689be96b55d87fd1a5b6005"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Records.Countries.Reads.Models: Records.Countries.Reads.Models: abstractness 0.00, instability 0.00, distance 1.00 \u2014 zone of pain \u2014 concrete and depended on by 3 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f7490be0618c5c80b00ee9453175822385c786754a9889a737ec40d6df600850"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Records.Shared.Infra.Swagger.Schemas: Records.Shared.Infra.Swagger.Schemas: abstractness 0.00, instability 0.00, distance 1.00 \u2014 the shape a shared-kernel / building-block library has BY DESIGN \u2014 concrete and widely depended-on is what makes it useful, and this dimension does not penalise it (the distance is reported for completeness, not as a defect). Worth a look only if it has grown past one coherent kernel into an everything-bucket."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"054f1563ef87bf77aac2d867720a1a9262e73187f668f32c8fd21d6dc50776f0"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: My.Data.InterceptableDbConnection: My.Data.InterceptableDbConnection: abstractness 0.00, instability 0.00, distance 1.00 \u2014 zone of pain \u2014 concrete and depended on by 13 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"cc66bf418b8501b4f82b4d05810d77a1ca16224f3a2ba5c5a8b87f1e7aee9316"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Records.Persons.Dtos: Records.Persons.Dtos: abstractness 0.00, instability 0.14, distance 0.86 \u2014 zone of pain \u2014 concrete and depended on by 6 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"7d493dbe317b80169c89e0570e8831934551692af350e17c1f2abd5fa8d102a1"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Records.Shared.Infra.Rop: Records.Shared.Infra.Rop: abstractness 0.17, instability 0.00, distance 0.83 \u2014 the shape a shared-kernel / building-block library has BY DESIGN \u2014 concrete and widely depended-on is what makes it useful, and this dimension does not penalise it (the distance is reported for completeness, not as a defect). Worth a look only if it has grown past one coherent kernel into an everything-bucket."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"579e676e26026a21464b0abc4a75cf6332a09a26146b3f0a7b02dc8e03b82f62"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Records.Shared.Infra.Swagger.DependencyInjection: Records.Shared.Infra.Swagger.DependencyInjection: abstractness 0.00, instability 0.17, distance 0.83 \u2014 the shape a shared-kernel / building-block library has BY DESIGN \u2014 concrete and widely depended-on is what makes it useful, and this dimension does not penalise it (the distance is reported for completeness, not as a defect). Worth a look only if it has grown past one coherent kernel into an everything-bucket."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"b7d948e4e11901a2bd31460908aab289c5254326511d3d17da8d616263e8c13a"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Records.Shared.Infra.Idempotence.Redis: Records.Shared.Infra.Idempotence.Redis: abstractness 0.00, instability 0.25, distance 0.75 \u2014 the shape a shared-kernel / building-block library has BY DESIGN \u2014 concrete and widely depended-on is what makes it useful, and this dimension does not penalise it (the distance is reported for completeness, not as a defect). Worth a look only if it has grown past one coherent kernel into an everything-bucket."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"0fc5546394a6ac933925c48d97786755f891a341f2115bb9975460714901b636"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Records.Countries.Dtos: Records.Countries.Dtos: abstractness 0.00, instability 0.25, distance 0.75 \u2014 zone of pain \u2014 concrete and depended on by 3 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"21f9740e1d2e33d05ddf4a4dde95a35742c1dc765bb97d708736b2d630ef6c63"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Records.Shared.Infra.Redis.DependencyInjection: Records.Shared.Infra.Redis.DependencyInjection: abstractness 0.00, instability 0.29, distance 0.71 \u2014 the shape a shared-kernel / building-block library has BY DESIGN \u2014 concrete and widely depended-on is what makes it useful, and this dimension does not penalise it (the distance is reported for completeness, not as a defect). Worth a look only if it has grown past one coherent kernel into an everything-bucket."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"2711405a7fe02d0edf51050ef8c08a46bb91ce5bc82a4828627113234cd9aa7c"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Records.Shared.Infra.Serilog.DependencyInjection: Records.Shared.Infra.Serilog.DependencyInjection: abstractness 0.00, instability 0.29, distance 0.71 \u2014 the shape a shared-kernel / building-block library has BY DESIGN \u2014 concrete and widely depended-on is what makes it useful, and this dimension does not penalise it (the distance is reported for completeness, not as a defect). Worth a look only if it has grown past one coherent kernel into an everything-bucket."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"0f4840cd735d13f516865310714de82a1556cf60f5749f70393cc1bb736c7b13"}},{"ruleId":"D12","level":"error","message":{"text":"Vulnerable: System.Data.SqlClient: System.Data.SqlClient 4.8.5 \u2014 High severity. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"60c18bdfb9bcb0c9e6645ce9a6a2dbec1c036f361f6e3e38e9fa51fbdebad14f"}},{"ruleId":"D12","level":"warning","message":{"text":"Deprecated: xunit: xunit 2.6.3 \u2014 Legacy \u2014 the publisher\u0027s replacement is \u0060xunit.v3\u0060; migrate the reference to it."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d37c8c0e8046c9e8358e976373216abfb78e9fdef63ed53d3edcaa7d2238edcd"}},{"ruleId":"D12","level":"warning","message":{"text":"Deprecated: Polly.Extensions.Http: Polly.Extensions.Http 3.0.0 \u2014 Legacy \u2014 the publisher\u0027s replacement is \u0060Microsoft.Extensions.Http.Resilience\u0060; migrate the reference to it."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"23aba0827d7bab20f94e121c373e019ddc2b3f6653656d4f36437b332de4b3cd"}},{"ruleId":"D16","level":"warning","message":{"text":"single-maintainer \u2014 knowledge-concentration (bus factor) risk: single-maintainer \u2014 knowledge-concentration (bus factor) risk (1 author(s) across 16 commit(s) sampled)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"b4b49d961df742f0e507f4cc5c8094fb077ba0391a27fd015d18320865187719"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Add a Retry policy. \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":"Src/Apps/Records.Countries.BackgroundTasks/Tasks/PublishOutboxJob.cs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e973402a4fd250666761051f1d633daed0a1d1cfc19aca4dc60664385695c86"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Add a Retry policy. \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":"Src/Apps/Records.Persons.BackgroundTasks/Tasks/PublishOutboxJob.cs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a4d5456539d1ccc75c4cfedd173b7275e7d41b92755ca7bd0a7691cd40506bf"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement a paged list. \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":"Src/Apps/Records.Persons.Api.V1/Persons/Controllers/GetPersons/GetPersonsController.cs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"c68789a5d8618ef050c32537908f4e4b68649c6f61b5c95746b4e35f645b6e28"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement the remaining validations. \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":"Src/Apps/Records.Persons.Api.V1/Persons/Validators/AddressValidator.cs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cffef9574bc94eb6bb056d4f711ed4f1f73711923fffa391ed7f278ecd788ea"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: ////RuleFor(x =\u003E x.Gender).NotNull().NotEmpty(); // TODO: Add enum and .IsInEnum(). \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":"Src/Apps/Records.Persons.Api.V1/Persons/Validators/PersonValidator.cs"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"972050f5823cd0d4a10131c1b6c3b326f3b74ab4f3219a0bf380eb2742b0f5f3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Handle the exception (log, revert, etc.). \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":"Src/Apps/Records.Persons.BackgroundTasks/Consumers/CountryCreatedConsumer.cs"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"04272cf88718b1fa382a5a7a3f14327bc02ecabcf28ffa7bfb8d462d1ebccb1f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Handle the exception (log, revert, etc.). \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":"Src/Apps/Records.Persons.BackgroundTasks/Consumers/CountryDeletedConsumer.cs"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bab67263e1041ac980be02ab45e73655ed98b7752f5d0f703c6e2def62aeaad"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Handle the exception (log, revert, etc.). \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":"Src/Apps/Records.Persons.BackgroundTasks/Consumers/PersonCreatedConsumer.cs"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a7098aa1644b2ec405b70eaddc37e3c6237422f1b33db46fc51f753a588490a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Handle the exception (log, revert, etc.). \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":"Src/Apps/Records.Persons.BackgroundTasks/Consumers/PersonDeletedConsumer.cs"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3523ee531553fe443908ccf3943b285ba0309347586189dd78ad2464b132882"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Handle the exception (log, revert, etc.). \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":"Src/Apps/Records.Persons.BackgroundTasks/Consumers/PersonUpdatedConsumer.cs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2b196b25f7ba9bb45f1ba0f910c2996f2519b517c00cd70689051ba9df2c555"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: /*\n            // Option 3: Build Jobs manually.\n            // TODO: Move this to an extension method for IScheduler.\n            // NOTE: Currently we are using \u0022Option 2\u0022 (registering the Jobs iterating the assembly with DI).\n            // Define el job.\n            IJobDetail job = JobBuilder.Create\u003CFirstJob\u003E()\n                .WithIdentity(nameof(FirstJob), \u0022group1\u0022)\n                .Build();\n\n            // Defines the trigger to be executed each 10 seconds.\n            ITrigger trigger = TriggerBuilder.Create()\n                .WithIdentity(nameof(FirstJob) \u002B \u0022-trigger\u0022, \u0022group1\u0022)\n                .StartNow()\n                .WithSimpleSchedule(x =\u003E x\n                    .WithIntervalInSeconds(10)\n                    .RepeatForever())\n                .Build();\n\n            // Associates the job to the scheduler.\n            await scheduler.ScheduleJob(job, trigger);\n            */ \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":"Src/Apps/Records.Persons.BackgroundTasks/Controllers/TasksSchedulerController.cs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba0bdc759133723cd644add920065f3f8e15e9f480d768d42514c2e4b0737b70"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/Services/Countries/Records.Countries.Application/Countries/Commands/CreateCountry/CreateCountryCommandHandler.cs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8a199d7397cd9972eb9c6313dd4625035ef627fb2915321a10fa2e166d270b9"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/Services/Countries/Records.Countries.Application/Countries/Commands/DeleteCountry/DeleteCountryCommandHandler.cs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d0ca4a3e5987d4b2884cec8c59935442c0f1d974716febd29e08cf26f881c7d"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/Services/Persons/Records.Persons.Infra.Persistence.Sql/Persons/Repositories/PersonRepository.cs"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"786990484a7ca5ea0511aca6722f0abbf31349debef0719bfa081e97069f6e77"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/Services/Shared/Records.Shared.Messaging/MessageMetadata.cs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcf459377a970be6bafb04bf4fc2212433642d2456aace991ed74534934f2823"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement business logic. \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":"Src/Services/Countries/Records.Countries.Application/Countries/Events/CountryCreated/CountryCreatedEventHandler.cs"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1fe1fbfb54602401e99126183f02b6fb0e07a35c4d5785dbfbc61ee6030241f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Use System.Uri not a string. \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":"Src/Services/Countries/Records.Countries.Domain/Countries/ValueObjects/CountryFlagUrl.cs"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"748af9bff1adc69908c5262ed18562dd5969bdd1d46295444882761da82f6d20"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/Services/Countries/Records.Countries.Infra.Persistence.Sql/Countries/Repositories/CountryRepository.cs"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"84aac899aaf60aa096e0f668514070f14f5ab453977431d778c85493c56ed2a0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: ////_personalAssets = ... // TODO: Update personalAssets separately by its own Update, not from here. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/Services/Persons/Records.Persons.Domain/Persons/Models/Person.cs"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"97b8a4ef710e9bb85cc6740dced7819c143fc14fe460c1b45a1eacb05b0c5c69"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement Gender enum. \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":"Src/Services/Persons/Records.Persons.Dtos/Persons/Person.cs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e9483f3ae633d2c9e95006d9326afb778bd5a57c7170bdc7220397adb1cb182"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //// TODO: Make a specific Update function for PersonalAssets. \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":"Src/Services/Persons/Records.Persons.Infra.Persistence.Sql/Persons/Repositories/PersonRepository.cs"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b82905ee0eabacdb87b4a5633b7e4cd44f309ce1eeb08dc648353b6c979f664"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/Services/Persons/Records.Persons.Infra.Persistence.Sql/Persons/Repositories/PersonRepository.cs"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"e67a27792dbaa018954f22d32009b576fdb6155c58ac7b881265ded333df750a"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/Services/Persons/Records.Persons.Infra.Projection.sql/Persons/Projectors/PersonUpdatedProjector.cs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd2f21264caec6589301cfbb7259e298062c737f3ca72983a6c3f1296c02f4bb"}},{"ruleId":"D17","level":"warning","message":{"text":"BareSuppressMessage: System.Diagnostics.CodeAnalysis.SuppressMessage \u2014 the suppression records no reason: either it carries no justification argument at all, or one that states nothing a reader can weigh (\u0022OK\u0022, \u0022By design\u0022). 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. Write what makes this site legitimately different \u2014 the invariant that holds, the framework contract that forces the shape \u2014 or remove the suppression and fix what it hides."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/Services/Shared/Records.Shared.Domain/Models/Enumeration.cs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"419911106ac82605132e9c8af79b24f3867aab41c2f6014c3d1cf9f774905c4e"}},{"ruleId":"D17","level":"warning","message":{"text":"BareSuppressMessage: System.Diagnostics.CodeAnalysis.SuppressMessage \u2014 the suppression records no reason: either it carries no justification argument at all, or one that states nothing a reader can weigh (\u0022OK\u0022, \u0022By design\u0022). 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. Write what makes this site legitimately different \u2014 the invariant that holds, the framework contract that forces the shape \u2014 or remove the suppression and fix what it hides."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/Services/Shared/Records.Shared.Infra.Rop/Maybe.cs"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"0eb19e163e48d134a17de7d8069a40a6c13842df6b793c711416a93578fbead4"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 7 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/Services/Shared/Records.Shared.Infra.Swagger.Schemas/SwaggerSchemaExampleFilter.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"91312454bfed94b4096dd0cce97d88debbe9ca18bfcce8ceaeb87093a776bf7d"}},{"ruleId":"D17","level":"error","message":{"text":"NoWarnInCsproj: 1591 \u2014 this warning is switched off for the WHOLE project, in every file it builds, including code written years from now: nothing at the call site records that the rule was ever silenced, so the next reader has no reason to look here. Fix what the rule is reporting and drop the code from the list, or \u2014 if some occurrences really are legitimate \u2014 narrow the suppression to those sites and give each one its reason, so the rule keeps protecting the rest of the project."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/Services/Persons/Persons.Tests.UnitTests/Persons.Tests.UnitTests.csproj"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ec382d4f90cab05a6671dd3269b559f72165e7a58754f3a87aba87a93f46bfb"}},{"ruleId":"D17","level":"error","message":{"text":"NoWarnInCsproj: 1591 \u2014 this warning is switched off for the WHOLE project, in every file it builds, including code written years from now: nothing at the call site records that the rule was ever silenced, so the next reader has no reason to look here. Fix what the rule is reporting and drop the code from the list, or \u2014 if some occurrences really are legitimate \u2014 narrow the suppression to those sites and give each one its reason, so the rule keeps protecting the rest of the project."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/Services/Persons/Persons.Tests.ArchitectureTests/Persons.Tests.ArchitectureTests.csproj"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f2c9662ded38d777b3f5ce1e06ef67418280da76a5d03695faeb12a708736c2"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: LoadSettings: Method LoadSettings \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/Services/Persons/Records.Persons.Application/Persons/Commands/CreatePerson/CreatePersonCommandHandler.cs"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"01cf3a4b2f2c7292aa7ea1a3704425293341ef2757a43e01d762af5136a4f426"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: PersonMapperConfig: NamedType PersonMapperConfig \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/Services/Persons/Records.Persons.Infra.Persistence.Sql/Persons/Mappers/PersonMapperConfig.cs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"73466a22679994576cefd9e7e1f8364b40cc12917ab450c7e2395b2c1bd8e031"}},{"ruleId":"D18","level":"note","message":{"text":"Shell project: Records.Shared.Infra.Persistence.Mappings.Abstractions: \u0060Records.Shared.Infra.Persistence.Mappings.Abstractions\u0060 contributes only 8 significant line(s) \u2014 an empty/placeholder project is structural noise. Remove it or fold its contents into a real project."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/Services/Shared/Records.Shared.Infra.Persistence.Mappings.Abstractions/Records.Shared.Infra.Persistence.Mappings.Abstractions.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"89af1df06fecf6cd6f42bb0941070c1cc7b6bfc729a190e6a27d07fbc20dd36b"}},{"ruleId":"D18","level":"note","message":{"text":"Shell project: Records.Shared.IntegrationEvents.Abstractions: \u0060Records.Shared.IntegrationEvents.Abstractions\u0060 contributes only 7 significant line(s) \u2014 an empty/placeholder project is structural noise. Remove it or fold its contents into a real project."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/Services/Shared/Records.Shared.IntegrationEvents.Abstractions/Records.Shared.IntegrationEvents.Abstractions.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"93692fa32787ef77632b9fdd99de86612a57f85e81bdaf1f9c7e20f0e29c3271"}},{"ruleId":"D18","level":"note","message":{"text":"Shell project: Records.Countries.Reads.Models: \u0060Records.Countries.Reads.Models\u0060 contributes only 8 significant line(s) \u2014 an empty/placeholder project is structural noise. Remove it or fold its contents into a real project."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/Services/Countries/Records.Countries.Reads.Models/Records.Countries.Reads.Models.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7bfebb04ed8292ddb22d6072421694cc1140ee58114887572f706ea2bdfd718"}},{"ruleId":"D18","level":"note","message":{"text":"Thin analysable surface across projects: 25 project(s) carry only a thin slice of real code (e.g. \u0060Records.Shared.Infra.MessageBroker.Abstractions\u0060 with 11 significant line(s)). The mean analysable-surface weight is 73 %, lowering Solution Shape by about 2.18 point(s). Consolidate thin projects or grow them into substantial, well-scoped assemblies."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"dd0b92fd965c2065080f16843920964ee00f7696ea03d87cdf61aed4cd2c746a"}},{"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":"Inconsistent naming for the Country projector interface/implementation. The interface is named \u0027ICountryCrearedProjector\u0027 (typo: \u0027Creared\u0027 instead of \u0027Created\u0027), while the SQL implementation is named \u0027CountryProjector\u0027. Other projectors follow the pattern \u0027XProjector\u0027 (e.g., PersonProjector, PersonDeletedProjector).: Rename \u0027ICountryCrearedProjector\u0027 to \u0027ICountryProjector\u0027 to match the \u0027XProjector\u0027 convention and fix the typo. (symbols: Records.Persons.Projection.Countries.Projectors.ICountryCrearedProjector, Records.Persons.Infra.Projection.sql.Countries.Projectors.CountryProjector, Records.Persons.Infra.Projection.sql.Persons.Projectors.PersonProjector)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"2aa4e13a964b91ace7a2ff0954b30f920ecb9423ec5fda63fad9d592ea47b159"}},{"ruleId":"D21","level":"note","message":{"text":"Inconsistent naming for the database session abstraction. It is referred to as \u0027IDbSession\u0027 in some places, while the unit of work is \u0027IUnitOfWork\u0027. Additionally, \u0027IDbSession\u0027 is used for what appears to be a database session/transaction scope, but the naming is not consistent with \u0027IUnitOfWork\u0027 or \u0027ISession\u0027.: Consider renaming \u0027IDbSession\u0027 to \u0027ISession\u0027 or \u0027IUnitOfWork\u0027 to align with common ORMs (like NHibernate/Entity Framework) or to match the \u0027IUnitOfWork\u0027 naming convention. (symbols: Records.Shared.Infra.Persistence.Abstractions.IDbSession.Connection, Records.Shared.Infra.Persistence.Abstractions.IEntitySoftDeletable.DeletedOnUtc, Records.Shared.Infra.Persistence.Abstractions.IEntityAuditable)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4388d7e027f355228103060558136bbd03997fe0b507e9b6376b4946a77c51f1"}},{"ruleId":"D22","level":"warning","message":{"text":"Redundant error representation types. Both types expose ErrorCode/Code, Message, and LogId/LogId properties. ErrorResponse adds HTTP status and timestamp, but the core error payload is duplicated.: Unify into a single ErrorDto/ErrorResponse structure or ensure one is strictly for HTTP responses and the other for internal use, but the naming and property overlap (Code/Message/LogId) is confusing. (signatures: ErrorDto | ErrorResponse)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"893838a71ddd1ece202ca367f4c8dc487cb977738d4c6d290512379acfefcf94"}},{"ruleId":"D22","level":"warning","message":{"text":"Inconsistent naming for the payload property. CreatePersonRequest and UpdatePersonRequest expose the entity as \u0027Person\u0027, while CreateCountryRequest exposes it as \u0027Country\u0027. This breaks the pattern where the property name matches the entity type name.: Rename the payload property in CreateCountryRequest to \u0027Country\u0027 for consistency, or rename all to a generic \u0027Entity\u0027 or \u0027Data\u0027 if the pattern is intentional. (signatures: CreatePersonRequest | UpdatePersonRequest | CreateCountryRequest)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ac9263b688a4611ed4e9e1131ac907a4487f8b0c7b9333cfae30cf151fb01d75"}},{"ruleId":"D23","level":"note","message":{"text":"Bounded contexts not declared: At 14216 LoC spread over 63 projects the codebase is both large and multi-module, so explicit bounded contexts are warranted. Name this codebase\u0027s bounded contexts (\u22652 module groups, e.g. per subsystem) so cross-boundary type coupling can be assessed. Declare them in \u0060.codehealth/config.yaml\u0060 at the repository root (create it if absent), mapping each context name to the module-path or namespace prefixes that belong to it \u2014 e.g. \u0060architecture:\u0060 \u2192 \u0060contexts:\u0060 \u2192 \u0060Billing: [\u0022src/billing\u0022, \u0022Acme.Billing\u0022]\u0060, \u0060Catalog: [\u0022src/catalog\u0022, \u0022Acme.Catalog\u0022]\u0060."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"1c7e276c9c682731f01819ed5378b90ca320cde1b583c90920172911598362b3"}},{"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":"3f24cd2d7437babffa17560a4abd3ebb43f76493c23e407417ec053405a413cb"},"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":"8f5ae33b2327d67190726ad3a3eebbe8b6555a1e9743ad10ef571723307f32ed"},"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":"1b0de3f7c33a4cc8a15a0733f05138b63c52e3dbd57aff16a07a7e3d01e09164"},"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":"116b4edbad9dcccaf0649fbc0cadfe609a1dbbabe57b72442175a1c54e731172"},"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":"5230e3784625494640dce8f42504fcea057f4161772eb9faf8add2f7104038b8"},"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":"21fb7b0f0caacef12f470df760ea77b743af471f50708245a694360ae88f4d96"},"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":"bc5a014a7e87de62e79b2bea785324796e3c35368639f416e718292b4caadb69"},"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":"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":"7cf85abffe732f2645ef95a624d6badc26f0263616284d6a4cc46ca8e983031d"}},{"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":"66739fc535dc739310380d4353903dbd2fc06e1625ed1b865cd13eb1aeab27aa"}},{"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":"b96b7173c4377d5bea4d6fd7b52323631c631c44172b743bec6f266c10a4e538"}},{"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":"a9fd6c4f13eca413e6ee281165116f5d3103d0f420a58f7e31ac0f01002a05c3"}},{"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":"9b95c7f70b5ad8865f097e370868df43e0f61bc9dc4fee12b1725c6895e596c0"}},{"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":"b74ed2402a32a3483f0222438e364162079e47e69d6fc647f12c48e4e51634de"}},{"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":"9b1edc6c5709bced9c1610ceea5038d37f22592f9e1b77be60513c55be5f6020"}},{"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":"e462fef9aabfaf16192972b3a92d63269bb117e199b266a6bab6beff8f5de4ab"}},{"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":"03b31df8570933308505a1624e4fd5ee0390537c65b94f5898a4ad85f2c0b177"}},{"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":"03f9fac878dcbf07aca7022f18e373fffff3a6521448932b27c09f1f7c846066"}},{"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":"068575b070ffb9472759a5be2e330d4c53d1995ff99ab12cb083c0e36c781f83"}},{"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":"f0283fefd69ded207beb5469b27e465d9c8060dc2c965c70204f65b73a4446e9"}},{"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":"864002a5a4fc44333de574ab02e4076c626972c76f4d49734f161b89e756b2a0"}},{"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":"3fb6a12e421f7fa26dc1470556d407b789244bd8b07c4998700452fed0de7e46"}},{"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":"64dd3aba16c3a5a0b32399095f5bfe94002e75a9d7a1f4c2b124e9d4ed889c72"}},{"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":"e14bc49e3da5098944724e7293e975f3a9a8c38ddf73092f4335eaa16ba45952"}}],"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-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-259","guid":"ae9ad959-fbb6-9d5e-892d-3dca66da0b69","name":"Use of Hard-coded Password","shortDescription":{"text":"Use of Hard-coded Password"},"helpUri":"https://cwe.mitre.org/data/definitions/259.html"},{"id":"CWE-353","guid":"09d7e902-d4ee-f05d-ae6c-0a1554d0c18f","name":"CWE-353","shortDescription":{"text":"CWE-353"},"helpUri":"https://cwe.mitre.org/data/definitions/353.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-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":23,"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."]}]}