{"$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":"D7","name":"Architectural Integrity","shortDescription":{"text":"Architectural Integrity"},"helpUri":"https://codehealth.canine.dev/dimensions/D7"},{"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"},{"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":"D24","name":"Comment Value","shortDescription":{"text":"Comment Value"},"helpUri":"https://codehealth.canine.dev/dimensions/D24"},{"id":"D25","name":"ADR Conformance","shortDescription":{"text":"ADR Conformance"},"helpUri":"https://codehealth.canine.dev/dimensions/D25"},{"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"},{"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"},{"id":"D31","name":"IaC \u0026 Container Security","shortDescription":{"text":"IaC \u0026 Container Security"},"helpUri":"https://codehealth.canine.dev/dimensions/D31"},{"id":"D32","name":"Data Compliance (PII/GDPR)","shortDescription":{"text":"Data Compliance (PII/GDPR)"},"helpUri":"https://codehealth.canine.dev/dimensions/D32"},{"id":"D33","name":"JS/npm Dependency Vulnerabilities","shortDescription":{"text":"JS/npm Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D33"},{"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"},{"id":"D37","name":"Vulnerability-disclosure Policy","shortDescription":{"text":"Vulnerability-disclosure Policy"},"helpUri":"https://codehealth.canine.dev/dimensions/D37"},{"id":"D38","name":"OSV Dependency Vulnerabilities","shortDescription":{"text":"OSV Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D38"}]}},"results":[{"ruleId":"D1","level":"warning","message":{"text":"ConsumerHub.OnConnectedAsync (cyclomatic 24): ConsumerHub.OnConnectedAsync has cyclomatic complexity 24 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Router/Hubs/Consumers/ConsumerHub.cs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"320602e3e2f571c35648c6de7d551e63043c423b5efa2f7c10ee10b73b3f573b"}},{"ruleId":"D2","level":"warning","message":{"text":"ConsumerHub.OnConnectedAsync (cognitive 39): ConsumerHub.OnConnectedAsync has cognitive complexity 39 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Router/Hubs/Consumers/ConsumerHub.cs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"c302cd554f20958d75200909450034061e3566f828c7b6df15c68e310b6ab3f2"}},{"ruleId":"D2","level":"warning","message":{"text":"RetentionBackgroundService.AnalyzeAndDeleteMessagesBasedOnComponent (cognitive 33): RetentionBackgroundService.AnalyzeAndDeleteMessagesBasedOnComponent has cognitive complexity 33 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Services/Background/RetentionBackgroundService.cs"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"add538fa19aed9af92adf74410c0577926c36ee7621e7817b5b3cb59f9c55e6d"}},{"ruleId":"D2","level":"warning","message":{"text":"RetentionBackgroundService.AnalyzeAndDeleteMessagesBasedOnProduct (cognitive 33): RetentionBackgroundService.AnalyzeAndDeleteMessagesBasedOnProduct has cognitive complexity 33 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Services/Background/RetentionBackgroundService.cs"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b2da5b11c590a9ba597e1faa479b70bc76df8374d7ff8b9b59ae68097ddc22a"}},{"ruleId":"D2","level":"warning","message":{"text":"RetentionBackgroundService.AnalyzeAndDeleteMessagesBasedOnTenant (cognitive 33): RetentionBackgroundService.AnalyzeAndDeleteMessagesBasedOnTenant has cognitive complexity 33 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Services/Background/RetentionBackgroundService.cs"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e8ded118c0096a937f75c8918e343d8d10c7ded508f880feba0229529cec637"}},{"ruleId":"D2","level":"warning","message":{"text":"ProducerHub.OnConnectedAsync (cognitive 19): ProducerHub.OnConnectedAsync has cognitive complexity 19 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Router/Hubs/Producers/ProducerHub.cs"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"164c3a6a9db83ac071a9d447bdac39e48552a708a2713b8d895ee97680403277"}},{"ruleId":"D2","level":"warning","message":{"text":"TenantStateService.AddSubscriptionConfiguration (cognitive 16): TenantStateService.AddSubscriptionConfiguration has cognitive complexity 16 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Services/App/TenantStateService.cs"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"07956324da2909197d190467602b5f9b1ba7b39170b3b79ba09590d33fbcdcbb"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: CoreState/CoreService.cs: FileTooLong \u2014 1050 lines, 0 methods."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Services/CoreState/CoreService.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"e07fc2db1fd4cbee86b33598de419b2c0e0e6aaf1b8d1041a1bad0305f19ee43"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: CoreRepository: TooManyMethods \u2014 477 lines, 99 methods."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Repositories/CoreState/CoreRepository.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"da03f58a8fad58e0e33afa6d88ace2007a82912f8854f85017b8e55c41f8fd27"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: CoreService: TooManyMethods \u2014 1028 lines, 53 methods."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Services/CoreState/CoreService.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3eae2f0dd36237098d48bd764e776e9dad3a1e1b3c3d01f9955b39d73e83222"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ClusterHubService: TooManyMethods \u2014 280 lines, 44 methods."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Router/Services/Clusters/ClusterHubService.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6fa815212c0a16984ce7993320a613c2b5f8bcd6dddc5822986e4c3df93fb82"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): src/Andy.X.Core/Services/Data/SubscriptionUnackedDataService.cs:30-51 | src/Andy.X.Core/Services/Data/SubscriptionUnackedReadonlyDataService.cs:32-53"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Services/Data/SubscriptionUnackedDataService.cs"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"be6d645e87bd9ac8309b7151db19aeba2862732ba0f508b18729851843c52112"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): src/Andy.X.Core/Services/Outbound/OutboundMessageService.cs:65-78 | src/Andy.X.Core/Services/Outbound/OutboundMessageService.cs:104-117"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Services/Outbound/OutboundMessageService.cs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"86d497eee139024ce5d58a049e7c5a0ab7386955d0b7896b5754f2b0e7456b1e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/Andy.X.Core/Services/CoreState/CoreService.cs:1045-1057 | src/Andy.X.Core/Services/CoreState/CoreService.cs:1079-1091"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Services/CoreState/CoreService.cs"},"region":{"startLine":1045}}}],"partialFingerprints":{"codehealthFindingId/v1":"2685274ebe118db2c2c968357e342964301a82b67bb6e44a7000404bc2ab61c7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): src/Andy.X.Router/Hubs/Consumers/ConsumerHub.cs:77-89 | src/Andy.X.Router/Hubs/Producers/ProducerHub.cs:60-72"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Router/Hubs/Consumers/ConsumerHub.cs"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5b40326cb5876c1e566442084d6a9def42e373adc06138e9c1ed9f5a61e62bc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/Andy.X.Core/Services/CoreState/CoreService.cs:607-618 | src/Andy.X.Core/Services/CoreState/CoreService.cs:636-647"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Services/CoreState/CoreService.cs"},"region":{"startLine":607}}}],"partialFingerprints":{"codehealthFindingId/v1":"348c823b37d3ebde511b19f07f58dcc6f8ff9295760f1b104e7ffe19331c2306"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/Andy.X.Core/Services/CoreState/CoreService.cs:1414-1425 | src/Andy.X.Core/Services/CoreState/CoreService.cs:1579-1590"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Services/CoreState/CoreService.cs"},"region":{"startLine":1414}}}],"partialFingerprints":{"codehealthFindingId/v1":"348c823b37d3ebde511b19f07f58dcc6f8ff9295760f1b104e7ffe19331c2306"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/Andy.X.Router/Hubs/Consumers/ConsumerHub.cs:104-114 | src/Andy.X.Router/Hubs/Producers/ProducerHub.cs:83-93"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Router/Hubs/Consumers/ConsumerHub.cs"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a98f8d8ff89a94ed1a3ecc7520777ee2b9cffac2bb1a74c0e3a10fa102fcc5c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): src/Andy.X.App/Controllers/ProducersController.cs:142-151 | src/Andy.X.App/Controllers/SubscriptionsController.cs:84-93 | src/Andy.X.App/Controllers/SubscriptionsController.cs:162-171"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.App/Controllers/ProducersController.cs"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"72b52a22fae4538ad3937a4210446acee557fe9338e3aef58dfa8dc6c1786d25"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/Andy.X.App/Controllers/ComponentsController.cs:130-139 | src/Andy.X.App/Controllers/TopicsController.cs:172-181"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.App/Controllers/ComponentsController.cs"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f71c27f3a1a3e53320a5827cf498ce3d872d8e87b40ce56324b70b3a8885678"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/Andy.X.App/Controllers/ProducersController.cs:42-51 | src/Andy.X.App/Controllers/SubscriptionsController.cs:53-62"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.App/Controllers/ProducersController.cs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"870d0dbcaad70885f77214031c1c477268901cbe9030dd1b56665f79da773a0d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): src/Andy.X.App/Controllers/SubscriptionsController.cs:97-104 | src/Andy.X.App/Controllers/SubscriptionsController.cs:175-182"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.App/Controllers/SubscriptionsController.cs"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"13b3927f1f1786821eb064c428700efe210fd9c61d931ab992c97577eb9baeb3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 4): src/Andy.X.Router/Hubs/Consumers/ConsumerHub.cs:193-199 | src/Andy.X.Router/Hubs/Consumers/ConsumerHub.cs:201-207 | src/Andy.X.Router/Hubs/Consumers/ConsumerHub.cs:209-215 | src/Andy.X.Router/Hubs/Consumers/ConsumerHub.cs:230-236"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Router/Hubs/Consumers/ConsumerHub.cs"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"e15978b3e85d286a077e641451499ab5cb7d5723095719d36e1d07c7425ad88c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): src/Andy.X.Router/Hubs/Consumers/ConsumerHub.cs:173-178 | src/Andy.X.Router/Hubs/Consumers/ConsumerHub.cs:253-258 | src/Andy.X.Router/Hubs/Producers/ProducerHub.cs:172-177"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Router/Hubs/Consumers/ConsumerHub.cs"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c04bc72b00dc1c80b9fbaeef5a1a9eaa4192c1ee4f18d1fcefece0383301f13"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): src/Andy.X.Router/Hubs/Consumers/ConsumerHub.cs:217-222 | src/Andy.X.Router/Hubs/Consumers/ConsumerHub.cs:228-233"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Router/Hubs/Consumers/ConsumerHub.cs"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"b39d5181e5f09ed66623b5c384b911dcf999e318e386085511648cb9be397b22"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Andy.X.Utility: Andy.X.Utility: 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":"fe1d2aabd75f5259d859725235492ae34353176c444eabcfcbf2403873f5a9a4"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Andy.X.Model: Andy.X.Model: abstractness 0.00, instability 0.20, distance 0.80 \u2014 zone of pain \u2014 concrete and heavily depended-on, so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9c5e6137eb936a8c9c19cb2052c90953dc9488bbef83e50ba0c8ab35066dac32"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: CoreRepository (LCOM4 10): CoreRepository\u0027s methods form 10 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/Andy.X.Core/Repositories/CoreState/CoreRepository.cs"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"e92b39daf01c28d12180420b6d6154b4641335e6a8ab564f99f51e362c168466"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: CoreService (LCOM4 5): CoreService\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/Andy.X.Core/Services/CoreState/CoreService.cs"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe071949385ad019dea3526aff726436fe2e5a3c3374fe9b7431f3c910981046"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: ClusterRocksDbDataService (LCOM4 5): ClusterRocksDbDataService\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/Andy.X.Core/Services/Data/ClusterRocksDbDataService.cs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6518fd777ad70c649f1fefb9d9476705e173715720bd7756ee2a0bcf9f4642f"}},{"ruleId":"D7","level":"note","message":{"text":"No checkable ADRs to assess: No architecture decision records were found and the project graph is acyclic, so architectural integrity could not be assessed. Add ADRs (with \u0060enforcement: analyzer|test\u0060) to make the architecture\u0027s rules checkable."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9bfa095522c5f2e53a7c1c0405fd8830d318409a6fb74f4288bab05aaf716e52"}},{"ruleId":"D8","level":"error","message":{"text":"No automated tests: No automated tests \u2014 the solution has no test code. Untested code is the largest single risk to changing it safely."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"3132564c6310e5d01a231f252a02d5d2f5a542c0a8fa29a14c89693f1e3df871"}},{"ruleId":"D9","level":"note","message":{"text":"No tests found: No test projects found in the repository."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"c9bf64cbb5a4ae13d6bcd01fa3bc8d2879d860c73bc67f176ee3c2cecb8adce3"}},{"ruleId":"D11","level":"note","message":{"text":"Test reliability not included: No test projects found, so reliability couldn\u0027t be assessed."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"5321d5780c69918c88568cbf4cd5aa9147be611382bbba8e39f99b50cd7b16f8"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.VisualStudio.Azure.Containers.Tools.Targets: Microsoft.VisualStudio.Azure.Containers.Tools.Targets 1.17.0 \u2192 1.23.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"446bf9564187c39454637cb2540266113f6e25c50c7174c075c5017effe1bf5b"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Serilog.AspNetCore: Serilog.AspNetCore 6.0.1 \u2192 10.0.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"c541905d32e1db83986413f99d40843f5fdb7b6824af3058e03921b13d0fef06"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Serilog.Extensions.Logging: Serilog.Extensions.Logging 3.1.0 \u2192 10.0.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6acb625c1887e32e71958a49d9587e8589a9ce363971c3fe99fb262ebb62e2b6"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Serilog.Sinks.Console: Serilog.Sinks.Console 4.1.0 \u2192 6.1.1 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"a8ac878e794249794789c2aa02b06bf9fd84a2c7ada7b66d8be162175a35b46c"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Swashbuckle.AspNetCore: Swashbuckle.AspNetCore 6.4.0 \u2192 10.2.2 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"7072588f3b2ee7033c63d6a991ecaec0341a91e5761c9129d0e837df018c7856"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.EntityFrameworkCore: Microsoft.EntityFrameworkCore 7.0.0 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d6bc2cfd10f7debbe91b72d5c6f7efc119f7ab6934ee550f9b52ebd81d514ebe"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.EntityFrameworkCore.Sqlite: Microsoft.EntityFrameworkCore.Sqlite 7.0.0 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ca1f26ceea81e25ff353f12edb9683cd25576659307f775be3350af4c8f46ce2"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.Extensions.DependencyInjection.Abstractions: Microsoft.Extensions.DependencyInjection.Abstractions 7.0.0 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"975f7090c672cd42740e422628e485e691d2c29a30f7397b39d26918aeb57e4a"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.Extensions.Logging.Abstractions: Microsoft.Extensions.Logging.Abstractions 7.0.0 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"5d1d778014b65cbfa7ca8eb15a6eacf49d85cea868e48c56a7866e7acc38b158"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Newtonsoft.Json: Newtonsoft.Json 13.0.1 \u2192 13.0.4 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6bc3c45041773c780f3c71a5a4c37913170b10795bfed8949da7f32ecee66143"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: protobuf-net: protobuf-net 3.1.25 \u2192 3.2.56 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"77dc6131fcd7b47c40a833feeb6149a542aad7fca1d2eee4d5530fe9b754e645"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Cortex.Collections: Cortex.Collections 1.0.0-preview11 \u2192 Not available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"992bea3c2397150892bcfa7c6b1aa814e5ef2afbac7ef67377f5b76740e63931"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.AspNetCore.SignalR.Client: Microsoft.AspNetCore.SignalR.Client 7.0.0 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"c51794a467ff2d4f1b0094d21cab0e79bee51b06fe55caee3bb2722db4010b95"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: RocksDB: RocksDB 7.7.3.33461 \u2192 10.10.1.1747 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"df799d2ce04852756dd76c980166ddffb390d9ff64a81d9cf545fd0a293dc974"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.Extensions.Logging.Abstractions: Microsoft.Extensions.Logging.Abstractions 7.0.0 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"5d1d778014b65cbfa7ca8eb15a6eacf49d85cea868e48c56a7866e7acc38b158"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.AspNetCore.SignalR.Protocols.MessagePack: Microsoft.AspNetCore.SignalR.Protocols.MessagePack 7.0.0 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d60d55b588f4da00b940f3eba0bf2b41e3f10edf85dfd272dfc616ee7548ee18"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Newtonsoft.Json: Newtonsoft.Json 13.0.1 \u2192 13.0.4 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6bc3c45041773c780f3c71a5a4c37913170b10795bfed8949da7f32ecee66143"}},{"ruleId":"D14","level":"note","message":{"text":"Licenses scanned: 17 packages scanned; 3 distinct SPDX licenses."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"1d29d66daec20840f6831f63c1b66b87c40390635ef3e9f728002964c77e88d4"}},{"ruleId":"D16","level":"note","message":{"text":"Small-team knowledge concentration: 14 file(s) are concentrated to one author \u2014 the ambient state with 2 active author(s), not 14 separate risks. The signal becomes meaningful as ownership spreads; no per-file action implied now."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"8aa75b6daa18f1b578387fa04036c50b3163d47f957c8f5601bf083ed4489b0c"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: [e-mail redacted]: If [e-mail redacted] becomes unavailable, 14 significant file(s) lose their only recent owner \u2014 the largest single-person knowledge concentration (weighted toward the domain core). Pair, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"68ecd577821b25147bc8f81eab6e2043735b89918aed4c797803a97e1de17d70"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: /*TODO: create a model that has data for synchronization between nodes*/ \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/Andy.X.Core/Abstractions/Services/Clusters/IClusterHubService.cs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3612eae8837018f3fe82f05b9b383091847df5b8255a471baab839b64ddce4b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: Implement this Service to enable connection between Nodes with each-other, like in the cluster_configuration.json file. \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/Andy.X.Core/Abstractions/Services/Clusters/IClusterService.cs"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb29101d7a6e2305939558fe135e559ed3b11ce93da0e273e04e1491edd8bfcf"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ComponentEventHandler.cs"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa85c88928e8baccfe0e9daa067be1b2647c8bf1ad4f05991973e02986a59e6e"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ComponentEventHandler.cs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa85c88928e8baccfe0e9daa067be1b2647c8bf1ad4f05991973e02986a59e6e"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ComponentEventHandler.cs"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa85c88928e8baccfe0e9daa067be1b2647c8bf1ad4f05991973e02986a59e6e"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ComponentEventHandler.cs"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa85c88928e8baccfe0e9daa067be1b2647c8bf1ad4f05991973e02986a59e6e"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ComponentEventHandler.cs"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa85c88928e8baccfe0e9daa067be1b2647c8bf1ad4f05991973e02986a59e6e"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ComponentEventHandler.cs"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa85c88928e8baccfe0e9daa067be1b2647c8bf1ad4f05991973e02986a59e6e"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ComponentEventHandler.cs"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa85c88928e8baccfe0e9daa067be1b2647c8bf1ad4f05991973e02986a59e6e"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ComponentEventHandler.cs"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa85c88928e8baccfe0e9daa067be1b2647c8bf1ad4f05991973e02986a59e6e"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ComponentEventHandler.cs"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa85c88928e8baccfe0e9daa067be1b2647c8bf1ad4f05991973e02986a59e6e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Log 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/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ConsumerEventHandler.cs"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"233bec89cb9911afee525363f66a994b62063249a6020de6a647a9390a3a77cb"}},{"ruleId":"D17","level":"note","message":{"text":"Justified suppression: empty catch (Exception) \u2014 narrow/filtered/commented, treated as intentional"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ConsumerEventHandler.cs"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7194689bb6423b56943a6306c9093604168625b52e526f433f72fd18d2c14b7"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ConsumerEventHandler.cs"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6a933942263775c43f77ff3a25cdc38f950b779aaa0ed98b93d03135e073825"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/NodeEventHandler.cs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"a78fd2cf9512ff1606961bf2e7c91a602c3e067fba29f36e359901d384895f48"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/NodeEventHandler.cs"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"a78fd2cf9512ff1606961bf2e7c91a602c3e067fba29f36e359901d384895f48"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ProducerEventHandler.cs"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c08ce832cdc40bd52642c1d0d665ee02bfdea109ec724065900344daecbd91c"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ProducerEventHandler.cs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c08ce832cdc40bd52642c1d0d665ee02bfdea109ec724065900344daecbd91c"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ProducerEventHandler.cs"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c08ce832cdc40bd52642c1d0d665ee02bfdea109ec724065900344daecbd91c"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ProducerEventHandler.cs"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c08ce832cdc40bd52642c1d0d665ee02bfdea109ec724065900344daecbd91c"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ProductEventHandler.cs"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"f59e0215d265f31a52c37b7e32db0b746d0b76513e434418d11496565cb1cf02"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ProductEventHandler.cs"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"f59e0215d265f31a52c37b7e32db0b746d0b76513e434418d11496565cb1cf02"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ProductEventHandler.cs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"f59e0215d265f31a52c37b7e32db0b746d0b76513e434418d11496565cb1cf02"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ProductEventHandler.cs"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"f59e0215d265f31a52c37b7e32db0b746d0b76513e434418d11496565cb1cf02"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ProductEventHandler.cs"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"f59e0215d265f31a52c37b7e32db0b746d0b76513e434418d11496565cb1cf02"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ProductEventHandler.cs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"f59e0215d265f31a52c37b7e32db0b746d0b76513e434418d11496565cb1cf02"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ProductEventHandler.cs"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"f59e0215d265f31a52c37b7e32db0b746d0b76513e434418d11496565cb1cf02"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ProductEventHandler.cs"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"f59e0215d265f31a52c37b7e32db0b746d0b76513e434418d11496565cb1cf02"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/ProductEventHandler.cs"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"f59e0215d265f31a52c37b7e32db0b746d0b76513e434418d11496565cb1cf02"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Not implemented. \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/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/SubscriptionEventHandler.cs"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b09c7c02499d20c9b0886424d1e08240abfe454ef93552d00509fb0bde71fd6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Not implemented. \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/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/SubscriptionEventHandler.cs"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b09c7c02499d20c9b0886424d1e08240abfe454ef93552d00509fb0bde71fd6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Not implemented. \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/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/SubscriptionEventHandler.cs"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b09c7c02499d20c9b0886424d1e08240abfe454ef93552d00509fb0bde71fd6"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/SubscriptionEventHandler.cs"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ddad027e13d03ed41a65d7179a5636bd88003e709b87d169d62a80edbf8147f"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/SubscriptionEventHandler.cs"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ddad027e13d03ed41a65d7179a5636bd88003e709b87d169d62a80edbf8147f"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/TenantEventHandler.cs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"e17e1ca5d29c04656ec50e4fb9ab272e5544b9719c0a1752eca5a5a1d15ab3e4"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/TenantEventHandler.cs"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"e17e1ca5d29c04656ec50e4fb9ab272e5544b9719c0a1752eca5a5a1d15ab3e4"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/TenantEventHandler.cs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"e17e1ca5d29c04656ec50e4fb9ab272e5544b9719c0a1752eca5a5a1d15ab3e4"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/TenantEventHandler.cs"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"e17e1ca5d29c04656ec50e4fb9ab272e5544b9719c0a1752eca5a5a1d15ab3e4"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/TenantEventHandler.cs"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"e17e1ca5d29c04656ec50e4fb9ab272e5544b9719c0a1752eca5a5a1d15ab3e4"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/TenantEventHandler.cs"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"e17e1ca5d29c04656ec50e4fb9ab272e5544b9719c0a1752eca5a5a1d15ab3e4"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/TenantEventHandler.cs"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"e17e1ca5d29c04656ec50e4fb9ab272e5544b9719c0a1752eca5a5a1d15ab3e4"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/TenantEventHandler.cs"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"e17e1ca5d29c04656ec50e4fb9ab272e5544b9719c0a1752eca5a5a1d15ab3e4"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/TenantEventHandler.cs"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"e17e1ca5d29c04656ec50e4fb9ab272e5544b9719c0a1752eca5a5a1d15ab3e4"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/TopicEventHandler.cs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"997c433aecf7d0917c8d0a362e11778bd3cbade5ab4172634df987d20d5ebe6a"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/TopicEventHandler.cs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"997c433aecf7d0917c8d0a362e11778bd3cbade5ab4172634df987d20d5ebe6a"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Clusters/Synchronizer/Services/Handlers/TopicEventHandler.cs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"997c433aecf7d0917c8d0a362e11778bd3cbade5ab4172634df987d20d5ebe6a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: add logic to try 5 times, if not destroy the cluster if is the only main in the cluster. \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/Andy.X.Core/Clusters/Synchronizer/Services/NodeClusterEventService.cs"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"1112e43b15bab3ebffc924e97a68544487639290eaa757286dd5b7c491c7a997"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: I think this block here is useless \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/Andy.X.Core/Services/App/TenantStateService.cs"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"206c5de589106d1ddd06ec199eb8a527aaabb69b4ae95451d5819ed9c490e37f"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Services/App/TenantStateService.cs"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1a4992f6322a38e16d77ea3fcc307a2b218bca111fca9ecd67b1a27867d7d88"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement Clustering. \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/Andy.X.Core/Services/Inbound/InboundMessageService.cs"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"3aa3a7a266ad4f68647fca45fd2aad6771344f29b2a62074d928a3eaa58bd0c2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO Add logging 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/Andy.X.IO/Services/ClusterIOService.cs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"24d5f197b4b82874dafd603353c6172bf8080f4f0eb54f77d3420d2026a2127e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO Add logging 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/Andy.X.IO/Services/TenantIOService.cs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b120d11656b06e8a8cb14a318963afa48f498ed2a08daf1d59236eb11c36ff0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO Add logging 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/Andy.X.IO/Services/TenantIOService.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b120d11656b06e8a8cb14a318963afa48f498ed2a08daf1d59236eb11c36ff0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO Add logging 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/Andy.X.IO/Services/TenantIOService.cs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b120d11656b06e8a8cb14a318963afa48f498ed2a08daf1d59236eb11c36ff0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: CREATE db_log FILES 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":"src/Andy.X.IO/Services/TenantIOService.cs"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b120d11656b06e8a8cb14a318963afa48f498ed2a08daf1d59236eb11c36ff0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Add logging 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/Andy.X.IO/Services/TenantIOService.cs"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b120d11656b06e8a8cb14a318963afa48f498ed2a08daf1d59236eb11c36ff0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO: CREATE db_log FILES 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":"src/Andy.X.IO/Services/TenantIOService.cs"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b120d11656b06e8a8cb14a318963afa48f498ed2a08daf1d59236eb11c36ff0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO Add logging 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/Andy.X.IO/Services/TenantIOService.cs"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b120d11656b06e8a8cb14a318963afa48f498ed2a08daf1d59236eb11c36ff0"}},{"ruleId":"D18","level":"note","message":{"text":"Andy.X.App (Production): 23 .cs files, 2808 LoC (2278 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.App/Andy.X.App.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"94c80a71c5b4f94d4191ab8b107ff95bb954fead348d272ffd4d6ce07bb6242d"}},{"ruleId":"D18","level":"note","message":{"text":"Andy.X.Model (Production): 69 .cs files, 2238 LoC (1760 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Model/Andy.X.Model.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ae03adeea161c00761ecbb1485b4b6addafea0ad47c9aec0b37afe76a702e92"}},{"ruleId":"D18","level":"note","message":{"text":"Andy.X.Core (Production): 73 .cs files, 8631 LoC (6827 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Andy.X.Core.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bc279707f0ee20ffccfbffd5fe8b20e47478bd8f1543aab761ccafc99d63737"}},{"ruleId":"D18","level":"note","message":{"text":"Andy.X.IO (Production): 9 .cs files, 712 LoC (587 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.IO/Andy.X.IO.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d23a522ce9e65171302b9ce7f0a01ffae7f4ecd02ba0dcc0a51df5ea27b1eb12"}},{"ruleId":"D18","level":"note","message":{"text":"Andy.X.Router (Production): 10 .cs files, 1976 LoC (1658 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Router/Andy.X.Router.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b637ff6de2acf49bbc4d1381d23d324bd11fc2c8783bbd024914b603e8faef0a"}},{"ruleId":"D18","level":"note","message":{"text":"Andy.X.Utility (Production): 6 .cs files, 170 LoC (133 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Utility/Andy.X.Utility.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c391578c6c368cac9a888d9c9750027f9a1412d774af1134b7675940799401c"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: Andy.X.App: Andy.X.App: 0 % XML-doc coverage (0/137)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.App/Andy.X.App.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dadb21c134686547f63f08308f384b07b2ce9c11cc9b47ee9062c44476a383aa"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: Andy.X.Model: Andy.X.Model: 0 % XML-doc coverage (0/715)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Model/Andy.X.Model.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f84a0a2154291fcb8ba2b574183c77c7e746ff3f950bc9732ad47fd2336b8eb2"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: Andy.X.Core: Andy.X.Core: 0 % XML-doc coverage (0/504)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Andy.X.Core.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b43cdb74285c34720bfdfe4b1e868674037cc22bcb6ad2ba253e2b2b30e42b59"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: Andy.X.IO: Andy.X.IO: 0 % XML-doc coverage (0/83)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.IO/Andy.X.IO.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"90d3ad9e6fd5fde5b2b3d8159dd6f85b77e15a8ecba32bee2495f3626b922236"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: Andy.X.Router: Andy.X.Router: 0 % XML-doc coverage (0/112)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Router/Andy.X.Router.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b1596daf5b248b8616c4e6ce866a886603da61ea60ecddf4f4f36dcd7f26946"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: Andy.X.Utility: Andy.X.Utility: 0 % XML-doc coverage (0/21)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Utility/Andy.X.Utility.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9ffc42851a03f69d0b993b95c29d0f6f767a1d46afbd2cd7c905263ab3dbb06"}},{"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":"D22","level":"note","message":{"text":"No exposed public API: No intentionally-exposed types (IsPackable or .Contracts) to evaluate."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"2712d35e1d1ba8e91a90125d29842b77d4ca65e0eeaa52476c739f7165820a6f"}},{"ruleId":"D23","level":"note","message":{"text":"Bounded contexts not declared: With 13,571 lines of code across 6 projects, the codebase is large and multi-module, indicating distinct concerns that require explicit bounded contexts to assess coupling risks. 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: \u0022update in memory\u0022 \u2014 Remove. The code likely shows an in-memory update; if not, rename the variable/method to be more descriptive."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.App/Controllers/TenantsController.cs"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7e3240ced96b3a6e384a71479cdee073af0dddb06e1e37124a7af17879417e5"}},{"ruleId":"D24","level":"note","message":{"text":"redundant comment: \u0022Log.Logger = new LoggerConfiguration()\u0022 \u2014 Remove. This is a code snippet, not a comment explaining intent."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.App/Extensions/DependencyInjection/LoggingDependencyInjectionExtensions.cs"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"488f320ba34e28319acd81e7df77ab3b4f2aa7e8ff3429cf474f1f0a7aae1fe0"}},{"ruleId":"D24","level":"note","message":{"text":"redundant comment: \u0022tenant doesnot exists\u0022 \u2014 Remove. The error handling or null check preceding this comment makes the comment redundant."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Services/CoreState/CoreService.cs"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd16f16ec4c3cbcb6e7686c908d524842db8c2f40a2d41879be67373deda840a"}},{"ruleId":"D24","level":"note","message":{"text":"redundant comment: \u0022Product Related Tables\u0022 \u2014 Remove. The class or method name should be sufficient."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Contexts/CoreState/CoreStateContext.cs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"71dab70a245a23a0eeb780583209538295ac7c92e194c278e07816dcf530f9c6"}},{"ruleId":"D24","level":"note","message":{"text":"misleading comment: \u0022TODO: Implement this Service to enable connection between Nodes with each-other, like in the cluster_configuration.json file.\u0022 \u2014 If the code is implemented, remove the TODO. If not, ensure the code matches the TODO description."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Abstractions/Services/Clusters/IClusterService.cs"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc95cf3aff231cf7127f2c0d99192f2062432456ffb1208a5cdc156c58ee1814"}},{"ruleId":"D25","level":"note","message":{"text":"no ADRs to check: No ADRs found, so conformance can\u0027t be assessed."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"5f96235c58be08aaae505ba823e9095f206fbc6a447f646e346ee9bd81a5f481"}},{"ruleId":"D26","level":"note","message":{"text":"Split Andy.X.Core: The project contains a very high number of public types spread across an excessive number of namespaces, indicating a lack of cohesive responsibility. Suggested: by namespace: group the 51 namespaces into 3-4 distinct architectural layers or domains."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"22b6feb8d8ace15cdcbe321a30453d735f98ff9df17b9b279de92f6c4b4a0093"}},{"ruleId":"D27","level":"note","message":{"text":"High interface indirection: 30 % of calls go through an interface \u2014 tracing a call means resolving the implementation each hop. Prefer concrete types where there\u0027s a single implementation."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"cdce37f9abf7531f8d28e92afaa9d119cadea0ab8dd2d3958949c20b31f486ec"}},{"ruleId":"D30","level":"error","message":{"text":"High CVE: MessagePack 2.1.90: MessagePack 2.1.90 (transitive) has a High advisory; affects 6 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9de95adda239c8af4d4531dabe84f99525a1b2cb36b17b4464cc341b7523486a"}},{"ruleId":"D30","level":"error","message":{"text":"High CVE: SQLitePCLRaw.lib.e_sqlite3 2.1.2: SQLitePCLRaw.lib.e_sqlite3 2.1.2 (transitive) has a High advisory; affects 5 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ad2f7422cba66caf2d4b750054ec0e99cfcb234563e361025dfc2d8f9cc1b48f"}},{"ruleId":"D30","level":"error","message":{"text":"High CVE: System.Text.Json 7.0.0: System.Text.Json 7.0.0 (transitive) has a High advisory; affects 5 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e92ef47a93ca21416350b56c62426eaba052eb41d0e7c047d55f55bb678a833c"}},{"ruleId":"D30","level":"warning","message":{"text":"Medium CVE: MessagePack 2.1.90: MessagePack 2.1.90 (transitive) has a Medium advisory; affects 6 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"900cd968240a00975af04fd7ca1d83bf932c2077eb5ce3bb2f0e3494088965a2"}},{"ruleId":"D31","level":"error","message":{"text":"High IaC: DS-0002: Image user should not be \u0027root\u0027"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.App/Dockerfile"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"846c09f8528e4331cb8ce83ba2f77ec57be2351b9e6d7406483463a3233c10c0"}},{"ruleId":"D31","level":"error","message":{"text":"High IaC: DS-0029: \u0027apt-get\u0027 missing \u0027--no-install-recommends\u0027"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.App/Dockerfile"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"14ab9a966ae42725a691a01d19b334410fc8f545f5baa6e5930029887353d042"}},{"ruleId":"D31","level":"note","message":{"text":"Low IaC: DS-0026: No HEALTHCHECK defined"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.App/Dockerfile"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd01797fd058cce2b1ff641ba1b02a5e5adc5add553accfcf91b6aef21e7642a"}},{"ruleId":"D32","level":"note","message":{"text":"Not applicable: No PII/GDPR-handling patterns detected (p/gdpr ruleset) \u2014 no data-compliance surface to assess."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"df51e593e9b0b9805626d04fe36a3d12c504b5d7d5da30dc59b5b0f134b5753b"}},{"ruleId":"D33","level":"note","message":{"text":"Not applicable: No JS/npm manifest or lockfile found outside bin/obj (package.json, package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb); no JS dependencies to scan."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f46a134eeb447d8c90511e3106af3dac20b26868f5143d77eadbb96ed8f220c6"}},{"ruleId":"D34","level":"note","message":{"text":"Dormant codebase: 61 of 61 significant files have no living knowledge \u2014 the codebase as a whole is dormant, not 61 separate risks. Re-engage owners or document before change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4c69f1e54b7dd6fe9029dd02df6ba8f8145b789f2f18dbdaa086c40ded49dba6"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: CoreService.cs \u2194 ComponentSettings.cs: \u0060src/Andy.X.Core/Services/CoreState/CoreService.cs\u0060 (context Andy.X) and \u0060src/Andy.X.Model/Entities/Core/Components/ComponentSettings.cs\u0060 (context Andy.X.Model) live in DIFFERENT modules yet change together 73% of the time (8 shared commits) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Services/CoreState/CoreService.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a06578a725c537f84d9ea709ef1fb4fd52fdfcb447380a95763693e93abcf964"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: TenantsController.cs \u2194 ICoreRepository.cs: \u0060src/Andy.X.App/Controllers/TenantsController.cs\u0060 (context Andy.X.App) and \u0060src/Andy.X.Core/Abstractions/Repositories/CoreState/ICoreRepository.cs\u0060 (context Andy.X) live in DIFFERENT modules yet change together 69% of the time (11 shared commits) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.App/Controllers/TenantsController.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"75eae43111ed60af523371078c1b353e00bf87a7e8e238d6e33ef2174cf72e33"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: TenantsController.cs \u2194 CoreRepository.cs: \u0060src/Andy.X.App/Controllers/TenantsController.cs\u0060 (context Andy.X.App) and \u0060src/Andy.X.Core/Repositories/CoreState/CoreRepository.cs\u0060 (context Andy.X) live in DIFFERENT modules yet change together 65% of the time (13 shared commits) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.App/Controllers/TenantsController.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"73f000ad1b3936bf1c30280ae687778d7ccac91166f86f86a4602c9f89af4df5"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: Consumer.cs \u2194 ConsumerHubService.cs: \u0060src/Andy.X.Model/Consumers/Consumer.cs\u0060 (context Andy.X.Model) and \u0060src/Andy.X.Router/Services/Consumers/ConsumerHubService.cs\u0060 (context Andy.X.Router) live in DIFFERENT modules yet change together 65% of the time (11 shared commits) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Model/Consumers/Consumer.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b93434e6e9364de8643f9422d21cc527d34fe66a49204a246b4768e3b2173dd"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: IProducerHubRepository.cs \u2194 ProducerHubRepository.cs: \u0060src/Andy.X.Core/Abstractions/Repositories/Producers/IProducerHubRepository.cs\u0060 (context Andy.X) and \u0060src/Andy.X.Router/Repositories/Producers/ProducerHubRepository.cs\u0060 (context Andy.X.Router) live in DIFFERENT modules yet change together 64% of the time (7 shared commits) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/Andy.X.Core/Abstractions/Repositories/Producers/IProducerHubRepository.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"25f88a1657b2f38c98c7d26a570c870ce5aeca4663f1409232e0df7a5427367c"}},{"ruleId":"D36","level":"note","message":{"text":"Not applicable: No CI/build pipeline found (.github/workflows, .gitlab-ci.yml, azure-pipelines.yml, Jenkinsfile, .circleci); there is no build to attest provenance for."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"383f97e2d2c3d8c6d4adffc68d228db0928a3a8f5c3df1214c0f646687d2dbe9"}},{"ruleId":"D37","level":"note","message":{"text":"Not applicable: No vulnerability-disclosure policy file found (SECURITY.md, .github/SECURITY.md, docs/SECURITY.md, .well-known/security.txt). A coordinated-disclosure policy may live off-repo, so this is not evidenced rather than failed."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e748a9b8b3d154964dfb621b8675d34a302dda266d0196c5d83eb8ba4071d61c"}},{"ruleId":"D38","level":"note","message":{"text":"Not applicable: No JS/npm lockfile found outside bin/obj (package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb); nothing for OSV to scan."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6ff7301b610918095afd57ac1c89dabddab1d8fdb34c0f0d687159a5a0df0b8e"}}],"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}}}]}