{"$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":"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"]}]},{"id":"D29","name":"Static Analysis (SAST)","shortDescription":{"text":"Static Analysis (SAST)"},"helpUri":"https://codehealth.canine.dev/dimensions/D29"},{"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":"D36","name":"Supply-chain Provenance \u0026 Signing","shortDescription":{"text":"Supply-chain Provenance \u0026 Signing"},"helpUri":"https://codehealth.canine.dev/dimensions/D36","relationships":[{"target":{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}]}]}},"results":[{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/Products/Products.Core/Persistence/Contexts/ProductsDbContext.cs:34-48 | src/Users/Users.Core/Persistence/Contexts/UsersDbContext.cs:30-44"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Products/Products.Core/Persistence/Contexts/ProductsDbContext.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0866989290b555792c91eb838ebab4cfd0a35f69d0f1582b21d814a1599a17f"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Products.Contracts: Products.Contracts: 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":"61c0d52cfed5238af7d3d583aeb9481d333fe4ea9e4eed9dcd932139f438d4d5"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Users.Contracts: Users.Contracts: 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":"d20d6a52ccf21389892601e3f8b886f603623863eea1c101d80848547e6db92b"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Shops.Contracts: Shops.Contracts: abstractness 0.20, instability 0.00, distance 0.80 \u2014 zone of pain \u2014 concrete and heavily depended-on, so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"43ab57d2d53f3c9061e6050aca494c566661c4d967196fb74eef84a55bef1257"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Products.Core: Products.Core: abstractness 0.00, instability 0.22, distance 0.78 \u2014 zone of pain \u2014 concrete and heavily depended-on, so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"b87b2a604af507698267868b805f36d7b6d1243722bc47e951c4924df88daeb0"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Users.Core: Users.Core: abstractness 0.04, instability 0.20, distance 0.76 \u2014 zone of pain \u2014 concrete and heavily depended-on, so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ffda903855110c91551619dd97b114f6e6eae1aa4691d76a63fd3bcefa3b66de"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Shared: Shared: abstractness 0.30, instability 0.00, distance 0.70 \u2014 zone of pain \u2014 concrete and heavily depended-on, so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9a6075584bf1a071b89754c93f688530ad9c449d73224f95d418320ea318e68b"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: User (LCOM4 5): User\u0027s methods form 5 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Users/Users.Core/Entities/User.cs"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"b705b7af16b824925d054d1fa55a52a551633a208440be780a3dd9fa819742ce"}},{"ruleId":"D12","level":"error","message":{"text":"Vulnerable: MongoDB.Driver: MongoDB.Driver 2.18.0 \u2014 High severity. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"8a76fce3ea8c12702d42f548fa93ce717c9d878486eaac09e9c1c0b1d862f1fa"}},{"ruleId":"D12","level":"error","message":{"text":"Vulnerable: OpenTelemetry.Exporter.Jaeger: OpenTelemetry.Exporter.Jaeger 1.4.0-beta.3 \u2014 Moderate severity. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"7cb83bbca797c498325718d6d9989ec4ceaab3231058a089f0c3a1b50890b8f4"}},{"ruleId":"D12","level":"error","message":{"text":"Vulnerable: OpenTelemetry.Instrumentation.AspNetCore: OpenTelemetry.Instrumentation.AspNetCore 1.0.0-rc9.9 \u2014 Moderate severity. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d66d0f961a21bc8dcc074e377ff8843846388f308fa2aaf885497a3268633cb1"}},{"ruleId":"D12","level":"error","message":{"text":"Vulnerable: OpenTelemetry.Instrumentation.Http: OpenTelemetry.Instrumentation.Http 1.0.0-rc9.9 \u2014 Moderate severity. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9a8d459151620bd656e392d3819e088c299d814b6a78bd030b63dea0adfe4b47"}},{"ruleId":"D12","level":"warning","message":{"text":"Deprecated: Microsoft.AspNetCore.Http.Abstractions: Microsoft.AspNetCore.Http.Abstractions 2.2.0 \u2014 Other,Legacy"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ab239d92a1ed0e780896b6b47df6648aa988d7c5c2e552fd20a0b8d4943c6f81"}},{"ruleId":"D12","level":"warning","message":{"text":"Deprecated: Microsoft.AspNetCore.Mvc: Microsoft.AspNetCore.Mvc 2.2.0 \u2014 Other,Legacy"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"a99213a55d0bf26f9cb4256cfdeb44dbc489cfaf4f9937e8e93d5d6b38c5b542"}},{"ruleId":"D12","level":"warning","message":{"text":"Deprecated: OpenTelemetry.Contrib.Instrumentation.AWS: OpenTelemetry.Contrib.Instrumentation.AWS 1.0.2 \u2014 Legacy OpenTelemetry.Instrumentation.AWS \u003E= 0.0.0"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"435ef492ef4bb024982e3e27592cfb61ff0f08b0bb27d4ad361e3595160a7912"}},{"ruleId":"D12","level":"warning","message":{"text":"Deprecated: OpenTelemetry.Exporter.Jaeger: OpenTelemetry.Exporter.Jaeger 1.4.0-beta.3 \u2014 Legacy OpenTelemetry.Exporter.OpenTelemetryProtocol \u003E= 0.0.0"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"fb43adf23620c6987f9a533d5d261d4840ac582373359c4589e0b5095874acba"}},{"ruleId":"D12","level":"warning","message":{"text":"Deprecated: OpenTelemetry.Instrumentation.AspNetCore: OpenTelemetry.Instrumentation.AspNetCore 1.0.0-rc9.9 \u2014 Other OpenTelemetry.Instrumentation.AspNetCore \u003E= 1.8.1"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f5fa299674d9abd19914d1f4eeccedc2cc32a84267f4731d3e7962ec97eb607a"}},{"ruleId":"D12","level":"warning","message":{"text":"Deprecated: OpenTelemetry.Instrumentation.Http: OpenTelemetry.Instrumentation.Http 1.0.0-rc9.9 \u2014 Other OpenTelemetry.Instrumentation.Http \u003E= 1.8.1"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"7c097a616e46158d2c52dd178380fff9e60a65cf90b9c36cecee77021f275142"}},{"ruleId":"D12","level":"warning","message":{"text":"Deprecated: Microsoft.AspNetCore.Authentication: Microsoft.AspNetCore.Authentication 2.2.0 \u2014 Other,Legacy"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"b49e745b49ea85b5a7653dc1d704bf2677c6d5516388c50ecf50484a32fc3a98"}},{"ruleId":"D12","level":"warning","message":{"text":"Deprecated: Microsoft.AspNetCore.Authorization.Policy: Microsoft.AspNetCore.Authorization.Policy 2.2.0 \u2014 Other,Legacy"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"31bb1c1a49970397e96f476b13a63b3dfefd1e52f486251cf8ab97fa043a2cca"}},{"ruleId":"D12","level":"warning","message":{"text":"Deprecated: Verify.Xunit: Verify.Xunit 19.1.0 \u2014 Legacy Verify.XunitV3 \u003E= 0.0.0"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"bf99145017f5a240a4ba5d7c5c05d1cac881add7f172454bff7084cffedda576"}},{"ruleId":"D12","level":"warning","message":{"text":"Deprecated: xunit: xunit 2.4.2 \u2014 Legacy xunit.v3 \u003E= 0.0.0"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d37c8c0e8046c9e8358e976373216abfb78e9fdef63ed53d3edcaa7d2238edcd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: is this needed? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/API/Program.cs"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a4a746cdac8503dc70b2115a195f0ed55b48310c56ed0a24a3d4f3822613e80"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: check if stream exist and add error handling \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Baskets/Baskets.Core/Features/Baskets/AddProductsToBasket.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"31b12d884587c18fcb29fff4a7f876e79c5939c5d2bf82bc2c3907e6b565ea52"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: fix this \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Products/Products.Core/Features/Categories/Commands/UpdateCategory.cs"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"069f73ae06ea6228ab404cc0951c394b57a87d429d9092dfcd8ebb4b3b8dbdee"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: Add img \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Products/Products.Core/ReadModels/ProductDetailsReadModel.cs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"6232edf11a9dc71b06f5e831853ab105baa0b00a74dd954685ec14f68b2b8106"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Shared/Shared/Configuration/GroceryStoreRouteBuilder.cs"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"88fca9c9f23704fb1d63f3365fc7b46a066ffe26824dd335f12ef9b8a650f3c9"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Shared/Shared/EndpointBuilders/Extensions.cs"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"d179fd71a78082aec1d9acda1deda8b94c0742118e1d3581b302bfca0c705a6f"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Worker/Program.cs"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"627a15fbfc76146184fdfa96db3264a39de4e69e4e5c4cd41331e1a6780d99d7"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 5 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Shared/Shared/Configuration/GroceryStoreRouteBuilder.cs"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"88fca9c9f23704fb1d63f3365fc7b46a066ffe26824dd335f12ef9b8a650f3c9"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 5 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Shared/Shared/EndpointBuilders/IGroceryStoreRouteBuilder.cs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"9818642c245877befa40cc831641d488a508921467a7372575715c97fb72ee70"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //.RequireAuthorization() //TODO: admin policy \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Shops/Shops.Core/Features/Shops/AddShopChain.cs"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"f24c9de1cc960f9ccd062859a365b88094bd7a7c1ac0b85405b18dd0b83296fc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Shops/Shops.Core/Features/Shops/AddShopChain.cs"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"f24c9de1cc960f9ccd062859a365b88094bd7a7c1ac0b85405b18dd0b83296fc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: add location \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Shops/Shops.Core/Features/Shops/AddShopChain.cs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"f24c9de1cc960f9ccd062859a365b88094bd7a7c1ac0b85405b18dd0b83296fc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: does it work? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Users/Users.Core/Features/Tokens/Login.cs"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"98fc0ddbbe38b732e6ce5174e201679c05c3cbae79122f8120937c6a8c95dc65"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: remove later \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Worker/Program.cs"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"e913e103ff98f34d255597580642be1ebea3927c231f37f17a7c78a23211ecca"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Something is wrong with scrubber \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/Users/Users.IntegrationTests/Users/GetUserTests.cs"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"12e78b8dfbdbe7cd05a97393c3e217b9e148168f16084507acc396219bc1f46a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: Add check for harness \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/Users/Users.IntegrationTests/Users/RegisterTests.cs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"f91dcd76d2213e9ed33ff3b1d30a2fec73f03dbaba2a03063df986df0e0e56d3"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: RemoveBasket: NamedType RemoveBasket \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Baskets/Baskets.Core/Features/Baskets/RemoveBasket.cs"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7a89e8b4809d0e5e9c45ba6f0358ea671113d928e9ffa77101fb6d8b986f051"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: RemoveProductsFromBasket: NamedType RemoveProductsFromBasket \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Baskets/Baskets.Core/Features/Baskets/RemoveProductsFromBasket.cs"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe8a1401fcc5fe316daadcbbdaaf130e8cbcf71abf341b87e84dd3b6bc2736c5"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: UpdateBasketDetails: NamedType UpdateBasketDetails \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Baskets/Baskets.Core/Features/Baskets/UpdateBasketDetails.cs"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"347b3910b7e4c4396ca9d8ed9dbd19e63aeb59205b92a2cbd058851b36de54a2"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: AddProductToFavorite: NamedType AddProductToFavorite \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Baskets/Baskets.Core/Features/Products/AddProductToFavorite.cs"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8783fa7625c263415e7a8a932f8117c26ed91c5ef70e70fe1af9473c099d492"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: RateProduct: NamedType RateProduct \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Baskets/Baskets.Core/Features/Products/RateProduct.cs"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"093c6bb5b118dc94a6f586e0cac23fbd408e57a54bbc33422fc3ebc4148220e5"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: EventMappers: NamedType EventMappers \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Baskets/Baskets.Core/ReadModels/EventMappers.cs"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"49aafe3286ecb8adb4e7a41cc1c540dbc2e9687fbcd6e8575adea5e5bb702638"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: AddTrustPoints: Method AddTrustPoints \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Shops/Shops.Core/Entities/User.cs"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"d95d1b17603df49d152c7a7d0e80a7560c6410832f392b61af6b66c37fb110f8"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: CalculateBasketPrice: NamedType CalculateBasketPrice \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Shops/Shops.Core/Features/Basket/CalculateBasketPrice.cs"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"36a5bdd0236bbc315ea7564ba568e0e8ba24df854856498b41908132f1759786"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: ApplyPromotion: NamedType ApplyPromotion \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Shops/Shops.Core/Features/Products/ApplyPromotion.cs"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b690417fe89b620e729adf1030670f90b143182c4c15a184fc8f37501ba2244f"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: MarkAsUnavailable: NamedType MarkAsUnavailable \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Shops/Shops.Core/Features/Products/MarkAsUnavailable.cs"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"e43e979f335eea85a35e2a7fd33a75df91ab37a21f382c6cef2bc062d2fe646a"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: VerifyPrice: NamedType VerifyPrice \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Shops/Shops.Core/Features/Products/VerifyPrice.cs"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7fc35f261347a8236a6284906e67e20103a5379db50b86d44913015e0f2be8d"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: AddPromotion: NamedType AddPromotion \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Shops/Shops.Core/Features/Promotions/AddPromotion.cs"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"0850f5fd44205441e5ffe09ca82aa1bfa59d96a3095101b03f75a2873fc211a4"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: RateShop: NamedType RateShop \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Shops/Shops.Core/Features/Shops/RateShop.cs"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"d26f56e42c183817d146ef09e418b93a6c8ecab31feae11446acda21250ea2d7"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: AddTrustPoints: NamedType AddTrustPoints \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Shops/Shops.Core/Features/Users/AddTrustPoints.cs"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"6df627dd375e239b1b1e0bfadf2efbe540e4c2a87cdd129db8a3dbaa0bbf0924"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: BrandHasReferenceException: NamedType BrandHasReferenceException \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Products/Products.Core/Exceptions/BrandHasReferenceException.cs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"e92735e0344346961e2905fdddab86555898335a683a5a6bd83e7fd6b95ee5eb"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: BrandNotFoundException: NamedType BrandNotFoundException \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Products/Products.Core/Exceptions/BrandNotFoundException.cs"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"01d3f024df254cec064f584e5d62f0aa93a6cdf254b39adb3410a2a8b8a28f1c"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: UpdateAllergen: NamedType UpdateAllergen \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Products/Products.Core/Features/Allergens/Commands/UpdateAllergen.cs"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"01d2607da0f78ecfcd73785b3bd2cb7fba6c6c9dfda4c366be90b5350d7db504"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: UpdateDetails: NamedType UpdateDetails \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Products/Products.Core/Features/Products/Commands/UpdateDetails.cs"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"d029dbcf30edd0e761df022248ebd760a5e0a458d6f208e8b78fa0a0498dc02a"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: FindProductFreeFrom: NamedType FindProductFreeFrom \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Products/Products.Core/Features/Products/Queries/FindProductFreeFrom.cs"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbaa901ef7bdf17235e2ca7f873401ec2ac8af094b94b65ac96e346a16d42e11"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: UpdatePassword: Method UpdatePassword \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Users/Users.Core/Entities/User.cs"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"998c57948bf3c3b0144c21146a0b0ba2a7b170c66b1bd210e1e8da41f589b56e"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: UpdateEmail: Method UpdateEmail \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Users/Users.Core/Entities/User.cs"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"deee4daf8a88bd388adc0fe5755a63e69165a8fa56555d60a87a1e5177522a58"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: ConfirmEmail: Method ConfirmEmail \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Users/Users.Core/Entities/User.cs"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"84a125a7de4621df385fd12232d87730fa1d5f6c25cc4d0b519b72e1b270e46a"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: EnableTwoTwoFactor: Method EnableTwoTwoFactor \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Users/Users.Core/Entities/User.cs"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cae9b93bd32190c6e6b042b19b2ed80465ce0face67947576fede385fe17c36"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: RemoveUserById: Method RemoveUserById \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/Users/Users.IntegrationTests/UserTestHelper.cs"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1d18c447e43df38725fb45ed22a396391348e762c88b0f87343fdae6ddc31ad"}},{"ruleId":"D18","level":"note","message":{"text":"Shell project: Baskets.Contracts: \u0060Baskets.Contracts\u0060 contributes only 0 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/Baskets/Baskets.Contracts/Baskets.Contracts.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"47cb51689d52a375c928f48f7a0905f7539b53450e5d2dd9bc8f1ba2c578cb4e"}},{"ruleId":"D18","level":"note","message":{"text":"Shell project: Products.Contracts: \u0060Products.Contracts\u0060 contributes only 4 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/Products/Products.Contracts/Products.Contracts.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"27bcafae0d4b03a37fa5776b23e394b05a5c85caaf85bf22cf21fd36d0c083e0"}},{"ruleId":"D18","level":"note","message":{"text":"Shell project: Baskets.UnitTests: \u0060Baskets.UnitTests\u0060 contributes only 3 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":"tests/Baskets/Baskets.UnitTests/Baskets.UnitTests.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c16c7329624dbf95c3c6e57c2378a10eec18a10757149212b7b136940e24191"}},{"ruleId":"D18","level":"note","message":{"text":"Shell project: Users.Contracts: \u0060Users.Contracts\u0060 contributes only 2 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/Users/Users.Contracts/Users.Contracts.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdae930edd8fc234f3d3dcdd265fc399f3450b3e68ddc94634b3d63c2f53375e"}},{"ruleId":"D18","level":"note","message":{"text":"Shell project: Baskets.IntegrationTests: \u0060Baskets.IntegrationTests\u0060 contributes only 3 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":"tests/Baskets/Baskets.IntegrationTests/Baskets.IntegrationTests.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c466b9b3ddae67c91f7c3b295671dbafa1c772c0aed2eee0e39849736b2ce8de"}},{"ruleId":"D18","level":"note","message":{"text":"Shell project: Products.IntegrationTests: \u0060Products.IntegrationTests\u0060 contributes only 3 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":"tests/Products/Products.IntegrationTests/Products.IntegrationTests.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"94a42da099e13dbfe3f1baa4934d2663200fcc6e87acdb6f62af421ac818aed3"}},{"ruleId":"D18","level":"note","message":{"text":"Shell project: Shops.IntegrationTests: \u0060Shops.IntegrationTests\u0060 contributes only 3 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":"tests/Shops/Shops.IntegrationTests/Shops.IntegrationTests.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a290efc6154a06d813f6f10627c0d8c8b534395ea915d0dc0ed4baec210873b6"}},{"ruleId":"D18","level":"note","message":{"text":"Shell project: Products.UnitTests: \u0060Products.UnitTests\u0060 contributes only 3 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":"tests/Products/Products.UnitTests/Products.UnitTests.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f54356d816fe180b43c890d5d6e5384c44934d4110f980cdeafbac75b7fe181f"}},{"ruleId":"D18","level":"note","message":{"text":"Shell project: Shops.UnitTests: \u0060Shops.UnitTests\u0060 contributes only 3 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":"tests/Shops/Shops.UnitTests/Shops.UnitTests.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c8ca5118eaea5122b7ca7837211402b101e17fd2be30242d250782045df7643"}},{"ruleId":"D18","level":"note","message":{"text":"Shell project: Users.UnitTests: \u0060Users.UnitTests\u0060 contributes only 3 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":"tests/Users/Users.UnitTests/Users.UnitTests.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"98389ed88838d3163c9dcf0dca2edd62987a2bd28cfbb4ca66ca105de78708db"}},{"ruleId":"D18","level":"note","message":{"text":"Thin analysable surface across projects: 2 project(s) carry only a thin slice of real code (e.g. \u0060Shops.Contracts\u0060 with 14 significant line(s)). The mean analysable-surface weight is 45 %, lowering Solution Shape by about 4.4 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":"The word \u0027Address\u0027 is consistently misspelled as \u0027Adress\u0027 in the codebase. While this is a typo, it is a pervasive inconsistency in the domain model where the correct spelling should be used.: Rename \u0027Adress\u0027 to \u0027Address\u0027 in both the Entity and ValueObject. (symbols: IGroceryStore.Shops.Entities.Adress, IGroceryStore.Shops.ValueObjects.Adress)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9cb89f698feed32867d35ce568397f49cb3efd2c4c85707edbe638642f07cc00"}},{"ruleId":"D22","level":"warning","message":{"text":"Inconsistent identifier types for the same domain concept (Product). ProductAddedToShop and ProductPriceChanged use \u0060ulong\u0060 for ProductId, while ProductPriceReported also uses \u0060ulong\u0060. However, looking at UserCreated, it uses \u0060Guid\u0060 for UserId. The inconsistency is not between ProductId fields, but potentially in the broader system if other entities use different ID types. However, within this specific snippet, the ProductId is consistently \u0060ulong\u0060. A more significant inconsistency is the naming convention for events: some are concrete classes (ProductAddedToShop, ProductPriceChanged) while others are interfaces (IProductPriceChanged, IProductPriceReported). This creates a mixed public API surface where consumers must handle both interfaces and concrete classes for similar event types.: Standardize on either interfaces or concrete classes for all event types, or ensure the public API surface is uniform. If interfaces are exposed, ensure all related types follow the same pattern. Additionally, consider if \u0060ProductPriceReported\u0060 should also include \u0060ShopChainId\u0060 or \u0060ShopId\u0060 to be consistent with \u0060ProductPriceChanged\u0060 and \u0060ProductAddedToShop\u0060. (signatures: ProductAddedToShop.ProductId | ProductPriceChanged.ProductId | ProductPriceReported.ProductId)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"1f4abe9c49674027388e0022a532c0fbaefe664a5ff24f1e466ba832dcdf5766"}},{"ruleId":"D22","level":"warning","message":{"text":"Redundant or overlapping event types. \u0060ProductAddedToShop\u0060 and \u0060ProductPriceChanged\u0060 both contain \u0060ProductId\u0060 and \u0060ShopChainId\u0060. While they carry different data (InitialPrice vs NewPrice/IsLowestPrice), the structural similarity suggests they might be unified or at least follow a strict naming and structural convention. The current state is acceptable but could be tighter.: Ensure that all shop-related events follow a strict naming convention (e.g., all ending in \u0027Event\u0027 or all being POCOs). The current mix of interfaces and classes is the primary inconsistency. (signatures: ProductAddedToShop.ShopChainId | ProductPriceChanged.ShopChainId)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"70853b2a9b5d0bf274e7d6ccb1504b7d542a64af73b919acedc4c18b47dc8730"}},{"ruleId":"D23","level":"note","message":{"text":"Bounded contexts not declared: At 4567 LoC across 21 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":"D31","level":"warning","message":{"text":"Medium IaC: AWS-0024: Point in time recovery should be enabled to protect DynamoDB table"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tools/terraform/dev/main.tf"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9bfd1dbd34a4b702ccff46310dfcca8869c5338e68709bfa38316fe87ad8daf"}},{"ruleId":"D31","level":"note","message":{"text":"Low IaC: AWS-0025: DynamoDB tables should use at rest encryption with a Customer Managed Key"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tools/terraform/dev/main.tf"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5186fd3c4d15a15c8909565c628207a877af4be0c204862923bc64e05311910d"}},{"ruleId":"D34","level":"note","message":{"text":"Further orphaned files (smaller): 19 smaller file(s) also have no living knowledge \u2014 folded into the freshness score and metrics rather than listed individually (19 orphaned of 19 analysed files in total)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ce861fd78f6935114d3a342cb90ad25870f984e1042954fcbbe27c0e23be3658"}},{"ruleId":"D36","level":"note","message":{"text":"No build provenance: No SLSA provenance generation or build attestation found in CI (e.g. slsa-github-generator, actions/attest-build-provenance)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"1b213f6eedd4b140d0bc37bdf1496f72811a643f34064f12518b32e9e83bcfc7"}},{"ruleId":"D36","level":"note","message":{"text":"No artifact signing: No artifact signing found in CI (e.g. cosign / sigstore / gitsign)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"0e17f71490e4d120a48b2b2881ab866c93b272bef2febb673a3e8e42b2c288ab"}},{"ruleId":"D36","level":"note","message":{"text":"No SBOM: No SBOM generation or committed SBOM found (e.g. syft / anchore/sbom-action / *.spdx.json / *.cdx.json)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"eb00976a698a5d68999b7ee6d27206fd374e916853e7ff1ead5eed42386f043f"}},{"ruleId":"D36","level":"warning","message":{"text":"Unpinned build actions: CI references GitHub Actions by a floating ref (@main / @tag) rather than a pinned commit SHA, weakening build integrity."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"90f83b4fa27db32740afe9540c905f3c0499caed87f61049a8a903ecc95b41c3"}}],"taxonomies":[{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d","organization":"MITRE","shortDescription":{"text":"The MITRE Common Weakness Enumeration (CWE)."},"taxa":[{"id":"CWE-1357","name":"Reliance on Insufficiently Trustworthy 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}}}]}