{"$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":"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":"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":"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":"D32","name":"Data Compliance (PII/GDPR)","shortDescription":{"text":"Data Compliance (PII/GDPR)"},"helpUri":"https://codehealth.canine.dev/dimensions/D32","relationships":[{"target":{"id":"CWE-359","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-312","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-200","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-359","CWE-312","CWE-200"]}},{"id":"D35","name":"Change Coupling","shortDescription":{"text":"Change Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D35"}]}},"results":[{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Transversal: Transversal: abstractness 0.25, instability 0.00, distance 0.75 \u2014 zone of pain \u2014 concrete and depended on by 2 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6fc76b07791f73d95a8ebfc91309f4c9f149b5b2a0ab5394b554b97e718a7082"}},{"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":"single-maintainer \u2014 knowledge-concentration (bus factor) risk: single-maintainer \u2014 knowledge-concentration (bus factor) risk (1 author(s) across 21 commit(s) sampled)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"b4b49d961df742f0e507f4cc5c8094fb077ba0391a27fd015d18320865187719"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 5 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/EngineAPI/Controllers/AboutController.cs"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"933c7555fe3dd53e325a65557a77f9afb687eff4f4b8d38f2eaef8bb2cdc9962"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: Verify the correct work of this \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/EngineAPI/Controllers/AccountController.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b2a32baefe44e0c59d08a84068206eac4b1ed202252bff7cc560ca39cc79d6d"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/EngineAPI/Controllers/AccountController.cs"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"d109fbf57254332886452be64e9eda98a08d2b582dd3a80d79981a050f82d78f"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/EngineAPI/Controllers/AppBaseController.cs"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"020caf843fb50e594a8861fcf9a1ddeb867f9d6d671260d3145f973a0c51e1ee"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/EngineAPI/Startup.cs"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3d498194d5ba0a8c49bc63d855300b85fa110cc99d071f3802d46121dff39d8"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/EngineAPI/Utils/AzureStorageSaver.cs"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"e85eef94283d844920d3913d89d25af58ecbe16d42eb5128acf1221f3b9cb6ca"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/EngineAPI/Utils/AzureStorageSaver.cs"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b97150b0c9eb360b30762feae1398ccaf82e092ac1229142c82ea380b960b54"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/EngineAPI/Utils/AzureStorageSaver.cs"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"24318c26cf98d26432fd7b057c368e8e7f74d53a79d3213bb00bebc469594f22"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/EngineAPI/Utils/AzureStorageSaver.cs"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f8b4c43cdb6634a3bdce2af8de579649b536f95c7f8343ebfa35c995f7778b8"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/EngineAPI/Utils/AzureStorageSaver.cs"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"75d780f82a19085099e7747a6d9867976830b5c728b36230d687b91ffc6fe3e2"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 10 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/EngineAPI/Controllers/AccountController.cs"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bf98d74ba05e485c3f4749c7bc60cb668ca5a4fc707b695cc419df0f48e90a8"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/EngineAPI/Utils/AzureStorageSaver.cs"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd784ae6c1c27510a6fc892f40fcb99c4436e65bb68a7989e46822053040fb37"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/Transversal/Extensions/CurrentUserFactory.cs"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcc2a6cbeaf41c68ec314a82b9acb103cb75a8f71c8bf7a41a123a4d7b2cd6b0"}},{"ruleId":"D18","level":"warning","message":{"text":"Monorepo: only 1 of 3 solutions was scored: This repository contains 3 .NET solutions, but a scan analyzes ONE. Every score, lens, and finding here reflects only \u0060Src/EngineAPI/EngineAPI.sln\u0060 \u2014 the other 2 (\u0060Src/BgServicex/BgServicex.sln\u0060, \u0060Src/WorkerService/WorkerService.sln\u0060) were not analyzed and are not represented in the headline. To cover them, scan each solution as its own target and group them in a Solution or Product for a portfolio roll-up. If a secondary solution is an archived or vendored tree, declare it \u2014 \u0060.gitattributes\u0060 (\u0060path/** linguist-vendored\u0060) or \u0060.editorconfig\u0060 (\u0060[path/**] generated_code = true\u0060) \u2014 to exclude it from discovery the same way generated code is."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"447bb11e4227696119972b805fcb72d3ced918b47fcda508d1efcfafe347e404"}},{"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 ViewModel/DTO/Response classes. The codebase mixes suffixes: some use \u0027ViewModel\u0027, some \u0027Request\u0027, some \u0027Response\u0027, and some have no suffix or use \u0027DTO\u0027. For example, password reset uses both \u0027ResetPasswordRequest\u0027 and \u0027ResetPasswordViewModel\u0027.: Standardize on a single suffix per category: \u0027ViewModel\u0027 for UI models, \u0027Request\u0027 for API inputs, \u0027Response\u0027 for API outputs, and \u0027DTO\u0027 for data transfer objects. (symbols: EngineAPI.Models.LoginViewModel, EngineAPI.Models.RegisterViewModel, EngineAPI.Models.ResetPasswordRequest, EngineAPI.Models.ResetPasswordViewModel, EngineAPI.Models.ForgotPasswordRequest, EngineAPI.Models.VerifyEmailRequest, EngineAPI.Models.AuthenticateResponse, EngineAPI.Models.UserManagerResponse, EngineAPI.Models.RefreshToken, EngineAPI.Models.Account, EngineAPI.Models.FileStorageResponse, EngineAPI.Models.Response)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"825bc29b21eba29b6149e4744d7a994bbe37d0b2dbc9b4579c474cc2ad1df8f0"}},{"ruleId":"D21","level":"note","message":{"text":"Inconsistent method naming convention in AccountService. Some methods use camelCase (sendVerificationEmail) while others use PascalCase (RegisterUserAsync, ResetPasswordAsync, ConfirmEmailAsync). Additionally, some methods are synchronous (send...) while others are explicitly async (Async suffix).: Adhere to a single casing convention (prefer PascalCase for public methods) and consistent async naming (use \u0027Async\u0027 suffix for all asynchronous methods). (symbols: EngineAPI.Services.AccountService.sendVerificationEmail, EngineAPI.Services.AccountService.sendAlreadyRegisteredEmail, EngineAPI.Services.AccountService.sendPasswordResetEmail, EngineAPI.Services.AccountService.generateRefreshToken, EngineAPI.Services.AccountService.removeOldRefreshTokens, EngineAPI.Services.AccountService.RegisterUserAsync, EngineAPI.Services.AccountService.ResetPasswordAsync, EngineAPI.Services.AccountService.ConfirmEmailAsync)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"94746321208fe7f89062cec6dd114815fe14b8322feef087ab84e1d75aafbc9d"}},{"ruleId":"D21","level":"note","message":{"text":"Inconsistent naming for storage managers. The interface is \u0027IStorageManager\u0027, but the implementations are \u0027AzureStorageManager\u0027 and \u0027LocalStorageManager\u0027. This is actually consistent with the interface, but the interface name \u0027IStorageManager\u0027 is generic compared to the specific implementations.: This is consistent, but consider if \u0027IStorageManager\u0027 is too generic. However, the main inconsistency is in the method names within these classes. (symbols: EngineAPI.Utils.AzureStorageManager, EngineAPI.Utils.LocalStorageManager, EngineAPI.Utils.IStorageManager)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"83a9b4cec44d11f0d6d01f4ddbb7420fc828256bef71e11add981b236f922676"}},{"ruleId":"D21","level":"note","message":{"text":"Inconsistent method naming for storage operations. \u0027UploadBlobAsync\u0027 is used for uploads, but \u0027DeleteBlobAsync\u0027 and \u0027DeleteFile\u0027 are used for deletions. One uses \u0027Blob\u0027 and the other \u0027File\u0027.: Standardize on either \u0027Blob\u0027 or \u0027File\u0027 for all storage operations. Given the Azure context, \u0027Blob\u0027 might be more accurate, but \u0027File\u0027 is more generic. Pick one and apply it consistently. (symbols: EngineAPI.Utils.AzureStorageManager.UploadBlobAsync, EngineAPI.Utils.LocalStorageManager.UploadBlobAsync, EngineAPI.Utils.LocalStorageManager.DeleteBlobAsync, EngineAPI.Utils.LocalStorageManager.DeleteFile)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"7bd58c6cea4477a31d6d62e3fc6b6bd1cc78e93cbe80776dae3386201d8beb82"}},{"ruleId":"D21","level":"note","message":{"text":"Inconsistent naming for unique identifiers. Some entities use \u0027Id\u0027 (Account, EventFile), while others use \u0027Identification\u0027 (ApplicationUser). This suggests \u0027Identification\u0027 might be a business key or a different type of ID.: If \u0027Identification\u0027 is a unique identifier, rename it to \u0027Id\u0027 or \u0027UniqueKey\u0027 consistently. If it\u0027s a different concept, ensure the name reflects that (e.g., \u0027BusinessKey\u0027). (symbols: EngineAPI.Models.Account.Id, Domain.Entities.ApplicationUser.Identification, Domain.Entities.ApplicationUser.StoreCode, Domain.Entities.Image.ImageFullPath, Domain.Entities.Image.TypeId, Domain.Entities.Image.Container, Domain.Entities.ImageType.Name, Domain.Entities.EventFile.Id, Domain.Entities.ApplicationUser.Identification)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"22abfbf2ad9518fb361d2fcd1e352b5012b06e061c79aa5bfe8255a41b4c4a2a"}},{"ruleId":"D21","level":"note","message":{"text":"Inconsistent naming for audit fields. Some are simple (Updated, CreatedBy), while others include the entity name (DeletedUser, CreatedUser). Also, \u0027Deleted\u0027 is a boolean or status, while \u0027DeletedUser\u0027 is a string/ID.: Standardize audit field names. Use \u0027CreatedBy\u0027, \u0027CreatedAt\u0027, \u0027UpdatedBy\u0027, \u0027UpdatedAt\u0027 consistently. For soft delete, use \u0027IsDeleted\u0027 or \u0027DeletedAt\u0027 rather than \u0027Deleted\u0027. (symbols: EngineAPI.Models.Account.Updated, Domain.Helpers.AuditEntity.CreatedBy, Domain.Helpers.AuditEntity.CreatedAt, Domain.Helpers.AuditEntity.Deleted, Domain.Helpers.AuditEntity.DeletedUser, Domain.Helpers.AuditEntity.UpdatedAt, Domain.Helpers.AuditEntity.CreatedUser)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"2ac441de6c0eb48a75cf2d869afe10deb2f16607d677e94ec8caa3304a3a57f1"}},{"ruleId":"D21","level":"note","message":{"text":"Inconsistent naming for properties in RegisterViewModel. \u0027ConfirmPassword\u0027 and \u0027Password\u0027 are clear, but \u0027ImageFile\u0027 and \u0027Identification\u0027 are less consistent with the rest of the codebase which often uses \u0027Id\u0027 or \u0027Identification\u0027 for different concepts.: Ensure all view models use consistent property naming. If \u0027Identification\u0027 is a business key, consider \u0027BusinessKey\u0027 or \u0027Id\u0027 if it\u0027s a unique identifier. (symbols: EngineAPI.Models.RegisterViewModel.ConfirmPassword, EngineAPI.Models.RegisterViewModel.Password, EngineAPI.Models.RegisterViewModel.ImageFile, EngineAPI.Models.RegisterViewModel.Identification)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ac6e58ab02da10fec2d44c8ea4ead2b2bf6de074b4c8ccc4ad923140ce373de2"}},{"ruleId":"D27","level":"note","message":{"text":"Scattered collaborators: 98 % of calls cross a namespace and only 18 % of collaborators are co-located \u2014 group each feature\u0027s code into a vertical slice so a call\u0027s collaborators sit together."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"5aad4a4530bac3928d3a065a664be89d023ecfc865f9bf79ac05754b3bffe322"}},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"cac0e34682370af3b2e9cae531b6dbc3ebbdac1675e5d1fa2acba011735a2901"},"taxa":[{"id":"CWE-22","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e452b42c541318b9876dd1b205fe52c554a6c9d9f3ba3bb667a5fd9bbf8aa8b7"},"taxa":[{"id":"CWE-22","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":"1f79a595d62add568feda19f54d04fdad0273f072ae213a4e4ad714127a8a2fe"}},{"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":"4e4448b31e8b4dd1a6489e264df38146de5afb770ee8e6556d999f07ae5800a8"}},{"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":"9ae15deacd8d65304febbc4286307d74123e6c6fe9b7a2d543fbda4f0528528a"}},{"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":"81d70374024ff22e11cf5598879a317ed70ee1bc2d998f8f8933659faa3ca8ec"}},{"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":"30d58bfb3c5b5381b099fe7c7213473404221cdaeb03235cb29287f6c9f0bb44"}},{"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":"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":"c285e2b79f70af256277e99c077e8ccf9280f25f8414c2ccfb6fecd6ab647ec6"}},{"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":"a9653925032ff73b16e8a29cbdb16aac1644d1365c0fdab5c116a922fd267472"}},{"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":"2cf9abdfe20886dbfe9ca1bdf4a774c1b9b4b444e4d72eb2ee5fc7780d8359bc"}},{"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":"b636c797e667abc99114d8220722f875ade9271729ede99cfa215fdf96631226"}},{"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":"304301a202a6c056b222cf7d4a3c7740dc6c4e871fc7b937e61de142485e8406"}},{"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":"9c2c519bd1deb6091fcf575a024dfad3a0f38a7acc26d448a3bf376cc33ca600"}},{"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":"19438624c5cdcef3d5c1e2851ac580bfbe3d4f14a2b62ebcd99ac2b6622b8ab3"}},{"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":"cda197eebdd5a421587b43c1b7ee5a2a78ba24ea8ebc08247f3a8f8c25338ed0"}},{"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":"486e2d43aa26452cff8350614c638572e2f6b2144e4c21c889261cc491fda68e"}},{"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":"f279c68f84071f768f46e3141c2a4f2b2892ba451ad501390510048f64b35f49"}},{"ruleId":"D32","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":"9e27c0b426265e9eae2a6055f461ae4320e8bfe33b5de5df6474ce3c2d6f4ca6"}}],"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-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-200","guid":"b0ce3b1d-7a29-fe50-8aab-9aba899d2988","name":"Exposure of Sensitive Information to an Unauthorized Actor","shortDescription":{"text":"Exposure of Sensitive Information to an Unauthorized Actor"},"helpUri":"https://cwe.mitre.org/data/definitions/200.html"},{"id":"CWE-22","guid":"b68d9ca7-bdde-d057-a6cc-9f8b1e739552","name":"CWE-22","shortDescription":{"text":"CWE-22"},"helpUri":"https://cwe.mitre.org/data/definitions/22.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-312","guid":"96724ece-b0b2-a45c-83f9-0869fa3f6bea","name":"Cleartext Storage of Sensitive Information","shortDescription":{"text":"Cleartext Storage of Sensitive Information"},"helpUri":"https://cwe.mitre.org/data/definitions/312.html"},{"id":"CWE-359","guid":"b7dfe5b0-0351-645b-a311-b936102c2929","name":"Exposure of Private Personal Information to an Unauthorized Actor","shortDescription":{"text":"Exposure of Private Personal Information to an Unauthorized Actor"},"helpUri":"https://cwe.mitre.org/data/definitions/359.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":20,"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."]}]}