{"$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":"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":"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":"D24","name":"Comment Value","shortDescription":{"text":"Comment Value"},"helpUri":"https://codehealth.canine.dev/dimensions/D24"},{"id":"D26","name":"Project Cohesion","shortDescription":{"text":"Project Cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/D26"},{"id":"D27","name":"Navigability","shortDescription":{"text":"Navigability"},"helpUri":"https://codehealth.canine.dev/dimensions/D27"},{"id":"D28","name":"Secrets (history)","shortDescription":{"text":"Secrets (history)"},"helpUri":"https://codehealth.canine.dev/dimensions/D28","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}]},{"id":"D29","name":"Static Analysis (SAST)","shortDescription":{"text":"Static Analysis (SAST)"},"helpUri":"https://codehealth.canine.dev/dimensions/D29"},{"id":"D30","name":"Dependency Vulnerabilities","shortDescription":{"text":"Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D30","relationships":[{"target":{"id":"CWE-1395","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}]},{"id":"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"]}]},{"id":"D39","name":"IL Efficiency","shortDescription":{"text":"IL Efficiency"},"helpUri":"https://codehealth.canine.dev/dimensions/D39"}]}},"results":[{"ruleId":"D1","level":"warning","message":{"text":"AggregateConstruction.CreateInstance (cyclomatic 16): AggregateConstruction.CreateInstance has cyclomatic complexity 16 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow/Aggregates/AggregateFactory.cs"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb18c38dcbaeb845770c7767cc7e02a03b555f4781eba62f9d722ba8e9af450a"}},{"ruleId":"D2","level":"warning","message":{"text":"EventUpgradeManager.UpgradeAsync (cognitive 26): EventUpgradeManager.UpgradeAsync has cognitive complexity 26 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow/EventStores/EventUpgradeManager.cs"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"92df1f63cebfd90e96eefc313442e8f002c7e6988d83904af37a1c2f92c27927"}},{"ruleId":"D2","level":"warning","message":{"text":"AggregateConstruction.CreateInstance (cognitive 24): AggregateConstruction.CreateInstance has cognitive complexity 24 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow/Aggregates/AggregateFactory.cs"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"56e4fd6012df701e66d642657030209cfc4ac3e28c192ac9168f9c832414fbd2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (36 lines \u00D7 2): Source/EventFlow.MsSql/EventStores/MsSqlEventPersistence.cs:108-143 | Source/EventFlow.SQLite/EventStores/SQLiteEventPersistence.cs:110-143"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.MsSql/EventStores/MsSqlEventPersistence.cs"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"003c16efe7e2cf87ca8d18022833ced20d7f3fb077ad01ed10ace3c0dbc687c3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (32 lines \u00D7 2): Source/EventFlow.Sql/ReadModels/SqlReadModelStore.cs:132-155 | Source/EventFlow.MsSql/ReadStores/MssqlReadModelStore.cs:124-155"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.Sql/ReadModels/SqlReadModelStore.cs"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"171b6e537fea79e59dd77f32372cd88debe00dbd18bf25cf5d16a3f82cbfa2ca"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 3): Source/EventFlow.MsSql/EventStores/MsSqlEventPersistence.cs:66-90 | Source/EventFlow.PostgreSql/EventStores/PostgresSqlEventPersistence.cs:67-92 | Source/EventFlow.SQLite/EventStores/SQLiteEventPersistence.cs:67-92"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.MsSql/EventStores/MsSqlEventPersistence.cs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5d51ec651e7a0143352b0d52e990b3826b7cbcb9f4879c02e2c016716b302eb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): Source/EventFlow.EntityFramework/Extensions/EventFlowOptionsEntityFrameworkExtensions.cs:71-83 | Source/EventFlow.EntityFramework/Extensions/EventFlowOptionsEntityFrameworkExtensions.cs:122-134"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.EntityFramework/Extensions/EventFlowOptionsEntityFrameworkExtensions.cs"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"40be8b2d7431bd29c4400ca3a16a7aa460d2ca1201aa79607de28f3285c60dd2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): Source/EventFlow.Sql/ReadModels/SqlReadModelStore.cs:164-174 | Source/EventFlow.MsSql/ReadStores/MssqlReadModelStore.cs:172-182"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.Sql/ReadModels/SqlReadModelStore.cs"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"7113c8e28fd3bb5db3eafe34452c1fcb5cbccef9f927e6ad1bcad8b2acc0fa3f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): Source/EventFlow.Sql/ReadModels/SqlReadModelStore.cs:71-80 | Source/EventFlow.MsSql/ReadStores/MssqlReadModelStore.cs:71-80"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.Sql/ReadModels/SqlReadModelStore.cs"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dd544b8ef43a8b8d750affa22f83cce16fb2876217a7190f029b3f56b56015c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): Source/EventFlow/Aggregates/AggregateFactory.cs:145-153 | Source/EventFlow/Aggregates/AggregateFactory.cs:163-171"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow/Aggregates/AggregateFactory.cs"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"def74f190c04fa25b96ec43ef23b352fb6a537f4578fcab11d85f1b85f65e6ac"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): Source/EventFlow.EntityFramework/Extensions/EventFlowOptionsEntityFrameworkExtensions.cs:42-50 | Source/EventFlow.EntityFramework/Extensions/EventFlowOptionsEntityFrameworkExtensions.cs:95-103"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.EntityFramework/Extensions/EventFlowOptionsEntityFrameworkExtensions.cs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c0a69ffdc3785b901fcd212d06b126ffae0edc2f73689b7ff11dd60cef92937"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): Source/EventFlow.PostgreSql/Extensions/EventFlowOptionsPostgresSqlReadStoreExtensions.cs:39-45 | Source/EventFlow.PostgreSql/Extensions/EventFlowOptionsPostgresSqlReadStoreExtensions.cs:54-60"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.PostgreSql/Extensions/EventFlowOptionsPostgresSqlReadStoreExtensions.cs"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c894f2d6d16c64fcc9b11dcf2c52a566de9067eeee340b07e1592d0c5f32057"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: EntityDescriptor (LCOM4 4): EntityDescriptor\u0027s methods form 4 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":"Source/EventFlow.EntityFramework/ReadStores/EntityFrameworkReadModelStore.cs"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"59f6f869cc09dd6f0e05a849c2300093ce767962fe58f33aeb06e94d8255ff3d"}},{"ruleId":"D10","level":"warning","message":{"text":"Skipped test: MultipleInstancesWithSamePathFail: Skipped \u2014 Ignore for now"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.Tests/UnitTests/EventStores/ConcurrentFilesEventPersistanceTests.cs"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"e84a1749e58b6b38f44afc6b8c401c4fb192c97ff173265dc731a77ab83f20e3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: CreateEventHelper: Test method exercises code but verifies nothing \u2014 add an assertion."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.Tests/IntegrationTests/BackwardCompatibilityTests.cs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad2e9a63d4913990a75acbab0aa0b4ceaef6952d12a88dcaa37b550983bb1cd1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: OptimisticConcurrencyCheck: Test method exercises code but verifies nothing \u2014 add an assertion."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.Tests/IntegrationTests/ReadStores/InMemoryReadModelStoreTests.cs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f838a23020ec60a8339c5a3c4dd501c818e8f9c170629c8cda6e717159405af"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: RegistrationDoesntCauseStackOverflow: Test method exercises code but verifies nothing \u2014 add an assertion."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.Tests/IntegrationTests/ServiceProviderTests.cs"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"67c5e3c82ef491d9f14736efdd87c7e16451a5399d1fb22d51df8d774b90dcf6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: UnicodeIntegration: Test method exercises code but verifies nothing \u2014 add an assertion."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.Tests/IntegrationTests/UnicodeTests.cs"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"f60cf3f8e8d1c4d327fe1419934427096c68ed881ad29afaffd33489974a50f9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: NoEventsEmittedIsOk: Test method exercises code but verifies nothing \u2014 add an assertion."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.TestHelpers/Suites/TestSuiteForEventStore.cs"},"region":{"startLine":269}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc3d869e7f67f0f927bc33c8e4e8b0ca6c56f44d02b5be41094474886fd5cc7e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: TheSameSnapshotVersionCanBeSavedMultipleTimes: Test method exercises code but verifies nothing \u2014 add an assertion."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.TestHelpers/Suites/TestSuiteForSnapshotStore.cs"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"f20121f6e22ee3afe38ccf2e86756e49d0bb11b10c2171e64150e14eb74f0b54"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: SnapshotsCanBeSavedOutOfOrder: Test method exercises code but verifies nothing \u2014 add an assertion."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.TestHelpers/Suites/TestSuiteForSnapshotStore.cs"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e2efe3056f5683976b4647fd9dc0ff9933d3353b45faca3991c109d3fb14d2c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Simple: Test method exercises code but verifies nothing \u2014 add an assertion."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.Examples.Shipping.Tests/IntegrationTests/Scenarios.cs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"faff966e1a0986c8ec9d8b9b46d77e204b0be94a2361973f48eed5ae2e968cc5"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #1: If anonymized user #1 becomes unavailable, 27 significant file(s) lose their only recent owner (largest: Source/EventFlow/Core/ReflectionHelper.cs). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f40e15266365e08248562b9e361afdbd37876480ab4685efd0b9ecf5bd20bfdb"}},{"ruleId":"D17","level":"warning","message":{"text":"BarePragmaDisable: #pragma warning disable Wintellect010"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.EntityFramework/EventStores/EntityFrameworkEventPersistence.cs"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccb99ee61c0efa90c3c5a52829cd49d84405db8c46206e49b9dc3c90bef922ba"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Assert list of legs \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":"Source/EventFlow.Examples.Shipping.Tests/UnitTests/ExternalServices/Routing/RoutingServiceTests.cs"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"547e554962568f0211f7183b5079f6a01a7fd324b34fc45c3cef6f3fb002d4ea"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Do we really want 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":"Source/EventFlow.Examples.Shipping/Domain/Model/CargoModel/Entities/TransportLeg.cs"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"7af56221061bca901190a9451a41f01b74e75462a9f39d6a007bc4b3734d80bc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Tell domain that a new itinerary could not be found \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":"Source/EventFlow.Examples.Shipping/Domain/Model/CargoModel/Jobs/VerifyCargoItineraryJob.cs"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"44dd13c66aa9753c53261e42f57fe2464cf5b0f5d771495647902141ed3a2323"}},{"ruleId":"D17","level":"warning","message":{"text":"BarePragmaDisable: #pragma warning disable CS0618"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.Hangfire.Tests/Integration/HangfireJobRunnerBackwardCompatibilityTests.cs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"57f4a0c6b68a3a93383f31d262055c054db87f0feff0934707d8c0de1e951d74"}},{"ruleId":"D17","level":"warning","message":{"text":"ObsoleteWithCallers: [Obsolete] ExecuteAsync"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.Hangfire/Integration/HangfireJobRunner.cs"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d000620c79cfb25027ed13df987deb13b90a11432b9aed939ef3c8047243604"}},{"ruleId":"D17","level":"warning","message":{"text":"ObsoleteWithCallers: [Obsolete] ExecuteAsync"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.Hangfire/Integration/HangfireJobRunner.cs"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d000620c79cfb25027ed13df987deb13b90a11432b9aed939ef3c8047243604"}},{"ruleId":"D17","level":"warning","message":{"text":"ObsoleteWithCallers: [Obsolete] ExecuteAsync"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.Hangfire/Integration/IHangfireJobRunner.cs"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"00166b5f2e7d3e83db65239ffd6940b72f74f714cce1304c7698f39eef300022"}},{"ruleId":"D17","level":"warning","message":{"text":"ObsoleteWithCallers: [Obsolete] ExecuteAsync"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.Hangfire/Integration/IHangfireJobRunner.cs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"00166b5f2e7d3e83db65239ffd6940b72f74f714cce1304c7698f39eef300022"}},{"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":"Source/EventFlow.MsSql.Tests/IntegrationTests/EventStores/MsSqlEventStoreTests.cs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"351bf02cf30efc9fee78ddd4826e9e63cfcc26bea0f3a1de30e547c581df1b92"}},{"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":"Source/EventFlow.MsSql.Tests/IntegrationTests/ReadStores/MsSqlReadModelStoreTests.cs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"23b5e999811b7295e99cfafa7b1b15302c0fb8bdd1040bbe0c278ff99a78d12a"}},{"ruleId":"D17","level":"warning","message":{"text":"BarePragmaDisable: #pragma warning disable 618"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.MsSql.Tests/IntegrationTests/ReadStores/ReadModels/MsSqlThingyReadModel.cs"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"9572e8877216db3e97cf70e9872fc4d9338c500ed0e4b16f34841cad9c2412f8"}},{"ruleId":"D17","level":"warning","message":{"text":"BarePragmaDisable: #pragma warning disable 618"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.MsSql/ReadStores/MssqlReadModelStore.cs"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"a812891de3754bc91b1e702f7ffae082b352d0cdcab398865ddec88dbb982228"}},{"ruleId":"D17","level":"warning","message":{"text":"BarePragmaDisable: #pragma warning disable 618"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.PostgreSql.Tests/IntegrationTests/ReadStores/ReadModels/PostgresSqlThingyReadModel.cs"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"14f4476ec5d395b467476f93c17de38a2bd835c6d9ec3e6a0bbdb067bec6c89b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: remove \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":"Source/EventFlow.MsSql/Integrations/TableParameter.cs"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"24d20ef1e3ab0f2512bd44639e9c6ec7bc41e2f30743a4a044a020ffae74a7ec"}},{"ruleId":"D17","level":"warning","message":{"text":"ObsoleteWithCallers: [Obsolete] IMssqlReadModel"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.MsSql/ReadStores/IMssqlReadModel.cs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdc1a535aac740f898d34190c6f6326fe3c51131add50fae9b07b51fcf07e083"}},{"ruleId":"D17","level":"warning","message":{"text":"ObsoleteWithCallers: [Obsolete] MssqlReadModel"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.MsSql/ReadStores/MssqlReadModel.cs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"221fea25de497a24f126c9c5488b18f3a4e6612f08a189aabb2d670dea41bdfb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: As soon as RabbitMQ supports async/await, set to false \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":"Source/EventFlow.RabbitMQ/Integrations/RabbitMqConnectionFactory.cs"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b333aef7ee44a03b89a235d06507443ad824cd5f52edd9f28117fe0c1b6ad4d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Evil or not evil? Do a Task.Run here? \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":"Source/EventFlow.RabbitMQ/Integrations/RabbitMqPublisher.cs"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"f873868e9a27bdd1c7e8435fe71f956e8f6afd59c5731f5ac155a896ca8bc1ad"}},{"ruleId":"D17","level":"warning","message":{"text":"ObsoleteWithCallers: [Obsolete] LoadAggregateAsync"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.TestHelpers/Extensions/EventStoreExtensions.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d47f58783f859350dedd7da767d5b22501b54cac747df148abf9ed12e50f227"}},{"ruleId":"D17","level":"warning","message":{"text":"ObsoleteWithCallers: [Obsolete] LoadAggregateAsync"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow/EventStores/IEventStore.cs"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"73f10deec32de221d91d0b1149820687d7c19854168faa3382d05db875070679"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Kill process and its children \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":"Source/EventFlow.TestHelpers/ProcessHelper.cs"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"54a6b711943f3c98c160998a28e99a7eb8e35ae941b4e38aa8f5a7f99926c677"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Redesign this, NUnit 3 enforces TestCaseSource(...) to reference static \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":"Source/EventFlow.Tests/UnitTests/Core/VersionedTypes/VersionedTypeDefinitionServiceTestSuite.cs"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c920b3b0b3639dcec35a76e01cf80797af7520c2ca872b166503349e10c44dd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Redesign this, NUnit 3 enforces TestCaseSource(...) to reference static \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":"Source/EventFlow.Tests/UnitTests/Core/VersionedTypes/VersionedTypeDefinitionServiceTestSuite.cs"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c920b3b0b3639dcec35a76e01cf80797af7520c2ca872b166503349e10c44dd"}},{"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":"Source/EventFlow/EventStores/EventJsonSerializer.cs"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"5564c801ad31648b028ca9338b3d219630b5aeef8e0a1b77d444278e9b0b7a87"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Pass a real IAsyncEnumerable instead \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":"Source/EventFlow/EventStores/EventStoreBase.cs"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ec149397f4c9a7219c0c9c87d14c3698698e63acfb8731c6090270ea96ce452"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Pass a real IAsyncEnumerable instead \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":"Source/EventFlow/EventStores/EventStoreBase.cs"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ec149397f4c9a7219c0c9c87d14c3698698e63acfb8731c6090270ea96ce452"}},{"ruleId":"D17","level":"warning","message":{"text":"BarePragmaDisable: #pragma warning disable CS1998"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow/EventStores/EventUpgrader.cs"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"7707770e9794f3e6b110f10dc89fef4a72e0153c907b69bb9dad28058537b1c4"}},{"ruleId":"D17","level":"warning","message":{"text":"ObsoleteWithCallers: [Obsolete] UseResolverAggregateRootFactory"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow/Extensions/EventFlowOptionsAggregatesExtensions.cs"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"b680dba364142bf7bd9ca4bdc8f3fb7a4b3dd287e21801fef2a2070ee2530a03"}},{"ruleId":"D17","level":"warning","message":{"text":"ObsoleteWithCallers: [Obsolete] AddAggregateRoots"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow/Extensions/EventFlowOptionsAggregatesExtensions.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"b680dba364142bf7bd9ca4bdc8f3fb7a4b3dd287e21801fef2a2070ee2530a03"}},{"ruleId":"D17","level":"warning","message":{"text":"ObsoleteWithCallers: [Obsolete] AddAggregateRoots"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow/Extensions/EventFlowOptionsAggregatesExtensions.cs"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"b680dba364142bf7bd9ca4bdc8f3fb7a4b3dd287e21801fef2a2070ee2530a03"}},{"ruleId":"D17","level":"warning","message":{"text":"ObsoleteWithCallers: [Obsolete] AddAggregateRoots"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow/Extensions/EventFlowOptionsAggregatesExtensions.cs"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"b680dba364142bf7bd9ca4bdc8f3fb7a4b3dd287e21801fef2a2070ee2530a03"}},{"ruleId":"D17","level":"warning","message":{"text":"ObsoleteWithCallers: [Obsolete] UseReadStoreFor"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow/Extensions/EventFlowOptionsReadStoresExtensions.cs"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"21119e677abe73cadd5c4abb824dd46ca4f47370b4ccad749be3007fffa8038e"}},{"ruleId":"D17","level":"warning","message":{"text":"ObsoleteWithCallers: [Obsolete] AddSubscriber"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow/Extensions/EventFlowOptionsSubscriberExtensions.cs"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d9dfd72b9503c662c4b8ee19df9f074551c1d57a7845af141a693543f597892"}},{"ruleId":"D17","level":"warning","message":{"text":"ObsoleteWithCallers: [Obsolete] ThrowDomainErrorIfNotStatisfied"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow/Extensions/SpecificationExtensions.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9cef9bfba675d73298dbb95c85ead46acc8b0f795199136c688be2533632c16"}},{"ruleId":"D17","level":"warning","message":{"text":"ObsoleteWithCallers: [Obsolete] ISnapshotSerilizer"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow/Snapshots/ISnapshotSerilizer.cs"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"923e85e44280facb524e0b4765bca3e1879975c0937fcd4811bd33e73ffb04e5"}},{"ruleId":"D17","level":"warning","message":{"text":"ObsoleteWithCallers: [Obsolete] SnapshotSerilizer"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow/Snapshots/SnapshotSerilizer.cs"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"07887e47be8dcad7a4beedfe2c0d69ab3fdb7fae03a0b155f56380c57c9137f6"}},{"ruleId":"D17","level":"warning","message":{"text":"ObsoleteWithCallers: [Obsolete] PublishAsync"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow/Subscribers/IDomainEventPublisher.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"03aa70d7bb720792d8ebbb0ebf922a8c8fbb8636d1643c75cbeecec6387cfe0f"}},{"ruleId":"D17","level":"error","message":{"text":"NoWarnInCsproj: NU5128"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.SourceGenerators/EventFlow.SourceGenerators.csproj"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd69fd59a64869629ee728f4a8d4a5264f4ad95efcda3ea8f23e1cfc6a499fe1"}},{"ruleId":"D19","level":"note","message":{"text":"The README is a single page with no architecture or design docs; future branches such as EventFlow.Sql/MS SQL would require separate documentation.: Add an Architecture section describing the main components and how they interact, plus a Design section covering conventions, best practices, and migration patterns."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"README.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8772fa81802b238e2eac45a8a8619e11271ebb7941aac8ecd1409a3db3b79941"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: EventFlow(netstandard2.1): EventFlow(netstandard2.1): 1 % XML-doc coverage (13/971)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow/EventFlow.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0502837298e19ca2eb4baf24a88f511db0200afd8be229f1c3fc50ace00a9435"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: EventFlow.Examples.Shipping: EventFlow.Examples.Shipping: 0 % XML-doc coverage (0/192)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.Examples.Shipping/EventFlow.Examples.Shipping.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bcab61b3258e177ee2586c011ba1d256470fb46671ecc59b26469ed5a96d9e5"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: EventFlow.Examples.Shipping.Queries.InMemory: EventFlow.Examples.Shipping.Queries.InMemory: 0 % XML-doc coverage (0/29)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.Examples.Shipping.Queries.InMemory/EventFlow.Examples.Shipping.Queries.InMemory.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e7c6bc27299ead1bcd9c4174361f745f9478496c1667da1c84af671ef6f5369"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: EventFlow.Sql(netstandard2.1): EventFlow.Sql(netstandard2.1): 0 % XML-doc coverage (0/71)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.Sql/EventFlow.Sql.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd667c966161911b9c3c38afdc2a0e0dfb0e27616227efd5ab9585a95a658017"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: EventFlow.MsSql(netstandard2.1): EventFlow.MsSql(netstandard2.1): 0 % XML-doc coverage (0/83)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.MsSql/EventFlow.MsSql.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ac6d82572431a6c4e336c95ee3b5bed85864c41df97ef2007a7496cbd6c588f"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: EventFlow.PostgreSql(netstandard2.1): EventFlow.PostgreSql(netstandard2.1): 0 % XML-doc coverage (0/76)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.PostgreSql/EventFlow.PostgreSql.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ff80d9d0f9937a32fa6fb550a04fc02968ce388ca3a4d7bc5bbec191cabafdc"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: EventFlow.MongoDB(netstandard2.1): EventFlow.MongoDB(netstandard2.1): 0 % XML-doc coverage (0/73)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.MongoDB/EventFlow.MongoDB.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"34331a7202f1098bca61bd13fe12f2f0dc5489865d58bfb37c3eb5a5b88660fa"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: EventFlow.RabbitMQ(netstandard2.1): EventFlow.RabbitMQ(netstandard2.1): 0 % XML-doc coverage (0/49)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.RabbitMQ/EventFlow.RabbitMQ.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"62fb6d7f8787172711b3627888d9ddec142add1bd28ec20753d056e43075a7b8"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: EventFlow.Hangfire(netstandard2.1): EventFlow.Hangfire(netstandard2.1): 0 % XML-doc coverage (0/22)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.Hangfire/EventFlow.Hangfire.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d90b59a044c06c6664cfa3b1a58c654f10b5ec85e3019f95a05137ef123c2f3"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: EventFlow.SQLite(netstandard2.1): EventFlow.SQLite(netstandard2.1): 0 % XML-doc coverage (0/37)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.SQLite/EventFlow.SQLite.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f0877149aa194eb77a393f8fc97bbcc115be1f2e19a48fdba4c0e82d73b207e"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: EventFlow.EntityFramework(net8.0): EventFlow.EntityFramework(net8.0): 10 % XML-doc coverage (9/86)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.EntityFramework/EventFlow.EntityFramework.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7fadcf996913777ec9d752aa41d9fc7ab4bc256ec9547b7f275314c8615382e"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: EventFlow.SourceGenerators: EventFlow.SourceGenerators: 0 % XML-doc coverage (0/6)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.SourceGenerators/EventFlow.SourceGenerators.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"54ac77319241c119b52ffba373ea81119f0dce0462b00d6d2dce281713f31015"}},{"ruleId":"D21","level":"note","message":{"text":"Test classes and related types in the UnicodeTests namespace use non-ASCII characters (\u00E4, \u00F6) in their names, which is inconsistent with the rest of the codebase that uses ASCII-only identifiers.: Rename to ASCII-safe equivalents, e.g., Aggregat, Identitat1, Pung1Event. (symbols: EventFlow.Tests.IntegrationTests.UnicodeTests.Aggreg\u00E4t, EventFlow.Tests.IntegrationTests.UnicodeTests.Identit\u00E4t1, EventFlow.Tests.IntegrationTests.UnicodeTests.P\u00FCng1Event)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"b3951d73baff8bf60a5b22b70702a74188aab4b0af88d17dfcfecee0573c0572"}},{"ruleId":"D22","level":"warning","message":{"text":"Redundant/Confusing Overlap: The concrete class \u0060AggregateRoot\u0060 and its interface \u0060IAggregateRoot\u0060 both expose a \u0060CommitAsync\u0060 method. While technically one is an explicit interface implementation and the other is a direct method, the naming and signature overlap creates confusion about which to use. More critically, \u0060AggregateStore\u0060 also has a \u0060StoreAsync\u0060 and \u0060UpdateAsync\u0060 which handle persistence, but \u0060AggregateRoot.CommitAsync\u0060 is the domain-level operation that triggers persistence. The inconsistency is that \u0060AggregateRoot\u0060 exposes \u0060CommitAsync\u0060 which returns \u0060IReadOnlyCollection\u003CIDomainEvent\u003E\u0060, whereas \u0060AggregateStore\u0060 exposes \u0060StoreAsync\u0060 which also returns \u0060IReadOnlyCollection\u003CIDomainEvent\u003E\u0060. This suggests a potential duplication of intent: one for domain-level commit and one for storage-level store. However, the bigger issue is the naming convention for loading: \u0060AggregateStore.LoadAsync\u0060 vs \u0060EventStoreBase.LoadEventsAsync\u0060 vs \u0060EventStoreBase.LoadAggregateAsync\u0060.: Ensure \u0060AggregateRoot.CommitAsync\u0060 is clearly the domain operation, while \u0060AggregateStore\u0060 methods are infrastructure. Consider renaming \u0060AggregateStore.StoreAsync\u0060 to \u0060PersistAsync\u0060 or similar to distinguish from \u0060AggregateRoot.CommitAsync\u0060. (signatures: Task\u003CIReadOnlyCollection\u003CIDomainEvent\u003E\u003E AggregateRoot\u003CTAggregate, TIdentity\u003E.CommitAsync(...) | Task\u003CIReadOnlyCollection\u003CIDomainEvent\u003E\u003E IAggregateRoot.CommitAsync(...))"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ddefd332d223fcd51766fdff89f63981c9cbd7f209efbf0b7a42f51fb1d26a26"}},{"ruleId":"D22","level":"warning","message":{"text":"Overloaded Method with Different Return Types: \u0060AggregateStore\u0060 (and its interface \u0060IAggregateStore\u0060) has two \u0060UpdateAsync\u0060 methods. One returns \u0060IReadOnlyCollection\u003CIDomainEvent\u003E\u0060 and the other returns \u0060IAggregateUpdateResult\u003CTExecutionResult\u003E\u0060. While the signatures are distinct enough (different generic parameters), the name \u0060UpdateAsync\u0060 is used for two very different operations: one that just persists events and one that executes a command and returns a result. This is a minor inconsistency in naming clarity.:  (signatures: Task\u003CIReadOnlyCollection\u003CIDomainEvent\u003E\u003E AggregateStore.UpdateAsync\u003CTAggregate, TIdentity\u003E(...) | Task\u003CIAggregateUpdateResult\u003CTExecutionResult\u003E\u003E AggregateStore.UpdateAsync\u003CTAggregate, TIdentity, TExecutionResult\u003E(...))"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"050c2b792533de7e8c1e6e5ce910ee80fec71f8e95208e90d77ef71243b188a9"}},{"ruleId":"D23","level":"note","message":{"text":"Bounded contexts not declared: At 29493 LoC spread over 78 projects the codebase is both large and multi-module, so explicit bounded contexts are warranted. Declare architecture.contexts (\u22652) in config to assess cross-boundary type coupling."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"1c7e276c9c682731f01819ed5378b90ca320cde1b583c90920172911598362b3"}},{"ruleId":"D24","level":"note","message":{"text":"redundant comment: \u0022The MIT License (MIT)\u0022 \u2014 delete - boilerplate license header restating the SPDX line"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.EntityFramework.Tests/EntityFrameworkTestExtensions.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"944f0b741fb6d9f3aaed21c697dbaaaeb2ef1c7d79dd3da82f0ceffaba3987cb"}},{"ruleId":"D24","level":"note","message":{"text":"redundant comment: \u0022subject to the following conditions:\u0022 \u2014 delete - duplicate of \u0027subject to the following conditions\u0027 below the header; one is sufficient"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.EntityFramework.Tests/Model/EfThingyGetQueryHandler.cs"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"e82f69072ad5047cd5f8585092b223fa7482ae09d68398a09320cd2c85c8bdee"}},{"ruleId":"D24","level":"note","message":{"text":"redundant comment: \u0022IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\u0022 \u2014 delete - boilerplate license clause restating the implied grant"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.EntityFramework.Tests/MsSql/EfMsSqlSnapshotTests.cs"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a6dfeebf1c7c83a596597e2453fcf20ca15e89e089a9a27d115055b8043fd41"}},{"ruleId":"D24","level":"note","message":{"text":"redundant comment: \u0022https://github.com/eventflow/EventFlow\u0022 \u2014 delete - links to an external file; no WHY or constraint"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow.EntityFramework.Tests/MsSql/IncludeTests/PersonId.cs"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2158a84f3022b24e48221fe73f70ec6232fa035c9d4cda6d58cd6079fe06271"}},{"ruleId":"D26","level":"note","message":{"text":"Split EventFlow: A generic netstandard name that is huge and sprawls over 36 unrelated namespaces. Suggested: by namespace: EventSubscriptions, EventHandlers, EventFilters"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e7d57ba9949145e36b5e9e80191c335ee97bf5f668badf6105835b35b6a7645b"}},{"ruleId":"D27","level":"note","message":{"text":"Scattered collaborators: 84 % of calls cross a namespace and only 47 % 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":"D30","level":"error","message":{"text":"Critical CVE: System.Text.Encodings.Web 4.6.0: System.Text.Encodings.Web 4.6.0 (transitive) has a Critical advisory. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"3a1a2ce4b4e77184b5710a611a5181d9d65b01f953bfbfdb951707025affb788"}},{"ruleId":"D30","level":"error","message":{"text":"High CVE: System.Formats.Asn1 5.0.0: System.Formats.Asn1 5.0.0 (transitive) has a High advisory; affects 10 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"03b31df8570933308505a1624e4fd5ee0390537c65b94f5898a4ad85f2c0b177"}},{"ruleId":"D30","level":"error","message":{"text":"High CVE: System.Text.Json 6.0.0: System.Text.Json 6.0.0 (transitive) has a High advisory; affects 7 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"03f9fac878dcbf07aca7022f18e373fffff3a6521448932b27c09f1f7c846066"}},{"ruleId":"D30","level":"error","message":{"text":"High CVE: System.Text.RegularExpressions 4.3.0: System.Text.RegularExpressions 4.3.0 (transitive) has a High advisory; affects 4 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"b96b7173c4377d5bea4d6fd7b52323631c631c44172b743bec6f266c10a4e538"}},{"ruleId":"D30","level":"error","message":{"text":"High CVE: Snappier 1.0.0: Snappier 1.0.0 (transitive) has a High advisory; affects 2 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"535c841a79fa99ee910e3d9375e11ec02a2f8b10cd3cb316706fed34aaa88a27"}},{"ruleId":"D30","level":"error","message":{"text":"High CVE: SQLitePCLRaw.lib.e_sqlite3 2.1.11: SQLitePCLRaw.lib.e_sqlite3 2.1.11 (transitive) has a High advisory. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d246d75b65523bf2d2a40511b99aa4a99c398d84dce0bc89395442294f995af5"}},{"ruleId":"D30","level":"error","message":{"text":"High CVE: SQLitePCLRaw.lib.e_sqlite3 2.1.6: SQLitePCLRaw.lib.e_sqlite3 2.1.6 (transitive) has a High advisory. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f2298334374a8ad552bf08dd33c123201fb6d055ca950accf76ab4281db4fbe5"}},{"ruleId":"D30","level":"error","message":{"text":"High CVE: System.Text.Json 8.0.0: System.Text.Json 8.0.0 (transitive) has a High advisory. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"c475b5d776175d1181892c3e7e72c31acdbe224ac300e32808399947498db6c9"}},{"ruleId":"D30","level":"error","message":{"text":"High CVE: System.Text.Json 8.0.0: System.Text.Json 8.0.0 (transitive) has a High advisory. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"c475b5d776175d1181892c3e7e72c31acdbe224ac300e32808399947498db6c9"}},{"ruleId":"D30","level":"warning","message":{"text":"Medium CVE: Azure.Identity 1.10.3: Azure.Identity 1.10.3 (transitive) has a Medium advisory; affects 13 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"045e9eaf2ec62fceb60477dd379a801f46340dedb0c9415d1920e111d035db30"}},{"ruleId":"D30","level":"warning","message":{"text":"Medium CVE: Azure.Identity 1.10.3: Azure.Identity 1.10.3 (transitive) has a Medium advisory; affects 13 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"045e9eaf2ec62fceb60477dd379a801f46340dedb0c9415d1920e111d035db30"}},{"ruleId":"D30","level":"warning","message":{"text":"Medium CVE: Microsoft.Identity.Client 4.56.0: Microsoft.Identity.Client 4.56.0 (transitive) has a Medium advisory; affects 13 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"438d8dc74930ecd1b568daade46d8fe926bf9700c6d5ae5197bc71a6ee251442"}},{"ruleId":"D30","level":"warning","message":{"text":"Medium CVE: SharpCompress 0.30.1: SharpCompress 0.30.1 (transitive) has a Medium advisory; affects 2 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"00cb4b303392f15d10a6e6cba03898c053b2eca5b8ace5790990d10c0d0ab63f"}},{"ruleId":"D30","level":"warning","message":{"text":"Medium CVE: Microsoft.IdentityModel.JsonWebTokens 6.24.0: Microsoft.IdentityModel.JsonWebTokens 6.24.0 (transitive) has a Medium advisory. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"8c5befb86e53034ab72e241f96f9bcdd1112c97a565b97a680e23a0ef98049c9"}},{"ruleId":"D30","level":"warning","message":{"text":"Medium CVE: System.IdentityModel.Tokens.Jwt 6.24.0: System.IdentityModel.Tokens.Jwt 6.24.0 (transitive) has a Medium advisory. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9edcd1fe22279a6cdb47df108e8a3cf0b833bb878bb5bc4a9e1a92f2ae090c4d"}},{"ruleId":"D30","level":"note","message":{"text":"Low CVE: Microsoft.Identity.Client 4.56.0: Microsoft.Identity.Client 4.56.0 (transitive) has a Low advisory; affects 13 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"bc307a6ff4cf614c6ccb2a5e077e75ba347d63ab405d80a53a33cf01a7ee6ff8"}},{"ruleId":"D34","level":"note","message":{"text":"Dormant codebase: 164 of 171 significant files have no living knowledge \u2014 the codebase as a whole is dormant, not 164 separate risks. Re-engage owners or document before change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4c69f1e54b7dd6fe9029dd02df6ba8f8145b789f2f18dbdaa086c40ded49dba6"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: EventUpgrader.cs \u2194 ReadModelPopulator.cs: \u0060Source/EventFlow/EventStores/EventUpgrader.cs\u0060 and \u0060Source/EventFlow/ReadStores/ReadModelPopulator.cs\u0060 change together 50% of the time (6 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":"Source/EventFlow/EventStores/EventUpgrader.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d76e2a6e6737ace8ead1a47944585e3a1302bb8bd3715b17abbef6384147c247"}},{"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"}},{"ruleId":"D39","level":"note","message":{"text":"IL efficiency: 1 authored method(s) exceed the IL budget: 1 of 1189 first-party methods compile to oversized IL bodies (\u003E 250 instructions); worst: EventFlow.Aggregates.AggregateFactory/AggregateConstruction.CreateInstance @ Source/EventFlow/Aggregates/AggregateFactory.cs:109, 325 IL instructions; large bodies don\u0027t JIT-inline, which pulled this dimension to 10.0/10; splitting the hottest bodies recovers the most."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Source/EventFlow/Aggregates/AggregateFactory.cs"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"a749ae00abcb2226702f3a57a2dd4a8a604081c83cfb0de82598d4ac8ba34dd2"}}],"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-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}}}]}