{"$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"]}]},{"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":"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"]}]},{"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":"D31","name":"IaC \u0026 Container Security","shortDescription":{"text":"IaC \u0026 Container Security"},"helpUri":"https://codehealth.canine.dev/dimensions/D31"},{"id":"D34","name":"Knowledge Freshness","shortDescription":{"text":"Knowledge Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/D34"},{"id":"D35","name":"Change Coupling","shortDescription":{"text":"Change Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D35"},{"id":"D39","name":"IL Efficiency","shortDescription":{"text":"IL Efficiency"},"helpUri":"https://codehealth.canine.dev/dimensions/D39"}]}},"results":[{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/Backend/MyRecipeBook.Infrastructure/Migrations/DatabaseMigration.cs:31-40 | src/Backend/MyRecipeBook.Infrastructure/Migrations/DatabaseMigration.cs:50-59"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Backend/MyRecipeBook.Infrastructure/Migrations/DatabaseMigration.cs"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5f528f3728fbb0fe073c97e92d8e3a26a2d698f0571cb7226abe4831dcb59b7"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: MyRecipeBook.Communication: MyRecipeBook.Communication: abstractness 0.00, instability 0.00, distance 1.00 \u2014 zone of pain \u2014 concrete and heavily depended-on, so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"10e678c8ecd294f41b82c2a537410d177df438b030c8cae80f24c723d0e0cb2a"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: MyRecipeBook.Exceptions: MyRecipeBook.Exceptions: abstractness 0.13, instability 0.00, distance 0.88 \u2014 zone of pain \u2014 concrete and heavily depended-on, so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"c77a8c5c8f76adc73dea1fe63a3df08460808432d35a98b52a7e8e23771acf7e"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: MyRecipeBook.Infrastructure: MyRecipeBook.Infrastructure: abstractness 0.13, instability 0.17, distance 0.71 \u2014 zone of pain \u2014 concrete and heavily depended-on, so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"29a5fa96d0270661f4f6b2af66d6b0b8cb3aabc256da26be34f7c12a4631f236"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: DependencyInjectionExtension.cs: 44.3% line coverage (94/212)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Backend/MyRecipeBook.Infrastructure/DependencyInjectionExtension.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0604a0ed63911995f0d9a1eb51c5f29e7a1ea409594626663d984f2d8444b81f"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: AzureStorageService.cs: 0.0% line coverage (0/8)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Backend/MyRecipeBook.Infrastructure/Services/Storage/AzureStorageService.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"39550d0cd11519cb09c64c463b31f94b63f79f3a7e7cf6d308e645bc31b309d0"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: DeleteUserProcessor.cs: 0.0% line coverage (0/10)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Backend/MyRecipeBook.Infrastructure/Services/ServiceBus/DeleteUserProcessor.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d99e3966cb8bc640e6681215edc7cd1f4764fecf5317d777d247f79f8655f85"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: DeleteUserQueue.cs: 0.0% line coverage (0/8)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Backend/MyRecipeBook.Infrastructure/Services/ServiceBus/DeleteUserQueue.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0e7efebdc444309e368ac2e2ac14cd8f47154e374d6c584d726714d1d024116"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: DatabaseMigration.cs: 0.0% line coverage (0/66)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Backend/MyRecipeBook.Infrastructure/Migrations/DatabaseMigration.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"013a02de6d665737efb8c1048bf86bdb9e7f38f92baf99cee16d5d4aff761b58"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: Version0000001.cs: 0.0% line coverage (0/14)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Backend/MyRecipeBook.Infrastructure/Migrations/Versions/Version0000001.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fbd8fe8af0b78be9ab4edfce39ca7dfe99498961d1c84abdb5963ba5da7b926"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: Version0000002.cs: 0.0% line coverage (0/40)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Backend/MyRecipeBook.Infrastructure/Migrations/Versions/Version0000002.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb62cbfe7519c637a627316dc245fb5d24bc5780e93230c2777df0a34a24372a"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: Version0000003.cs: 0.0% line coverage (0/6)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Backend/MyRecipeBook.Infrastructure/Migrations/Versions/Version0000003.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"75750bf5c85ba3ac864001a6def4b735f73b7b8c6a4d6a7017e80b1906646430"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: Version0000004.cs: 0.0% line coverage (0/10)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Backend/MyRecipeBook.Infrastructure/Migrations/Versions/Version0000004.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c6a1555b7c0a211bd4acce599541cf42728eca6e7da5da6e621b97d5cf337eb"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: VersionBase.cs: 0.0% line coverage (0/12)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Backend/MyRecipeBook.Infrastructure/Migrations/Versions/VersionBase.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"40d1b540c81096b11496bb4eb643b194f523c872f0095d9b204803d709b44284"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: ConfigurationExtension.cs: 9.1% line coverage (2/22)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Backend/MyRecipeBook.Infrastructure/Extensions/ConfigurationExtension.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bb75f6772c1d9b08150aa431b48e0eae6c8d895f6916a711007b246e3d7a6e8"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: Program.cs: 46.4% line coverage (64/138)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Backend/MyRecipeBook.API/Program.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a918d227413b78f4e9c04cb33ceb07b06d5f321bf709747b989350f50db66bdd"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: IdsFilter.cs: 0.0% line coverage (0/52)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Backend/MyRecipeBook.API/Filters/IdsFilter.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"59fcdac162ea30c1f2aa8e6af378f652386d63ed25b0d22166e7109191556d3f"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: MyRecipeBookBaseController.cs: 0.0% line coverage (0/10)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Backend/MyRecipeBook.API/Controllers/MyRecipeBookBaseController.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c2f33ee1b79adf470dffc8b82c1aadde906e88469c4700653670c6135a1a0dd"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: DeleteUserService.cs: 0.0% line coverage (0/12)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Backend/MyRecipeBook.API/BackgroundServices/DeleteUserService.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b39f30feed14e1ade0bac2f63e8f8ab6b63404f97a0bb140927af3bb7e4ddc6b"}},{"ruleId":"D8","level":"warning","message":{"text":"CRAP 42: IdsFilter.Apply: Cyclomatic 6 with 0.0% file coverage \u2014 too complex for how untested it is (CRAP = CC\u00B2\u00B7(1\u2212cov)\u00B3 \u002B CC; \u226530 needs tests or simplification)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Backend/MyRecipeBook.API/Filters/IdsFilter.cs"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6a1d02d4e8b60b2c4aac7b43598106c162ec96bde747d1f48f8176c8d6d9cf6"}},{"ruleId":"D12","level":"error","message":{"text":"Vulnerable: AutoMapper: AutoMapper 13.0.1 \u2014 High severity. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"7ad907f4096422e42924a00fab6889d83782c07f3031eeb825e84a391fcadb56"}},{"ruleId":"D12","level":"warning","message":{"text":"Deprecated: xunit: xunit 2.9.2 \u2014 Legacy xunit.v3 \u003E= 0.0.0"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d37c8c0e8046c9e8358e976373216abfb78e9fdef63ed53d3edcaa7d2238edcd"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #1: If anonymized user #1 becomes unavailable, 10 significant file(s) lose their only recent owner (largest: src/Backend/MyRecipeBook.Infrastructure/DependencyInjectionExtension.cs). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"66c3e8f31a2828105974ec65a72d9587a266fc9e5af5c10a3f1c164523d348c4"}},{"ruleId":"D19","level":"note","message":{"text":"The README describes itself but does not link to a Getting Started, installation, or prerequisites section.: Add a short \u0027Getting Started\u0027 block covering how to install .NET Core and run the API locally."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"README.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"38a70c03e29f9cf7f5e9e24c613a3dc5119dc5c895781a2a45a1584829ef5be0"}},{"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 spelling of \u0027Registered\u0027 in response class names. One is spelled \u0027Regitered\u0027 (typo) while the other is \u0027Generated\u0027.: Rename \u0027ResponseRegiteredRecipeJson\u0027 to \u0027ResponseRegisteredRecipeJson\u0027 to fix the typo and align with standard English spelling. (symbols: MyRecipeBook.Communication.Responses.ResponseRegiteredRecipeJson, MyRecipeBook.Communication.Responses.ResponseGeneratedRecipeJson)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"1d33ce794c0dc709d47ceebd1603c360406cfd985035ea8dc028dcd2f0cd0868"}},{"ruleId":"D21","level":"note","message":{"text":"Inconsistent spelling of \u0027Encrypter\u0027 vs \u0027Encripter\u0027. The interface is named \u0027IPasswordEncripter\u0027 which is a misspelling of \u0027Encrypter\u0027.: Rename \u0027IPasswordEncripter\u0027 to \u0027IPasswordEncrypter\u0027 to correct the spelling. (symbols: MyRecipeBook.Domain.Security.Cryptography.IPasswordEncripter, MyRecipeBook.Domain.Security.Cryptography.IPasswordEncripter.IsValid)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"99216162efb30c471093f8e48d66733c534171e9d7065a9043c37fc1694d7aa1"}},{"ruleId":"D21","level":"note","message":{"text":"Inconsistent naming for the logged-in user service. One is a class/namespace \u0027LoggedUser\u0027 and the other is an interface \u0027ILoggedUser\u0027. While this might be intentional, the namespace \u0027MyRecipeBook.Domain.Services.LoggedUser\u0027 suggests the concept is \u0027LoggedUser\u0027, but the interface is \u0027ILoggedUser\u0027.: Ensure the interface name matches the concept, e.g., \u0027ILoggedUser\u0027 is fine if it represents the logged-in user, but check if \u0027ILoggedUser\u0027 is the standard prefix for interfaces in this codebase. (symbols: MyRecipeBook.Domain.Services.LoggedUser.ILoggedUser, MyRecipeBook.Domain.Services.LoggedUser)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9ec316eb545f3365a37a17d99e5cc185f37a5ad7d088601495a09f5f3c7eaee2"}},{"ruleId":"D21","level":"note","message":{"text":"Inconsistent interface naming for user repositories. One is \u0027IUserReadOnlyRepository\u0027 and the other is \u0027IUserDeleteOnlyRepository\u0027. The pattern \u0027IUser[Action]Repository\u0027 is used, but \u0027ReadOnly\u0027 and \u0027DeleteOnly\u0027 are not parallel in structure (one describes state, one describes action).: Consider renaming to parallel structures, e.g., \u0027IUserReadOnlyRepository\u0027 and \u0027IUserWriteOnlyRepository\u0027 or \u0027IUserDeleteRepository\u0027. However, if \u0027DeleteOnly\u0027 is specific to a delete operation, it may be acceptable. The main issue is the lack of parallelism in the naming convention for repository interfaces. (symbols: MyRecipeBook.Domain.Repositories.User.IUserReadOnlyRepository, MyRecipeBook.Domain.Repositories.User.IUserDeleteOnlyRepository)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9fab18e15c70bb2f7bbb379ea429457ce3d8d9ac14833065a44c884004244ee8"}},{"ruleId":"D23","level":"note","message":{"text":"Bounded contexts not declared: At 2972 LoC split over 10 projects the codebase is large and multi-module, so explicit bounded contexts are needed. Declare architecture.contexts (\u22652) in config to assess cross-boundary type coupling."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"1c7e276c9c682731f01819ed5378b90ca320cde1b583c90920172911598362b3"}},{"ruleId":"D30","level":"error","message":{"text":"High CVE: AutoMapper 13.0.1: AutoMapper 13.0.1 (transitive) has a High advisory; affects 6 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"5abd77846531e18f75398fdb348c13595eef847ee67bc77d39dc5775b3bd774b"}},{"ruleId":"D30","level":"error","message":{"text":"High CVE: System.Text.Json 6.0.9: System.Text.Json 6.0.9 (transitive) has a High advisory; affects 6 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"7f06f6851ec5ebc6817806bb15ed6917dd3136acadc72f172096248da93f3c1d"}},{"ruleId":"D31","level":"error","message":{"text":"High IaC: DS-0002: Image user should not be \u0027root\u0027"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Dockerfile"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe2d688610b51e0a5a02c7c5dd1724a4986e40f2689fb84510e2ec0164c27d6a"}},{"ruleId":"D31","level":"error","message":{"text":"High IaC: DS-0009: WORKDIR path not absolute"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Dockerfile"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"57dff62848ab03d5201264fcc412df879d53a66dcc8ec3182a98d8c53722a404"}},{"ruleId":"D31","level":"note","message":{"text":"Low IaC: DS-0026: No HEALTHCHECK defined"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Dockerfile"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f51a163f26d94ce6b6f473117dde579d091c8cbf9e59810475c94d9fc921120"}},{"ruleId":"D34","level":"note","message":{"text":"Further orphaned files (smaller): 7 smaller file(s) also have no living knowledge \u2014 folded into the freshness score and metrics rather than listed individually (7 orphaned of 11 analysed files in total)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ce861fd78f6935114d3a342cb90ad25870f984e1042954fcbbe27c0e23be3658"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: DoLoginUseCase.cs \u2194 RegisterUserUseCase.cs: \u0060src/Backend/MyRecipeBook.Application/UseCases/Login/DoLogin/DoLoginUseCase.cs\u0060 and \u0060src/Backend/MyRecipeBook.Application/UseCases/User/Register/RegisterUserUseCase.cs\u0060 change together 70% of the time (7 shared commits) with no explicit dependency \u2014 a hidden/logical coupling. If they belong together, co-locate them; if not, break the coupling."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Backend/MyRecipeBook.Application/UseCases/Login/DoLogin/DoLoginUseCase.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b084e73bb6dc8b74838c8ac7de32c882bf72d3e900da2092140a3fd2778ae10"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: RecipeController.cs \u2194 DependencyInjectionExtension.cs: \u0060src/Backend/MyRecipeBook.API/Controllers/RecipeController.cs\u0060 and \u0060src/Backend/MyRecipeBook.Application/DependencyInjectionExtension.cs\u0060 change together 67% of the time (8 shared commits) with no explicit dependency \u2014 a hidden/logical coupling. If they belong together, co-locate them; if not, break the coupling."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Backend/MyRecipeBook.API/Controllers/RecipeController.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f17a451c6f980ec238c83f0196764d881cb904c4678b12e1212829e9665f5a83"}}],"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}}}]}