{"$schema":"https://json.schemastore.org/sarif-2.1.0.json","version":"2.1.0","runs":[{"tool":{"driver":{"name":"codehealth","informationUri":"https://codehealth.canine.dev","rules":[{"id":"D1","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D1"},{"id":"D2","name":"Cognitive Complexity","shortDescription":{"text":"Cognitive Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D2"},{"id":"D3","name":"God Classes","shortDescription":{"text":"God Classes"},"helpUri":"https://codehealth.canine.dev/dimensions/D3"},{"id":"D4","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/D4"},{"id":"D5","name":"Coupling","shortDescription":{"text":"Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D5"},{"id":"D6","name":"Cohesion (LCOM4)","shortDescription":{"text":"Cohesion (LCOM4)"},"helpUri":"https://codehealth.canine.dev/dimensions/D6"},{"id":"D8","name":"Code Coverage","shortDescription":{"text":"Code Coverage"},"helpUri":"https://codehealth.canine.dev/dimensions/D8"},{"id":"D9","name":"Test Distribution","shortDescription":{"text":"Test Distribution"},"helpUri":"https://codehealth.canine.dev/dimensions/D9"},{"id":"D10","name":"Test Quality","shortDescription":{"text":"Test Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D10"},{"id":"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":"D20","name":"ADR Quality","shortDescription":{"text":"ADR Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D20"},{"id":"D21","name":"Naming Consistency","shortDescription":{"text":"Naming Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D21"},{"id":"D23","name":"Boundary Type-Coupling","shortDescription":{"text":"Boundary Type-Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D23"},{"id":"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":"D33","name":"JS/npm Dependency Vulnerabilities","shortDescription":{"text":"JS/npm Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D33","relationships":[{"target":{"id":"CWE-1395","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}]},{"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":"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","relationships":[{"target":{"id":"CWE-1395","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":"TelegramUserApiClient.ResolvePeerAsync (cyclomatic 55): TelegramUserApiClient.ResolvePeerAsync has cyclomatic complexity 55 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":2216}}}],"partialFingerprints":{"codehealthFindingId/v1":"95ae3e218129bcdb3d1784eb98580c0e04bbe3e7608ca11e4305290b20c7290f"}},{"ruleId":"D1","level":"warning","message":{"text":"CloudflareRadarCallbackHandler.FormatCountryReportMessage (cyclomatic 47): CloudflareRadarCallbackHandler.FormatCountryReportMessage has cyclomatic complexity 47 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/Cloudflare/CloudflareRadarCallbackHandler.cs"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe0c3f347df4c9b929237c66bfec17535211c60fdbecad37e1308e206ed4be36"}},{"ruleId":"D1","level":"warning","message":{"text":"ForwardingJobActions.ApplyEditOptions (cyclomatic 41): ForwardingJobActions.ApplyEditOptions has cyclomatic complexity 41 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":720}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f2e83b458fd801097ba9a2d8d7c12d86a348c12d506c2fe176463a2d2e43680"}},{"ruleId":"D1","level":"warning","message":{"text":"MessageForwardingService.HandleMessageAsync (cyclomatic 41): MessageForwardingService.HandleMessageAsync has cyclomatic complexity 41 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Services/MessageForwardingService.cs"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9865e344663d0ff98203d3967d1dc43fd5c5cf95fd4d6009cd01cbdb793f6fb"}},{"ruleId":"D1","level":"warning","message":{"text":"MarketDataService.CalculateDerivedFields (cyclomatic 38): MarketDataService.CalculateDerivedFields has cyclomatic complexity 38 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Services/MarketDataService.cs"},"region":{"startLine":386}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9354bd88c2ff198f8af4a4e84457a58b6a617573a7b8bd05e0d526cd83908a1"}},{"ruleId":"D1","level":"warning","message":{"text":"CryptoCallbackHandler.HandleAsync (cyclomatic 37): CryptoCallbackHandler.HandleAsync has cyclomatic complexity 37 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/CoinGecko/CryptoCallbackHandler.cs"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"cef4cb47885eb5e24f7c2ec345d2920a8d43e40788fa4b341ffd723ffcfe8fac"}},{"ruleId":"D1","level":"warning","message":{"text":"NotificationDispatchService.DispatchNewsNotificationAsync (cyclomatic 33): NotificationDispatchService.DispatchNewsNotificationAsync has cyclomatic complexity 33 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/NotificationDispatchService.cs"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdf497685c04078816598d954cf06e7bec9ed9647e99b1256da351e9fe05c119"}},{"ruleId":"D1","level":"warning","message":{"text":"testConnections (cyclomatic 31): testConnections has cyclomatic complexity 31 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/wwwroot/js/config.js"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"223e8bb8002cb114d169ba878783b0bcabacb793914055f273f9563135c9244e"}},{"ruleId":"D1","level":"warning","message":{"text":"CryptoDataOrchestrator.GetCryptoDetailsAsync (cyclomatic 30): CryptoDataOrchestrator.GetCryptoDetailsAsync has cyclomatic complexity 30 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Crypto/Services/CryptoDataOrchestrator.cs"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8ce030113506229153da5c6e1bdaee0448ea6342ded2a263aac9a1ea998edf5"}},{"ruleId":"D1","level":"warning","message":{"text":"(anonymous) (cyclomatic 26): (anonymous) has cyclomatic complexity 26 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/wwwroot/js/settings.js"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"04bd0e47e73bfe71a895e215f185503b57518833f89539486b70ab1f4ad7f0ac"}},{"ruleId":"D1","level":"warning","message":{"text":"TelegramUserApiClient.TelegramUserApiClient.ctor (cyclomatic 25): TelegramUserApiClient.TelegramUserApiClient.ctor has cyclomatic complexity 25 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"a763319924465892afa0819f58b7d835f2e4d42c9d44493760044b04ba85b8fc"}},{"ruleId":"D1","level":"warning","message":{"text":"NotificationSendingService.IsTransientException (cyclomatic 25): NotificationSendingService.IsTransientException has cyclomatic complexity 25 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"BackgroundTasks/Services/NotificationSendingService.cs"},"region":{"startLine":577}}}],"partialFingerprints":{"codehealthFindingId/v1":"a57cde34d6369f0ae27b4c2cdac9d10175d53906b72149afaaf6d4d725164438"}},{"ruleId":"D1","level":"warning","message":{"text":"ActualTelegramMessageActions.SendPhotoToTelegramWithRetryAsync (cyclomatic 25): ActualTelegramMessageActions.SendPhotoToTelegramWithRetryAsync has cyclomatic complexity 25 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/TelegramMessageSender.cs"},"region":{"startLine":722}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb4c4997199257bc5381d8695134286d2bfe5cfe63f77b69b09c5ff8391f6373"}},{"ruleId":"D1","level":"warning","message":{"text":"ForwardingJobActions.ProcessAndRelayMessageAsync (cyclomatic 24): ForwardingJobActions.ProcessAndRelayMessageAsync has cyclomatic complexity 24 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d20b353c52c7aeffdc3d9e224c7a34528510c667fa6bda0d1163d63e348c860"}},{"ruleId":"D1","level":"warning","message":{"text":"MarketDataService.FetchFromCoinGeckoProxyAsync (cyclomatic 24): MarketDataService.FetchFromCoinGeckoProxyAsync has cyclomatic complexity 24 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Services/MarketDataService.cs"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab18c7e099bd25f69c514d66a1eef199249c8210021767d7bc15381f49ae41a5"}},{"ruleId":"D1","level":"warning","message":{"text":"TelegramUserApiClient.GetMessagesAsync (cyclomatic 23): TelegramUserApiClient.GetMessagesAsync has cyclomatic complexity 23 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":1121}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c2cb2a0ad2c24cd8eb81597975d6193f5790e9a4edc2ba410fd23104a7f74fe"}},{"ruleId":"D1","level":"warning","message":{"text":"TelegramUserApiClient.SendMessageAsync (cyclomatic 23): TelegramUserApiClient.SendMessageAsync has cyclomatic complexity 23 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":1402}}}],"partialFingerprints":{"codehealthFindingId/v1":"fea0daa1cefd11b0c2c90cb887b33c69b58d828c3a4427f2916c66fd89878e76"}},{"ruleId":"D1","level":"warning","message":{"text":"MarketDataService.GetMarketDataAsync (cyclomatic 23): MarketDataService.GetMarketDataAsync has cyclomatic complexity 23 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Services/MarketDataService.cs"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"96b98b716f5965941587be9c43066b5845fe165846fa9ced050e3885d305493e"}},{"ruleId":"D1","level":"warning","message":{"text":"EconomicCalendarCallbackHandler.HandleReleasesViewAsync (cyclomatic 22): EconomicCalendarCallbackHandler.HandleReleasesViewAsync has cyclomatic complexity 22 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/EconomicCalendar/EconomicCalendarCallbackHandler.cs"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"aca49882841ee9af7e313c47287c514f7fe86ed40c3708dcc319120f336d00c5"}},{"ruleId":"D1","level":"warning","message":{"text":"GeminiService.AttemptApiCallAsync (cyclomatic 21): GeminiService.AttemptApiCallAsync has cyclomatic complexity 21 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/GeminiService.cs"},"region":{"startLine":415}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a2c754cdb21c7ee1fbd063f2e574eef988f916fa7b796c0f95b16d396a778e2"}},{"ruleId":"D1","level":"warning","message":{"text":"TelegramUserApiClient.AskCode (cyclomatic 21): TelegramUserApiClient.AskCode has cyclomatic complexity 21 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":555}}}],"partialFingerprints":{"codehealthFindingId/v1":"612911d7ab13ec9eb7a15ceb72041826fa55a805d9f9fdced6d2e63005b55f96"}},{"ruleId":"D1","level":"warning","message":{"text":"TelegramUserApiClient.HandleUpdatesBaseAsync (cyclomatic 20): TelegramUserApiClient.HandleUpdatesBaseAsync has cyclomatic complexity 20 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":689}}}],"partialFingerprints":{"codehealthFindingId/v1":"94aa9fdb5912cb8595e18e413da7936664ff059a682eadfd5a43d8293db772a1"}},{"ruleId":"D1","level":"warning","message":{"text":"MarketDataService.FetchFromFrankfurterSmartAsync (cyclomatic 20): MarketDataService.FetchFromFrankfurterSmartAsync has cyclomatic complexity 20 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Services/MarketDataService.cs"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d93b241c081669ebdf6eb9ad9493b4c7d68e230bfd9dfddb2ca574801e52f1d"}},{"ruleId":"D1","level":"warning","message":{"text":"ForwardingJobActions.ShouldProcessMessageBasedOnFilters (cyclomatic 19): ForwardingJobActions.ShouldProcessMessageBasedOnFilters has cyclomatic complexity 19 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f3e40db4ae8e8d055431fa821abf831c49a744217123cf946ffe38de0b75fe1"}},{"ruleId":"D1","level":"warning","message":{"text":"ServiceCollectionExtensions.AddInfrastructureServices (cyclomatic 19): ServiceCollectionExtensions.AddInfrastructureServices has cyclomatic complexity 19 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Data/ServiceCollectionExtensions.cs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d3c76723185daf9ab36f6b274fff6b87dcf4dbfc05ca9d76cd9846f7be472ef"}},{"ruleId":"D1","level":"warning","message":{"text":"CryptoPayApiClient.SendApiRequestAsync (cyclomatic 19): CryptoPayApiClient.SendApiRequestAsync has cyclomatic complexity 19 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/ExternalServices/CryptoPayApiClient.cs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"76dadba9cb10d2027bda19c09f2235c15f8a994ad0471826e7abba3dd4ff1fda"}},{"ruleId":"D1","level":"warning","message":{"text":"CryptoCallbackHandler.BuildCryptoListMessage (cyclomatic 19): CryptoCallbackHandler.BuildCryptoListMessage has cyclomatic complexity 19 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/CoinGecko/CryptoCallbackHandler.cs"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6a0859d0fb2c3a665f1682e08e14ba12050a163af91b90b7c366b23d2077d46"}},{"ruleId":"D1","level":"warning","message":{"text":"AdminCallbackHandler.HandleProMonitoringAsync (cyclomatic 18): AdminCallbackHandler.HandleProMonitoringAsync has cyclomatic complexity 18 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Admin/AdminCallbackHandler.cs"},"region":{"startLine":444}}}],"partialFingerprints":{"codehealthFindingId/v1":"485a5f84fd698ae701a640cdfbaff91e269a5ff1f80aba96b789ffa4cb1b1190"}},{"ruleId":"D1","level":"warning","message":{"text":"updateHangfireUI (cyclomatic 18): updateHangfireUI has cyclomatic complexity 18 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/wwwroot/js/status.js"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b9174f7761b3331f33490002a65a5c079eea1970d74317c34daf648713f3cc1"}},{"ruleId":"D1","level":"warning","message":{"text":"RssReaderService.UpdateRssSourceStatusAfterFetchOutcomeAsync (cyclomatic 17): RssReaderService.UpdateRssSourceStatusAfterFetchOutcomeAsync has cyclomatic complexity 17 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/RssReaderService.cs"},"region":{"startLine":1494}}}],"partialFingerprints":{"codehealthFindingId/v1":"b084174d1c35bcf3ed660d59783be1c6ee2295818375f9d00f50b5790a0a1d50"}},{"ruleId":"D1","level":"warning","message":{"text":"UserApiForwardingOrchestrator.HandleUserApiUpdateAsync (cyclomatic 17): UserApiForwardingOrchestrator.HandleUserApiUpdateAsync has cyclomatic complexity 17 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/UserApiForwardingOrchestrator.cs"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"06ad99a4f59cc61d334d56f467656db60fd086d8a246f01df9a146a620b7bfdb"}},{"ruleId":"D1","level":"warning","message":{"text":"ActualTelegramMessageActions.ActualTelegramMessageActions.ctor (cyclomatic 17): ActualTelegramMessageActions.ActualTelegramMessageActions.ctor has cyclomatic complexity 17 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/TelegramMessageSender.cs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"b063c04330800ce6d0696ca3e5ec8a7688aa032ac59207c3188734cbee5540fd"}},{"ruleId":"D1","level":"warning","message":{"text":"ForwardingJobActions.ProcessCustomSendAsync (cyclomatic 16): ForwardingJobActions.ProcessCustomSendAsync has cyclomatic complexity 16 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":443}}}],"partialFingerprints":{"codehealthFindingId/v1":"007bc6bf784daefdfba76bf2b49b15e98e9e97cdb3d76c4a280804576327bfc2"}},{"ruleId":"D1","level":"warning","message":{"text":"MarketAnalysisCallbackHandler.HandleAsync (cyclomatic 16): MarketAnalysisCallbackHandler.HandleAsync has cyclomatic complexity 16 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/Analysis/MarketAnalysisCallbackHandler.cs"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb1ea35bd0bab65bfab90a916e901abc02f3121e4116d6f7694b334652925467"}},{"ruleId":"D1","level":"warning","message":{"text":"EducationalContentHandler.SendFileAsync (cyclomatic 16): EducationalContentHandler.SendFileAsync has cyclomatic complexity 16 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/Educational/EducationalContentHandler.cs"},"region":{"startLine":531}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3fcd59905d35ea11a3bf3c74c337dfcc44a896b93b1837c58fc0084e72ff752"}},{"ruleId":"D1","level":"warning","message":{"text":"CustomCallerEnricher.FindActualCaller (cyclomatic 16): CustomCallerEnricher.FindActualCaller has cyclomatic complexity 16 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Logging/CustomCallerEnricher.cs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbc3476b1987b2bec1c601cc90533b4da699d5ef566f10bbb0362fe8efce0b05"}},{"ruleId":"D1","level":"warning","message":{"text":"CloudflareRadarService.GetCountryReportAsync (cyclomatic 16): CloudflareRadarService.GetCountryReportAsync has cyclomatic complexity 16 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Services/CloudflareRadarService.cs"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"191431cafe5be9dbb8e13f1bbd5e0d9c5e4e5f5b8f941efded2013c2bef65c01"}},{"ruleId":"D1","level":"warning","message":{"text":"viewLogContent (cyclomatic 16): viewLogContent has cyclomatic complexity 16 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/wwwroot/js/logs.js"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9e7a30dd4c8000809b85acc73db75d91d025c35bec0d612608eda60d2a4cbc2"}},{"ruleId":"D2","level":"warning","message":{"text":"ForwardingJobActions.ApplyEditOptions (cognitive 81): ForwardingJobActions.ApplyEditOptions has cognitive complexity 81 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":720}}}],"partialFingerprints":{"codehealthFindingId/v1":"87d42c9ea128b9d4651766c9fbdd9b7359e0c387e1cb121fb9fb1ffd9f996b65"}},{"ruleId":"D2","level":"warning","message":{"text":"TelegramUserApiClient.ResolvePeerAsync (cognitive 77): TelegramUserApiClient.ResolvePeerAsync has cognitive complexity 77 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":2216}}}],"partialFingerprints":{"codehealthFindingId/v1":"fefa969d450474224cb7ddab28d8fe77cd9cc8836efe1699d7c9e08f9f2c586d"}},{"ruleId":"D2","level":"warning","message":{"text":"CloudflareRadarCallbackHandler.FormatCountryReportMessage (cognitive 72): CloudflareRadarCallbackHandler.FormatCountryReportMessage has cognitive complexity 72 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/Cloudflare/CloudflareRadarCallbackHandler.cs"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8d5087b79a7cf79371dc864eb16726d2cb009b5684e52aca032ea28d5015319"}},{"ruleId":"D2","level":"warning","message":{"text":"CryptoCallbackHandler.HandleAsync (cognitive 52): CryptoCallbackHandler.HandleAsync has cognitive complexity 52 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/CoinGecko/CryptoCallbackHandler.cs"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"1164ec73be710fc344e29b9e2e96b61ea0f86e997844bc2d37b7eee79349323f"}},{"ruleId":"D2","level":"warning","message":{"text":"NotificationDispatchService.DispatchNewsNotificationAsync (cognitive 50): NotificationDispatchService.DispatchNewsNotificationAsync has cognitive complexity 50 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/NotificationDispatchService.cs"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee724bb6941c4262d9a4a5a531bb7eee967892bf0c65e7b18b974bd8425e3b69"}},{"ruleId":"D2","level":"warning","message":{"text":"TelegramUserApiClient.AskCode (cognitive 46): TelegramUserApiClient.AskCode has cognitive complexity 46 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":555}}}],"partialFingerprints":{"codehealthFindingId/v1":"69bb7588d7ed933db9588b216a90a931b19887eed3f72497b6ac3ca32b6d9777"}},{"ruleId":"D2","level":"warning","message":{"text":"MarketDataService.CalculateDerivedFields (cognitive 44): MarketDataService.CalculateDerivedFields has cognitive complexity 44 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Services/MarketDataService.cs"},"region":{"startLine":386}}}],"partialFingerprints":{"codehealthFindingId/v1":"52489bd2b124992867dada78b3210e0b84d760d4d61614c999b4f9218c111bb2"}},{"ruleId":"D2","level":"warning","message":{"text":"testConnections (cognitive 39): testConnections has cognitive complexity 39 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/wwwroot/js/config.js"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a3c376d004583ee7c6c0cad9a84a9819c12358ece2d6daf58c2fb3f6fb1f840"}},{"ruleId":"D2","level":"warning","message":{"text":"TelegramUserApiClient.HandleUpdatesBaseAsync (cognitive 38): TelegramUserApiClient.HandleUpdatesBaseAsync has cognitive complexity 38 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":689}}}],"partialFingerprints":{"codehealthFindingId/v1":"04811b3510f1a37dd94103de3a07e38f06af4152c6c2cf2bb533e38f91cd8415"}},{"ruleId":"D2","level":"warning","message":{"text":"MarketDataService.GetMarketDataAsync (cognitive 37): MarketDataService.GetMarketDataAsync has cognitive complexity 37 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Services/MarketDataService.cs"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d9b66d3725d70b2817800ea01b1cc64e5ce9298bbb08ea78a397953682829b7"}},{"ruleId":"D2","level":"warning","message":{"text":"MessageForwardingService.HandleMessageAsync (cognitive 37): MessageForwardingService.HandleMessageAsync has cognitive complexity 37 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Services/MessageForwardingService.cs"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f7f442c32d75444d23db5c818db65523625dce4f149f06cf5588c0b1a981c4b"}},{"ruleId":"D2","level":"warning","message":{"text":"(anonymous) (cognitive 37): (anonymous) has cognitive complexity 37 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/wwwroot/js/settings.js"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"66e8d7b4ef76b1124b5f7c66344100bda362e249dd17e02d0f49d89e5ce4902c"}},{"ruleId":"D2","level":"warning","message":{"text":"ActualTelegramMessageActions.SendPhotoToTelegramWithRetryAsync (cognitive 36): ActualTelegramMessageActions.SendPhotoToTelegramWithRetryAsync has cognitive complexity 36 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/TelegramMessageSender.cs"},"region":{"startLine":722}}}],"partialFingerprints":{"codehealthFindingId/v1":"89b6cc84ec3c5388180dfe13e8884cab60c4befdb378143f045f464acb81eeb1"}},{"ruleId":"D2","level":"warning","message":{"text":"EconomicCalendarCallbackHandler.HandleReleasesViewAsync (cognitive 33): EconomicCalendarCallbackHandler.HandleReleasesViewAsync has cognitive complexity 33 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/EconomicCalendar/EconomicCalendarCallbackHandler.cs"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"baaf6f09f6276fd1a5eb4c32059e9b310892d22824d478cbc3eb1ffa960bf2fa"}},{"ruleId":"D2","level":"warning","message":{"text":"CryptoDataOrchestrator.GetCryptoDetailsAsync (cognitive 30): CryptoDataOrchestrator.GetCryptoDetailsAsync has cognitive complexity 30 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Crypto/Services/CryptoDataOrchestrator.cs"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"225fe1c036e078f8e576670723a47406a29db36b2490999353b5532f78de9502"}},{"ruleId":"D2","level":"warning","message":{"text":"TelegramUserApiClient.SendMessageAsync (cognitive 30): TelegramUserApiClient.SendMessageAsync has cognitive complexity 30 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":1402}}}],"partialFingerprints":{"codehealthFindingId/v1":"02a0683401a1dda48225b45b74dd51566fae75156263231879790788e4fe8e9d"}},{"ruleId":"D2","level":"warning","message":{"text":"ForwardingJobActions.ShouldProcessMessageBasedOnFilters (cognitive 29): ForwardingJobActions.ShouldProcessMessageBasedOnFilters has cognitive complexity 29 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"2149b03bf49a94f0493e9fe481cc3b7065cb23e527888c5fb4f6a73f3e07e2be"}},{"ruleId":"D2","level":"warning","message":{"text":"CryptoCallbackHandler.BuildCryptoListMessage (cognitive 29): CryptoCallbackHandler.BuildCryptoListMessage has cognitive complexity 29 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/CoinGecko/CryptoCallbackHandler.cs"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"46f91be6df63b09dee33d7cbbb88bc4a19fe4732464ba0585f03ff3015f6dcb5"}},{"ruleId":"D2","level":"warning","message":{"text":"AdminCallbackHandler.HandleProMonitoringAsync (cognitive 27): AdminCallbackHandler.HandleProMonitoringAsync has cognitive complexity 27 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Admin/AdminCallbackHandler.cs"},"region":{"startLine":444}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3647e3b10e9923efc902288038fec88cbd1f94477077ee9588a9790c2790c18"}},{"ruleId":"D2","level":"warning","message":{"text":"TelegramUserApiClient.SendInPartsAsync (cognitive 26): TelegramUserApiClient.SendInPartsAsync has cognitive complexity 26 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":1541}}}],"partialFingerprints":{"codehealthFindingId/v1":"59cff95aa0242c450f8ad7e131dee4eee5284173962fa85f7fb067f7dce51883"}},{"ruleId":"D2","level":"warning","message":{"text":"ConfigController.TestConfiguration (cognitive 26): ConfigController.TestConfiguration has cognitive complexity 26 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/Controllers/ConfigController.cs"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"196b6bc9298370934b55285a4960d1d618b3cedd46d6f04d27dcd3517dc64530"}},{"ruleId":"D2","level":"warning","message":{"text":"ForwardingJobActions.ProcessCustomSendAsync (cognitive 25): ForwardingJobActions.ProcessCustomSendAsync has cognitive complexity 25 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":443}}}],"partialFingerprints":{"codehealthFindingId/v1":"eef5d182c4141abbaf9edfff8f4bdeaa974c2f0e9b63121c4654b639e8563ac5"}},{"ruleId":"D2","level":"warning","message":{"text":"RssReaderService.UpdateRssSourceStatusAfterFetchOutcomeAsync (cognitive 25): RssReaderService.UpdateRssSourceStatusAfterFetchOutcomeAsync has cognitive complexity 25 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/RssReaderService.cs"},"region":{"startLine":1494}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ba43985dd4a0fa098b67bd201b9f48160e9733b73461a89d24770ceb0692ad2"}},{"ruleId":"D2","level":"warning","message":{"text":"AdminCallbackHandler.HandleServerStatsAsync (cognitive 24): AdminCallbackHandler.HandleServerStatsAsync has cognitive complexity 24 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Admin/AdminCallbackHandler.cs"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4a834a3840b733fdfbf15b51f4bd7d183b1b9984283bc1b28f8fa8b31a95b1d"}},{"ruleId":"D2","level":"warning","message":{"text":"MarketAnalysisCallbackHandler.HandleAsync (cognitive 24): MarketAnalysisCallbackHandler.HandleAsync has cognitive complexity 24 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/Analysis/MarketAnalysisCallbackHandler.cs"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c21f2ffa686fb80cdb4dbed56166a830251c150f97246acbc6845ac401848f0"}},{"ruleId":"D2","level":"warning","message":{"text":"ServiceCollectionExtensions.AddInfrastructureServices (cognitive 23): ServiceCollectionExtensions.AddInfrastructureServices has cognitive complexity 23 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Data/ServiceCollectionExtensions.cs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"39d4969201bcae62480335fab3c1576b4a890e1c7d82413628137fa827d3dd02"}},{"ruleId":"D2","level":"warning","message":{"text":"TelegramUserApiClient.TelegramUserApiClient.ctor (cognitive 23): TelegramUserApiClient.TelegramUserApiClient.ctor has cognitive complexity 23 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b82c5b9c245030f35411e75777c136acb99e94d64ce9ad9829e93a86fa32e70"}},{"ruleId":"D2","level":"warning","message":{"text":"MarketDataService.FetchFromCoinGeckoProxyAsync (cognitive 23): MarketDataService.FetchFromCoinGeckoProxyAsync has cognitive complexity 23 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Services/MarketDataService.cs"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"17150a55cb0d405480bc6582153af53de89f2b54e6ad726b0dbcd27a43d1ef06"}},{"ruleId":"D2","level":"warning","message":{"text":"updateHangfireUI (cognitive 23): updateHangfireUI has cognitive complexity 23 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/wwwroot/js/status.js"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"320e6455b071fd32f1b6137cc2995fb79f05a69586732923d58d022a7421f0b8"}},{"ruleId":"D2","level":"warning","message":{"text":"FetchRssSourceManualQueryHandler.Handle (cognitive 22): FetchRssSourceManualQueryHandler.Handle has cognitive complexity 22 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Rss/Queries/FetchRssSourceManualQueryHandler.cs"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bc2e7c6c6c8ba6f69c105d28e7a940248b4ddd80b62737b308b19b384235857"}},{"ruleId":"D2","level":"warning","message":{"text":"CryptoPayApiClient.SendApiRequestAsync (cognitive 22): CryptoPayApiClient.SendApiRequestAsync has cognitive complexity 22 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/ExternalServices/CryptoPayApiClient.cs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"704d2325eb2f9bc967041fc3a96c5494f17883e635f8da70dae61a31a53576ef"}},{"ruleId":"D2","level":"warning","message":{"text":"EmbeddedRedisService.StartAsync (cognitive 22): EmbeddedRedisService.StartAsync has cognitive complexity 22 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/EmbeddedRedisService.cs"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8347a616721f1bbff61bd202eed614645734e10443abee99bd61d9471f218a3"}},{"ruleId":"D2","level":"warning","message":{"text":"TelegramUserApiClient.GetMessagesAsync (cognitive 21): TelegramUserApiClient.GetMessagesAsync has cognitive complexity 21 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":1121}}}],"partialFingerprints":{"codehealthFindingId/v1":"f63bd05a47001c4567d29b2f1f3fb672cd657488c69cca2fcc8258c97bbaac5c"}},{"ruleId":"D2","level":"warning","message":{"text":"UserApiForwardingOrchestrator.HandleUserApiUpdateAsync (cognitive 21): UserApiForwardingOrchestrator.HandleUserApiUpdateAsync has cognitive complexity 21 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/UserApiForwardingOrchestrator.cs"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d25e18afaa8f583c9860cd6677b6ee413f3b987b64b1528bbb5920a1b5d1925"}},{"ruleId":"D2","level":"warning","message":{"text":"updateConnectivityUI (cognitive 21): updateConnectivityUI has cognitive complexity 21 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/wwwroot/js/status.js"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"252f97ab22dc79de9315e7523940c86bdb89dafb8c9d6ef695717bd7729e107d"}},{"ruleId":"D2","level":"warning","message":{"text":"NewsSearchState.ProcessUpdateAsync (cognitive 20): NewsSearchState.ProcessUpdateAsync has cognitive complexity 20 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/States/NewsSearchState.cs"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c74f45f5e4eba9cad1840f6d0533996179eeeef403d73b3be53eaec35b60d49"}},{"ruleId":"D2","level":"warning","message":{"text":"GeminiService.AttemptApiCallAsync (cognitive 19): GeminiService.AttemptApiCallAsync has cognitive complexity 19 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/GeminiService.cs"},"region":{"startLine":415}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa7c250c3af5d90af79a2fa5c032981100ec5e6a782c2525c2a9aa4cffadda7f"}},{"ruleId":"D2","level":"warning","message":{"text":"RssReaderService.TryExtractFromMediaContent (cognitive 19): RssReaderService.TryExtractFromMediaContent has cognitive complexity 19 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/RssReaderService.cs"},"region":{"startLine":1926}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ac3cab466fb866f7150bf11d1eda0c22145a458c20e36136e7d50626171bf76"}},{"ruleId":"D2","level":"warning","message":{"text":"TelegramUserApiClient.ResolvePeer (cognitive 19): TelegramUserApiClient.ResolvePeer has cognitive complexity 19 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":391}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a2f0cb454eb26f4fb1e7189699f39d3bd83271dca96803c8922c1e5ff4332ec"}},{"ruleId":"D2","level":"warning","message":{"text":"AnalysisCallbackHandler.PerformSentimentAnalysisAsync (cognitive 19): AnalysisCallbackHandler.PerformSentimentAnalysisAsync has cognitive complexity 19 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/Analysis/AnalysisCallbackHandler.cs"},"region":{"startLine":350}}}],"partialFingerprints":{"codehealthFindingId/v1":"17d19683569aa2a15f60ee695feed188856997e13ae256bdb163307d8d8acbca"}},{"ruleId":"D2","level":"warning","message":{"text":"MarketDataService.FetchFromFrankfurterSmartAsync (cognitive 19): MarketDataService.FetchFromFrankfurterSmartAsync has cognitive complexity 19 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Services/MarketDataService.cs"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"940fa33028e90d728364ff0737a9d793463050c26a8a760cb232a58eb2eeb194"}},{"ruleId":"D2","level":"warning","message":{"text":"TelegramBotService.StartAsync (cognitive 19): TelegramBotService.StartAsync has cognitive complexity 19 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/TelegramBotService.cs"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"2102e1f656cbf6d9511fc189075cec16f77174ac91514c7f6791bbab58d668a3"}},{"ruleId":"D2","level":"warning","message":{"text":"viewLogContent (cognitive 19): viewLogContent has cognitive complexity 19 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/wwwroot/js/logs.js"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c2d9d55c7143297f62e80ef2f3dfc9d698ab50bddab19d612e4f5f3599493d9"}},{"ruleId":"D2","level":"warning","message":{"text":"ForwardingJobActions.ForwardingJobActions.ctor (cognitive 18): ForwardingJobActions.ForwardingJobActions.ctor has cognitive complexity 18 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb8365ceb5d4e4c9404bfffc473a6d6411241ea1d492ad3611853029630bbfbb"}},{"ruleId":"D2","level":"warning","message":{"text":"ForwardingJobActions.ProcessAndRelayMessageAsync (cognitive 18): ForwardingJobActions.ProcessAndRelayMessageAsync has cognitive complexity 18 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"db0475ac67790a9f1b95037073e32186dc4ec15412128e0e0bd84617bc7ce75e"}},{"ruleId":"D2","level":"warning","message":{"text":"DiagnosticsService.CheckConnectivityAsync (cognitive 18): DiagnosticsService.CheckConnectivityAsync has cognitive complexity 18 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/DiagnosticsService.cs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"424d21dbf336b6e7ba16ae174cc53722d6edeaf5ff8d864c7eb40038bb532dda"}},{"ruleId":"D2","level":"warning","message":{"text":"DynamicConfigurationService.GetAllSettingsAsync (cognitive 18): DynamicConfigurationService.GetAllSettingsAsync has cognitive complexity 18 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/DynamicConfigurationService.cs"},"region":{"startLine":291}}}],"partialFingerprints":{"codehealthFindingId/v1":"43522a7c7531899a51ae5c5097f07693647abe68a98a326df906bfc60a34d7bb"}},{"ruleId":"D2","level":"warning","message":{"text":"TelegramUserApiClient.TransferMessageFlags (cognitive 18): TelegramUserApiClient.TransferMessageFlags has cognitive complexity 18 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":483}}}],"partialFingerprints":{"codehealthFindingId/v1":"404235eca0ee0b08afee6c1a9660f694862869d51752c05138b6422502bb7bd6"}},{"ruleId":"D2","level":"warning","message":{"text":"NotificationSendingService.IsTransientException (cognitive 18): NotificationSendingService.IsTransientException has cognitive complexity 18 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"BackgroundTasks/Services/NotificationSendingService.cs"},"region":{"startLine":577}}}],"partialFingerprints":{"codehealthFindingId/v1":"e78a17187ef0dfe476602c0192517b31c9a252b8081bef4f2a749494fe1c1f03"}},{"ruleId":"D2","level":"warning","message":{"text":"NotificationSendingService.BuildTelegramKeyboard (cognitive 18): NotificationSendingService.BuildTelegramKeyboard has cognitive complexity 18 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"BackgroundTasks/Services/NotificationSendingService.cs"},"region":{"startLine":702}}}],"partialFingerprints":{"codehealthFindingId/v1":"438a30912a8dd9e8593f234df8a2add0e1ba26a01642e559d01e240cde400f4e"}},{"ruleId":"D2","level":"warning","message":{"text":"NewsNotificationCallbackHandler.HandleAsync (cognitive 18): NewsNotificationCallbackHandler.HandleAsync has cognitive complexity 18 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/News/NewsNotificationCallbackHandler.cs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0b40ea3285604850026259fe323f7f45863a4b002008872f2726131507ef06f"}},{"ruleId":"D2","level":"warning","message":{"text":"MarketDataService.GetCurrencyInfo (cognitive 18): MarketDataService.GetCurrencyInfo has cognitive complexity 18 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Services/MarketDataService.cs"},"region":{"startLine":517}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5e7881bd4139da793e9a337c2201488e8f399acfb43769b9e3b96715d9497f9"}},{"ruleId":"D2","level":"warning","message":{"text":"saveConfiguration (cognitive 18): saveConfiguration has cognitive complexity 18 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/wwwroot/js/config.js"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff6dfb8ed60fad5549b6672949a07f1e221d3e9f06ce3c5193b4f4043a9b0ceb"}},{"ruleId":"D2","level":"warning","message":{"text":"AdminLogger.Render (cognitive 17): AdminLogger.Render has cognitive complexity 17 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/GeminiService.cs"},"region":{"startLine":985}}}],"partialFingerprints":{"codehealthFindingId/v1":"d12940db94e2f8fb79ef7bd62df3acfb22bdb24c82cc126cb6cdeb4d34aec9f5"}},{"ruleId":"D2","level":"warning","message":{"text":"DynamicConfigurationService.UpdateSettingsAsync (cognitive 17): DynamicConfigurationService.UpdateSettingsAsync has cognitive complexity 17 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/DynamicConfigurationService.cs"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"214c78b4b4728e61cb8b574340735b34bd372545ed9cd261bc56c86572fd848c"}},{"ruleId":"D2","level":"warning","message":{"text":"Worker.ExecuteAsync (cognitive 17): Worker.ExecuteAsync has cognitive complexity 17 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"BackgroundTasks/Worker.cs"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ed1a9e4f1769b71d423250f88c34a73a6febb193c5c52e81e3995e29b066134"}},{"ruleId":"D2","level":"warning","message":{"text":"EducationalContentHandler.SendFileAsync (cognitive 17): EducationalContentHandler.SendFileAsync has cognitive complexity 17 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/Educational/EducationalContentHandler.cs"},"region":{"startLine":531}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9d6f37fef2738d2ac512be01ec797d1c6e749d169a9631cf1878d13294a8f66"}},{"ruleId":"D2","level":"warning","message":{"text":"TelegramBotService.StopAsync (cognitive 17): TelegramBotService.StopAsync has cognitive complexity 17 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/TelegramBotService.cs"},"region":{"startLine":578}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9284100824ffa5c0a9b5355e222d8fe072785361b6ed99bb0ff1afe39843d53"}},{"ruleId":"D2","level":"warning","message":{"text":"(anonymous) (cognitive 17): (anonymous) has cognitive complexity 17 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/wwwroot/js/settings.js"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"5076367600ea8c5f4270743ad274e0b3a5e3d419def6ff300affc476113ef060"}},{"ruleId":"D2","level":"warning","message":{"text":"MarkdownParserService.ProcessListBlock (cognitive 16): MarkdownParserService.ProcessListBlock has cognitive complexity 16 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/MarkdownParserService.cs"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e4267c8111dd2fcd0922f6d8a4400690d1b57d927e3eee8bec93b260a589566"}},{"ruleId":"D2","level":"warning","message":{"text":"CustomCallerEnricher.FindActualCaller (cognitive 16): CustomCallerEnricher.FindActualCaller has cognitive complexity 16 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Logging/CustomCallerEnricher.cs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"355aa8222a6513f0094490ebfaeb228ca1223f6b4ed303c26910a16d4cb554d8"}},{"ruleId":"D2","level":"warning","message":{"text":"CloudflareRadarService.GetCountryReportAsync (cognitive 16): CloudflareRadarService.GetCountryReportAsync has cognitive complexity 16 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Services/CloudflareRadarService.cs"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a998422dc6f018d9a61e5be4c84d6e0404819cbb96bafc597613920018c4c30"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Services/ForwardingJobActions.cs: FileTooLong \u2014 593 lines."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"0faa8ffd3a21ba0df3d298f6b54a728149d4786c01ca4572bdaa647eed0c4f32"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Services/GeminiService.cs: FileTooLong \u2014 595 lines."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/GeminiService.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"78a58954b7ac5067a8f0121cecb079440fbd125c7d712da4fee388475bffa056"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Repositories/UserRepository.cs: FileTooLong \u2014 763 lines."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Repositories/UserRepository.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"4db56f0e6ef6f621696e6e0727ecc4fe14426500ef6d5bdeab72839126a8cf70"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Services/AdviceService.cs: FileTooLong \u2014 2020 lines."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/AdviceService.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e37508c7d9837106cdf40bad32aae12363e8bd803b7548d765fb1d09f8224c6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Services/EmbeddedRedisService.cs: FileTooLong \u2014 1227 lines."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/EmbeddedRedisService.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"174d609b53fbc391a754602757ca79c2b562a0ca1661844f3ed7b2219b0fec6b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Services/RssReaderService.cs: FileTooLong \u2014 751 lines."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/RssReaderService.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"2166a27fec23647f3ccd174d2dbaf626e817cffa6c55b5c2b08ee6b18690002f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Services/TelegramUserApiClient.cs: FileTooLong \u2014 1336 lines."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b64955e14902fda4e48942d2eddc654b615ed34e11da16f9a34d2788c55050a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Settings/SettingsCallbackQueryHandler.cs: FileTooLong \u2014 697 lines."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Settings/SettingsCallbackQueryHandler.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d22dd6931cae694137134221de3db7cb9189eb7b6e7229f76df06821092381c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Infrastructure/TelegramMessageSender.cs: FileTooLong \u2014 577 lines."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/TelegramMessageSender.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"679de62a33508ead92012161204e8a33049a045b16dde1865b0967d65697ccf3"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: WebAPI/Program.cs: FileTooLong \u2014 753 lines."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/Program.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"6465f6e2599e8014ad249798fe53ba6233f65eb446c0a7536df124307d81e212"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ForwardingJobActions: ClassTooLong \u2014 579 lines, 11 methods."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"78f0810ac998a7a309cba6746bac21334b2a570dcf71216df7c3c848a54b16ff"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: GeminiService: ClassTooLong \u2014 572 lines, 18 methods."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/GeminiService.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"35d56d1ae3164ed732c49eb0d21ad4d7d5601fe8e8d8290d9e8fc5a8c5d0ebf1"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: NotificationSendingService: ClassTooLong \u2014 438 lines, 15 methods."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"BackgroundTasks/Services/NotificationSendingService.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b4a20de3016544a37a34e1845bd4c9268bf61202bb0f54755978b5a3b0c7d40"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: NewsItemRepository: ClassTooLong \u2014 405 lines, 14 methods."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Persistence/Configurations/NewsItemRepository.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dbc574eafd56eb9239d507745549da6e6b9f17f6a8eacfd092c5614759d150b"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: UserRepository: ClassTooLong \u2014 716 lines, 19 methods."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Repositories/UserRepository.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9fd83567e3f7aa59ef3918905e985240a6fd0813fee9b45950534d562fe1d39"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AdviceService: ClassTooLong \u2014 2017 lines, 5 methods."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/AdviceService.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cc54cbc6254af6184b2f8db42f88620eac7d7c94bde4da7ab334ecb619ad7a7"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: FallbackRedisService: TooManyMethods \u2014 85 lines, 32 methods."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/EmbeddedRedisService.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fcf603c2774ea0d80ba467ef039dfd8ef9fa17e8350fde104b25367d26b494d"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: FallbackDatabase: TooManyMethods \u2014 984 lines, 485 methods."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/EmbeddedRedisService.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bb733917b1215094acf1ad5f5a10a09f89e9a92efce957865948b2a5820a14b"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: RssReaderService: TooManyMethods \u2014 713 lines, 32 methods."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/RssReaderService.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"cde217f7d90b46a5ea3659b904db889587386e90faa3fb4d9202f7fb9be99f4d"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: TelegramUserApiClient: TooManyMethods \u2014 1286 lines, 37 methods."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"410f48f39ade26cc4d0ab611d5b7731f73d17654d19c399ee2724e403b44b484"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: EducationalContentHandler: ClassTooLong \u2014 423 lines, 18 methods."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/Educational/EducationalContentHandler.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"2666e463f1674b12fab138db8fcf42162cad0d8c31f2e0ac84af99faed6b90fa"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: SettingsCallbackQueryHandler: ClassTooLong \u2014 676 lines, 23 methods."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Settings/SettingsCallbackQueryHandler.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf9897b7c0f4f78877180e61125554a94f3f95abfd185e32cea307914effbf8e"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ActualTelegramMessageActions: ClassTooLong \u2014 546 lines, 18 methods."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/TelegramMessageSender.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"17a87f91065ab588d4e30adf3b6aa0ae3413be8f5c8b06521a77425af48fa368"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (32 lines \u00D7 2): Application/Services/SubscriptionService.cs:159-190 | Application/Services/SubscriptionService.cs:291-322"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/SubscriptionService.cs"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"45bf61cc14d120c9a0ca5c122ce4804e6ee96152a68fdb0279a0d3109e87f886"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (29 lines \u00D7 2): TelegramPanel/Application/CommandHandlers/Admin/AdminCallbackHandler.cs:215-243 | TelegramPanel/Application/CommandHandlers/Admin/AdminCallbackHandler.cs:646-673"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Admin/AdminCallbackHandler.cs"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a04eab9d521b7b91c43f282e50e34227e682e4205a8bd8fe68e3c4ce84d0751"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2): TelegramPanel/Application/CommandHandlers/Admin/AdminCallbackHandler.cs:326-352 | TelegramPanel/Application/CommandHandlers/Admin/AdminCallbackHandler.cs:372-397"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Admin/AdminCallbackHandler.cs"},"region":{"startLine":326}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2dbbab116f8e26e3279252c770080fcef2964b767b5e2e7f714ed03ccef37cc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): Infrastructure/Repositories/UserRepository.cs:1531-1553 | Infrastructure/Repositories/UserRepository.cs:1618-1639"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Repositories/UserRepository.cs"},"region":{"startLine":1531}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ebf4c38abb51b1e1f6cc40a8893c274ada3e8629ceef9e62de355749841a0ab"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): Application/Features/Forwarding/Services/ForwardingJobActions.cs:86-106 | Application/Features/Forwarding/Services/ForwardingJobActions.cs:138-158"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cc091b896ced9545c02cd2e91df2371d06a54f2ceb8d7ddfe5406420abf4aaa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): TelegramPanel/Infrastructure/Services/TelegramCallbackQueryHandler.cs:101-121 | TelegramPanel/Infrastructure/UpdateProcessingService.cs:329-349"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Services/TelegramCallbackQueryHandler.cs"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"22ac8c6f78699017e2a3de0430785243b62aba7667f53ef53b912e7cca13eec8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): Infrastructure/Services/Admin/AdminService.cs:68-84 | WebAPI/Controllers/LogController.cs:41-57"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/Admin/AdminService.cs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"e985b6c01ed6c40b76d720fc270e17cad0d96ad0169c7ba94cb4647efdb6ffcc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): Infrastructure/Services/Admin/AdminService.cs:112-128 | WebAPI/Controllers/LogController.cs:100-116"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/Admin/AdminService.cs"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"e985b6c01ed6c40b76d720fc270e17cad0d96ad0169c7ba94cb4647efdb6ffcc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): WebAPI/Controllers/LogController.cs:157-171 | WebAPI/Controllers/LogController.cs:303-317"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/Controllers/LogController.cs"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"d88319fff40b54d97bc1508633ac92b981dd41dcdf04b14d56e92bb1acee6ef1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): TelegramPanel/Application/CommandHandlers/Entry/CommandsListCommandHandler.cs:34-48 | TelegramPanel/Application/CommandHandlers/Entry/HelpCommandHandler.cs:29-41"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Entry/CommandsListCommandHandler.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f3c2fe111d53ae32032679e07ce3d46f4cca64dbacd08c493cf42c641b0477d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): Application/Features/Forwarding/Services/ForwardingJobActions.cs:50-63 | Application/Features/Forwarding/Services/ForwardingJobActions.cs:114-127"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd31817e4f42d2e643bbdd164e6b18614dc32628b32f3c1a746ed2f4a7643feb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): Infrastructure/Features/Forwarding/Repositories/ForwardingRuleRepository.cs:408-421 | Infrastructure/Features/Forwarding/Repositories/ForwardingRuleRepository.cs:469-482"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Features/Forwarding/Repositories/ForwardingRuleRepository.cs"},"region":{"startLine":408}}}],"partialFingerprints":{"codehealthFindingId/v1":"2633d56b08b22677f96d96809306b07f20fd3723b46db84c649306e5d92aa910"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): Infrastructure/Services/DashboardService.cs:19-24 | TelegramPanel/Application/Interfaces/IAdminStatsService.cs:26-39"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/DashboardService.cs"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d88919dc282be5341f92443d1a17b2be9aee26b68df1492e89c9618fb8ecfbc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): TelegramPanel/Application/CommandHandlers/Settings/SettingsCallbackQueryHandler.cs:614-627 | TelegramPanel/Application/CommandHandlers/Settings/SettingsCallbackQueryHandler.cs:660-673"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Settings/SettingsCallbackQueryHandler.cs"},"region":{"startLine":614}}}],"partialFingerprints":{"codehealthFindingId/v1":"27d1cfed8faa7eb0f3fde81b7155894664cf455cf5f13daf9e45b0e333de72ab"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 3): Infrastructure/Services/DynamicConfigurationService.cs:88-100 | WebAPI/Controllers/ConfigController.cs:47-58 | WebAPI/Controllers/ConfigController.cs:60-70"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/DynamicConfigurationService.cs"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fc04841e1084e7b56067a9fdb5b2b2492bf2041d93613ec38aecbf4f8eb0e19"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): Application/Features/Forwarding/Services/ForwardingJobActions.cs:123-135 | Application/Features/Forwarding/Services/ForwardingJobActions.cs:166-178"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"64f2e009bdb1b582d763de06f5622d6e3836f63dde991c6a96fd6f04aa0b7396"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): Infrastructure/Services/AdviceService.cs:2371-2383 | Infrastructure/Services/HashtagService.cs:282-290"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/AdviceService.cs"},"region":{"startLine":2371}}}],"partialFingerprints":{"codehealthFindingId/v1":"b584cb18c5cf8fa1a0e5be51950e4c9a817fe450c309713826e2e7019513ac7a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): WebAPI/Program.cs:1331-1340 | WebAPI/Program.cs:1400-1412"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/Program.cs"},"region":{"startLine":1331}}}],"partialFingerprints":{"codehealthFindingId/v1":"df261bfd5779fcc21ec976fea1b776bd0d2a50ae0818a652a214d06727755793"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): TelegramPanel/Application/States/Admin/ExecuteSqlState.cs:32-44 | TelegramPanel/Application/States/Admin/UserLookupState.cs:33-45"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/States/Admin/ExecuteSqlState.cs"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"7aa91f8f9b196fa5eac6786ebf65176d419f1d625684fe9af15781e287bbd172"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): Infrastructure/Hangfire/HangfireJobScheduler.cs:101-112 | Infrastructure/Hangfire/HangfireNotificationJobScheduler.cs:87-97"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Hangfire/HangfireJobScheduler.cs"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3d15749cd8cbfd33eeca68de66fbe0389a95280bb083b3373d52cea54eaac5f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): Infrastructure/Hangfire/HangfireJobScheduler.cs:121-132 | Infrastructure/Hangfire/HangfireNotificationJobScheduler.cs:126-136"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Hangfire/HangfireJobScheduler.cs"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3d15749cd8cbfd33eeca68de66fbe0389a95280bb083b3373d52cea54eaac5f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): Infrastructure/Services/TelegramUserApiClient.cs:2347-2358 | Infrastructure/Services/TelegramUserApiClient.cs:2384-2395"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":2347}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a4738f0e0ad7e834732dd4ebaa5d5fe5d396a0a068cfe3a444b3b7a6a3559d5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): TelegramPanel/Application/CommandHandlers/Features/Analysis/AnalysisCallbackHandler.cs:468-479 | TelegramPanel/Application/CommandHandlers/Features/Analysis/AnalysisCallbackHandler.cs:484-495"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/Analysis/AnalysisCallbackHandler.cs"},"region":{"startLine":468}}}],"partialFingerprints":{"codehealthFindingId/v1":"6943af387fad489c7e903ad6b545aa865e66fd348afa1243da21fb6d59bfec89"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 4): TelegramPanel/Application/CommandHandlers/Settings/SettingsCallbackQueryHandler.cs:461-470 | TelegramPanel/Application/CommandHandlers/Settings/SettingsCallbackQueryHandler.cs:703-713 | TelegramPanel/Application/CommandHandlers/Settings/SettingsCallbackQueryHandler.cs:1009-1019 | TelegramPanel/Application/CommandHandlers/Settings/SettingsCallbackQueryHandler.cs:1118-1128"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Settings/SettingsCallbackQueryHandler.cs"},"region":{"startLine":461}}}],"partialFingerprints":{"codehealthFindingId/v1":"22039111371bab7c4d53933c2b98af3cd589f6e36f08fe1974cb40a6a7fdfbf2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): Infrastructure/Services/RssReaderService.cs:1874-1884 | Infrastructure/Services/RssReaderService.cs:1885-1895 | Infrastructure/Services/RssReaderService.cs:1896-1906"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/RssReaderService.cs"},"region":{"startLine":1874}}}],"partialFingerprints":{"codehealthFindingId/v1":"442847283f9eee26fe2b5939b9c350e0e7116fef8eb1a95232366cc3fce473f9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): Shared/Security/ExceptionSanitizer.cs:455-465 | Shared/Security/ExceptionSanitizer.cs:479-489"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Shared/Security/ExceptionSanitizer.cs"},"region":{"startLine":455}}}],"partialFingerprints":{"codehealthFindingId/v1":"86f523b18637f3385497c3c11a82337d89dfc98374227064c80e72f3ac672ac6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): Infrastructure/Repositories/UserRepository.cs:66-74 | WebAPI/Program.cs:1490-1498"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Repositories/UserRepository.cs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6cef813128b95beef63868cc293c19a6c293bd081331145458872a3a5990850"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): Infrastructure/Services/TelegramUserApiClient.cs:2365-2373 | Infrastructure/Services/TelegramUserApiClient.cs:2401-2409"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":2365}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ea2b87d43a350f8a8f8e2814b5a551b20e6f3a017e9d7b77994645e8c4d0cbd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): TelegramPanel/Application/CommandHandlers/Features/News/NewsNotificationCallbackHandler.cs:128-136 | TelegramPanel/Application/CommandHandlers/Features/News/NewsNotificationCallbackHandler.cs:142-150"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/News/NewsNotificationCallbackHandler.cs"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec8d3f9efb3abb2114bcea094af6b3d4866f5869f9942991dcbc8963a9f28779"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): TelegramPanel/Infrastructure/Services/MarketDataService.cs:357-365 | TelegramPanel/Infrastructure/Services/MarketDataService.cs:367-375"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Services/MarketDataService.cs"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b34054bf7d1ef8c19cfe82e69d536928c92a76bb04600594413ed85015d2f98"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): Application/Features/Forwarding/Services/ForwardingJobActions.cs:244-250 | Application/Features/Forwarding/Services/ForwardingJobActions.cs:260-267"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"c148035e2cdbc71375d5b91d62bb84014d70adeeb33c26372c20eaee626f0b5e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): TelegramPanel/Infrastructure/Services/MarketDataService.cs:240-247 | TelegramPanel/Infrastructure/Services/MarketDataService.cs:267-274"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Services/MarketDataService.cs"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6b0a3f0edc1317bfd9d423846e3d71bd74b005306bca0492d81e46c2db0cab0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): TelegramPanel/Infrastructure/Services/MarketDataService.cs:249-256 | TelegramPanel/Infrastructure/Services/MarketDataService.cs:275-282"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Services/MarketDataService.cs"},"region":{"startLine":249}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6b0a3f0edc1317bfd9d423846e3d71bd74b005306bca0492d81e46c2db0cab0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): TelegramPanel/Infrastructure/UpdateProcessingService.cs:65-72 | TelegramPanel/Infrastructure/UpdateProcessingService.cs:80-87"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/UpdateProcessingService.cs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a453b537441150dd7a21a2ca82f396b61a434a48c051121f654fc79912ffc25"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): Infrastructure/Services/RssReaderService.cs:1895-1901 | Infrastructure/Services/RssReaderService.cs:1907-1913"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/RssReaderService.cs"},"region":{"startLine":1895}}}],"partialFingerprints":{"codehealthFindingId/v1":"b40f97a9864a2e7ca14c17dc3000356eb54b75a7332e7239db14298b1d4907aa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): TelegramPanel/Infrastructure/Services/MarketDataService.cs:273-279 | TelegramPanel/Infrastructure/Services/MarketDataService.cs:311-315"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Services/MarketDataService.cs"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3ddf9c1dee89671ca0f0824994a34f6690e458d2666400cbe8b24c9ad3c9f8b"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Domain: Domain: abstractness 0.09, instability 0.00, distance 0.91 \u2014 zone of pain \u2014 concrete and heavily depended-on, so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"706800fd37c7da4c1814bf4eaa84705d3da40e9ff88d663eede6e55d04fe8709"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Shared: Shared: abstractness 0.12, instability 0.00, distance 0.88 \u2014 zone of pain \u2014 concrete and heavily depended-on, so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9a6075584bf1a071b89754c93f688530ad9c449d73224f95d418320ea318e68b"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: LocalizationService.cs: 0.0% line coverage (0/58)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Shared/Utilities/LocalizationService.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"388c7bca86037bfd5947124b0fa643017e06f65bcd75e901779a7a4892d7f5ca"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: LocalizerDependencyInjection.cs: 0.0% line coverage (0/8)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Shared/Utilities/DependencyInjection/LocalizerDependencyInjection.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"22ede8bc98c45d0ff99d4c920cbe826a2bef82f2f627c2908f3067b579b1ff38"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: ExceptionSanitizer.cs: 0.0% line coverage (0/680)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Shared/Security/ExceptionSanitizer.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"29e4dcd63e6b110dc66c1fdcdf0e24931595f8ed6f7f1a7668091aef6ce5b13c"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: SecureExceptionSanitizer.cs: 0.0% line coverage (0/50)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Shared/Security/SecureExceptionSanitizer.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d7da6766c7fe77be1765af2f7da5304d1e07dcb983f631a238991236d7e51bd"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: Result.cs: 0.0% line coverage (0/54)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Shared/Results/Result.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"211f8745ff31d40c9861deb592c184342320f781fc04ef7259639359347d9b49"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: SqlServiceManager.cs: 0.0% line coverage (0/332)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Shared/Helpers/SqlServiceManager.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a165887cc2dbc92908be32edb0400c3134d52e046d1d98f04e591fe48709286d"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: RepositoryException.cs: 0.0% line coverage (0/24)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Shared/Extensions/RepositoryException.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b7dbbe8f79019cd498c9c12285568f00b80e3edd0fe82c209931b442927c49d"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: StringExtensions.cs: 0.0% line coverage (0/114)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Shared/Extensions/StringExtensions.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d5615c91a643e8b558a3514217e25e5bd5e0a85659861bbb75b64ca5f6b50ad"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: AppException.cs: 0.0% line coverage (0/28)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Shared/Exceptions/AppException.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8031339a6b8251759a5a68ee01f5ec378c048e118c2a2752119d2ae206bab297"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: TokenAmount.cs: 0.0% line coverage (0/80)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Domain/ValueObjects/TokenAmount.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8814373d62b113a16d30de56874bcae481876d0e35d92a63b6ae4bcbd79a5b01"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: TelegramSettings.cs: 0.0% line coverage (0/10)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Domain/Settings/TelegramSettings.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0eb2a140d927475d5799ae627695a07b200cf2e57d4021c0e27dc1a4639bd91"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: MessageFilterOptions.cs: 0.0% line coverage (0/86)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Domain/Features/Forwarding/ValueObjects/MessageFilterOptions.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"77d8ab865a36ac9f1ae7f263febe0e901a256e7ff094fd98536989a007cebf5c"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: MessageEditOptions.cs: 0.0% line coverage (0/102)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Domain/Features/Forwarding/ValueObjects/MessageEditOptions.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"af7a1974568c451c679c091f4320d50d1a95651e983cf85bcab7fa5993081510"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: TextReplacement.cs: 0.0% line coverage (0/38)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Domain/Features/Forwarding/ValueObjects/TextReplacement.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a7a81fe8762f7c3af24a25d2605e9f39789a4989f5565bfcfadf35dbef56ab0"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: ForwardingRule.cs: 0.0% line coverage (0/52)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Domain/Features/Forwarding/Entities/ForwardingRule.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f53089e3b0e2e031986061eff2d09f292f7367a2e4f41a2569e1e5230de7b50"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: AiApiConfiguration.cs: 0.0% line coverage (0/32)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Domain/Entities/AiApiConfiguration.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"989e79ff5282d65d80b41b7991acdb5cfcafca66c59715af9eaedc5472b0effc"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: ApplicationSetting.cs: 0.0% line coverage (0/28)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Domain/Entities/ApplicationSetting.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"823466f94062f36510928dc3dcd2db4ccd0bb9881203077ecb66f15f566093fa"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: NewsItem.cs: 0.0% line coverage (0/52)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Domain/Entities/NewsItem.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0f1b5bf7cb4cee96c795048cb648c1ce66b7abd2422eca13c390f9140a14366"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: RssSource.cs: 0.0% line coverage (0/50)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Domain/Entities/RssSource.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbdb9adb5555e824e81256b2bddb72b78a3fff659ad2e4bf0c84fe80f611ee71"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: Signal.cs: 0.0% line coverage (0/48)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Domain/Entities/Signal.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fffe4cdc996e58efc0e0ed0007b2319c90cd760d7c2152ee53291386842e7278"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: SignalAnalysis.cs: 0.0% line coverage (0/24)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Domain/Entities/SignalAnalysis.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a3f16eb71162e9f57e10b4953a08a1063f9871315bc40d9311e75f56b4125fd"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: SignalCategory.cs: 0.0% line coverage (0/28)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Domain/Entities/SignalCategory.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c786178392b31f3d3ecb538e9364ff517c156eb0c1165f1591f0574018986422"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: Subscription.cs: 0.0% line coverage (0/32)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Domain/Entities/Subscription.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"20eefe5664777e681ed6dfeb89431a299ffccba46f2ee8f50981ecf2e52aa391"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: TokenWallet.cs: 0.0% line coverage (0/96)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Domain/Entities/TokenWallet.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"76cf341597fe1e0addc27cb608a3be422f67b9c15264c7344ece6f8291cb546b"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: Transaction.cs: 0.0% line coverage (0/68)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Domain/Entities/Transaction.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7d429bfd197ec1a708fc6c3661a7ef1ef414beaaaaa08b0bdd7ef69d62e5670"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: User.cs: 0.0% line coverage (0/68)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Domain/Entities/User.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9850ff640f16f9fbf2816097383701f0d73ba1fea43df632eb13a187b77b74d"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: RedisNotificationRateLimiter.cs: 0.0% line coverage (0/32)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Crypto/Services/RedisNotificationRateLimiter.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"52601da386488c5577aac7a71c35f7213abfe57b1b7e4199a3f4ec042452cf77"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: CacheService.cs: 0.0% line coverage (0/26)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/Cashe/CacheService.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7825850a0585803ff2024dff23c16be10347ad215ddf3d2f091c77631aa0e695"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: DummyNotificationService.cs: 0.0% line coverage (0/12)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/DummyNotificationService.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"77b6fbd90a982e76c80dc11ca53ec0f59da28eafba5125d27baca846ffa59271"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: ServiceCollectionExtensions.cs: 0.0% line coverage (0/82)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/ServiceCollectionExtensions.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e93e678786e981bc6bf24c7f2e08b174f1a77175a8466027b54653cf75095058"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: DispatchException.cs: 0.0% line coverage (0/18)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/DispatchException.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad9782aa86fcfae0e7f2a16a1dac6e322c2c1485c9a87cd9d6334def56d6e5c6"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: GeminiService.cs: 0.0% line coverage (0/218)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/GeminiService.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0a66b3c93576bc64c2343fc538f1d91e1ab048f74328c9ca3e2f9b06031356f"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: PaymentConfirmationService.cs: 0.0% line coverage (0/30)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/PaymentConfirmationService.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cd466208edfd541d06fa49c1e164221c68bcc2cf5ef75feea6e579d7f7c33af"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: PaymentService.cs: 0.0% line coverage (0/38)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/PaymentService.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc38041a8a6914be9da26fcff30aa3150846a8a0001f9982ef07580d9b0ebce9"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: RedisDistributedThrottler.cs: 0.0% line coverage (0/34)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/RedisDistributedThrottler.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"28f2becd8a3a0a1eb6959c00683a861ac6314e423d88623fcc7f223cd949524e"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: SignalService.cs: 0.0% line coverage (0/26)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/SignalService.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"42fb3d576ba5feb4a62007f2d1bcb23ae82d6ad871587e92c5754488494af834"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: SubscriptionService.cs: 0.0% line coverage (0/26)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/SubscriptionService.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"431de797a0a1dcb225215c1d27d7c5e07c923f1e0708e2ee062934c53247fa36"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: UserService.cs: 0.0% line coverage (0/74)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/UserService.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"315e8bf0765a95d0394993d2e8891faff9982744643d370a70ac5f6bd34e1eed"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: EconomicCalendarService.cs: 0.0% line coverage (0/8)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/FredApi/EconomicCalendarService.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a0560bcec89324e490bef7b4b4381d305f028958cb2726adf9bf76e33592caf"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: CoinGeckoService.cs: 0.0% line coverage (0/22)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/CoinGecko/CoinGeckoService.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6684512ce93c57981115767166acecdd31a0a3ad29a36d64e6ab383d974e242f"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: FetchRssSourceManualQueryHandler.cs: 0.0% line coverage (0/18)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Rss/Queries/FetchRssSourceManualQueryHandler.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cb2fc2687f2fc333536b6c433ae9baf95559e8061c07d900afdfc56eb9d7a64"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: ForwardingJobActions.cs: 0.0% line coverage (0/934)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c01db96af39815592f5c86c3ef6ac89aaab60a2ffa9322fd9ec60b5820d4128"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: ForwardingService.cs: 0.0% line coverage (0/88)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingService.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"017d7768272d4e4515d53dc29548bd8547509de7205227465e48c769f1041f0f"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: MessageProcessingService.cs: 0.0% line coverage (0/64)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/MessageProcessingService.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bd4e55900d9e361d7b7c937160f2af31420eb2f14885207dc8eb155657f36cb"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: ServiceCollectionExtensions.cs: 0.0% line coverage (0/10)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Extensions/ServiceCollectionExtensions.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"029a69809ee831273e0d4be09e5c2d9eb5918ed02c60dcb3f534fa5adb9f98be"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: CryptoDataOrchestrator.cs: 0.0% line coverage (0/40)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Crypto/Services/CryptoDataOrchestrator.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3185bdc555beee57bcd8154073219b7648c801f38f8a2c2b3e053699da70e8b8"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: CryptoSymbolMapper.cs: 0.0% line coverage (0/172)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Crypto/Services/CryptoSymbolMapper.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5e1fb397176eb86df59488ab362bfb795c9eb4e39c76e900af2f7f621597c81"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: CoinGeckoApiClient.cs: 0.0% line coverage (0/76)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Crypto/Services/CoinGecko/CoinGeckoApiClient.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"db7fb2b429aca578fc79ce67320d408b425aff688e61bdf5fb113436d8c6232d"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: NotificationJobPayload.cs: 0.0% line coverage (0/30)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/DTOs/Notifications/NotificationJobPayload.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"463a4c9a7f017bc57f31defbcc5c456e6d5240e8fea3afe15d3506c78c991202"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: DynamicSettingDto.cs: 0.0% line coverage (0/56)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/DTOs/Admin/DynamicSettingDto.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ce15d898f2777df01e29d73a68a9eb828b8710c03aa8442e0f3708d65e0f6b6"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: GeminiErrors.cs: 0.0% line coverage (0/16)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Common/Models/GeminiErrors.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fad9f63f1daf91b446a11abf78f13bde96b14d7347bf562e1eeb9c604728f9aa"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: ResilientResponse.cs: 0.0% line coverage (0/10)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Common/Models/ResilientResponse.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8fc606ef506208c17cbe8b804944f7f37a0e1807ce2050cb857ce823d2b7aa6"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: MappingProfile.cs: 0.0% line coverage (0/70)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Common/Mappings/MappingProfile.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"29380ec12a9451df5032a5afb460d797f7952dc2b26c1b56e25b85af88e07697"}},{"ruleId":"D8","level":"warning","message":{"text":"CRAP 1722: ForwardingJobActions.ApplyEditOptions: Cyclomatic 41 with 0.0% file coverage \u2014 too complex for how untested it is (CRAP = CC\u00B2\u00B7(1\u2212cov)\u00B3 \u002B CC; \u226530 needs tests or simplification)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":720}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d52529ad07b857c8ed7f03e0d5f5791947b8255bdfef791b9a5d8ed4d2b991c"}},{"ruleId":"D8","level":"warning","message":{"text":"CRAP 930: CryptoDataOrchestrator.GetCryptoDetailsAsync: Cyclomatic 30 with 0.0% file coverage \u2014 too complex for how untested it is (CRAP = CC\u00B2\u00B7(1\u2212cov)\u00B3 \u002B CC; \u226530 needs tests or simplification)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Crypto/Services/CryptoDataOrchestrator.cs"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"102090769fb45c6bde3637f79571423f9d198fc6d67c7b307fe7a4f87386369c"}},{"ruleId":"D8","level":"warning","message":{"text":"CRAP 600: ForwardingJobActions.ProcessAndRelayMessageAsync: Cyclomatic 24 with 0.0% file coverage \u2014 too complex for how untested it is (CRAP = CC\u00B2\u00B7(1\u2212cov)\u00B3 \u002B CC; \u226530 needs tests or simplification)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"c159d199ff8b04e4dab95dc754e533e10959a287132d8f8d537c015823716834"}},{"ruleId":"D8","level":"warning","message":{"text":"CRAP 506: ForwardingJobActions.CloneEntityWithNewOffset: Cyclomatic 22 with 0.0% file coverage \u2014 too complex for how untested it is (CRAP = CC\u00B2\u00B7(1\u2212cov)\u00B3 \u002B CC; \u226530 needs tests or simplification)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":1022}}}],"partialFingerprints":{"codehealthFindingId/v1":"db0e68fd901a79e3d9ef211cfb068daf88bf17f37b88f9ce24f6f429d2600f90"}},{"ruleId":"D8","level":"warning","message":{"text":"CRAP 462: GeminiService.AttemptApiCallAsync: Cyclomatic 21 with 0.0% file coverage \u2014 too complex for how untested it is (CRAP = CC\u00B2\u00B7(1\u2212cov)\u00B3 \u002B CC; \u226530 needs tests or simplification)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/GeminiService.cs"},"region":{"startLine":415}}}],"partialFingerprints":{"codehealthFindingId/v1":"43e9a4c73ae501714fc05e6e72b91834c9536f2dcde9963a1ea03ee9a537b698"}},{"ruleId":"D8","level":"warning","message":{"text":"CRAP 380: ForwardingJobActions.ShouldProcessMessageBasedOnFilters: Cyclomatic 19 with 0.0% file coverage \u2014 too complex for how untested it is (CRAP = CC\u00B2\u00B7(1\u2212cov)\u00B3 \u002B CC; \u226530 needs tests or simplification)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2045d9200b752c0fc9e6e5691a949aec0aee8c75710771691b6a42dfef6b97e"}},{"ruleId":"D8","level":"warning","message":{"text":"CRAP 272: ForwardingJobActions.ProcessCustomSendAsync: Cyclomatic 16 with 0.0% file coverage \u2014 too complex for how untested it is (CRAP = CC\u00B2\u00B7(1\u2212cov)\u00B3 \u002B CC; \u226530 needs tests or simplification)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":443}}}],"partialFingerprints":{"codehealthFindingId/v1":"93e1fbdf3af6e6be5cf9c8be057ce2ed07b15d8baef0c3b0ff73b741556b537f"}},{"ruleId":"D8","level":"warning","message":{"text":"CRAP 210: ForwardingJobActions.ForwardingJobActions.ctor: Cyclomatic 14 with 0.0% file coverage \u2014 too complex for how untested it is (CRAP = CC\u00B2\u00B7(1\u2212cov)\u00B3 \u002B CC; \u226530 needs tests or simplification)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"1af35131a196e1957967014b8789c7428351f48c77d46e5a1faca72f0ba6781b"}},{"ruleId":"D10","level":"error","message":{"text":"No assertions (empty test): Test1: Test method has an empty body \u2014 it asserts nothing and exercises no code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Tests.Application/UnitTest1.cs"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3a9bc358f23ad96e7542adc4a7033dde9d257124fbeb7bb8939addc1165d234"}},{"ruleId":"D12","level":"error","message":{"text":"Vulnerable: AutoMapper: AutoMapper 14.0.0 \u2014 High severity. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"7ad907f4096422e42924a00fab6889d83782c07f3031eeb825e84a391fcadb56"}},{"ruleId":"D12","level":"warning","message":{"text":"Deprecated: Polly.Extensions.Http: Polly.Extensions.Http 3.0.0 \u2014 Legacy Microsoft.Extensions.Http.Resilience \u003E= 0.0.0"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"23aba0827d7bab20f94e121c373e019ddc2b3f6653656d4f36437b332de4b3cd"}},{"ruleId":"D12","level":"warning","message":{"text":"Deprecated: xunit: xunit 2.9.2 \u2014 Legacy xunit.v3 \u003E= 0.0.0"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d37c8c0e8046c9e8358e976373216abfb78e9fdef63ed53d3edcaa7d2238edcd"}},{"ruleId":"D13","level":"error","message":{"text":"Leaked secret: high-entropy-secret: high-entropy-secret detected."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Services/CloudflareRadarService.cs"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"0087bec77066f9876109d5d37ff50a743fd177f467a71f8178a2267cd611d65e"}},{"ruleId":"D13","level":"error","message":{"text":"Leaked secret: high-entropy-secret: high-entropy-secret detected."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/Fmp/FmpApiClient.cs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"6aef78381d20aa34c62fea741d9bf5e66f7686fb8353b7a5fdfc3dbaa613cbab"}},{"ruleId":"D14","level":"error","message":{"text":"Banned license: Hangfire.Redis.StackExchange: Hangfire.Redis.StackExchange 1.12.0 is licensed LGPL-3.0-or-later (banned by policy)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6d09b2e646b0c1fdc61db672dee10a86cba1ad1dc9672bd519f9d83de3de4011"}},{"ruleId":"D16","level":"note","message":{"text":"Small-team knowledge concentration: 170 file(s) are concentrated to one author \u2014 the ambient state with 2 active author(s), not 170 separate risks. The signal becomes meaningful as ownership spreads; no per-file action implied now."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"8aa75b6daa18f1b578387fa04036c50b3163d47f957c8f5601bf083ed4489b0c"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Common/Interfaces/IAppDbContext.cs"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b3299afee3e309c0b85f81145777a05162ebffbfc221e83c508199aa304feab"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Common/Interfaces/IRssSourceRepository.cs"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"16d7e050af1186f2539b09d055547767485c867b836fa76b9378c3c5771dbad5"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Common/Interfaces/IUserRepository.cs"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e17a9710ee761f56604d8005ae50860aad197ddc3cd17e458b8e2a37d1e733a"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/DTOs/RegisterUserDto.cs"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b15e583e95399f3cd70cb43a7c61d7afea6044c310337d0fe8ee18d1484244c"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Persistence/Configurations/UserSignalPreferenceConfiguration.cs"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"215ca31cfc76cf9ede45b42f5778f6f2edd0e80d2dbec85550d6435b1434f373"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/EconomicCalendar/EconomicCalendarCallbackHandler.cs"},"region":{"startLine":416}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4c710963ea7acbe5a7034b706e940f1b4afdd4dadf282a890b22e7eeaf1399c"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Settings/TelegramPanelSettings.cs"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"14f4c560919893b78f33f762baa913c8630f0c8c243c63da6275c1fc75c4308f"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingService.cs"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"a19fbc28b32fb3170618a05ed481ae55d538d3ab0e7230e2115951ac7360f057"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingService.cs"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"a19fbc28b32fb3170618a05ed481ae55d538d3ab0e7230e2115951ac7360f057"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingService.cs"},"region":{"startLine":413}}}],"partialFingerprints":{"codehealthFindingId/v1":"a19fbc28b32fb3170618a05ed481ae55d538d3ab0e7230e2115951ac7360f057"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingService.cs"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"a19fbc28b32fb3170618a05ed481ae55d538d3ab0e7230e2115951ac7360f057"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingService.cs"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"a19fbc28b32fb3170618a05ed481ae55d538d3ab0e7230e2115951ac7360f057"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingService.cs"},"region":{"startLine":516}}}],"partialFingerprints":{"codehealthFindingId/v1":"a19fbc28b32fb3170618a05ed481ae55d538d3ab0e7230e2115951ac7360f057"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/PaymentService.cs"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8a0d4da7ca0a51f6aba135be99c93383030536daf22628caecd1a89de1438b5"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/PaymentService.cs"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8a0d4da7ca0a51f6aba135be99c93383030536daf22628caecd1a89de1438b5"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/SubscriptionService.cs"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0dba0040b84f32a9bcdf2cb6cdf3ce5f98f75412fabb6943ad40b0b21100a4b"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/SubscriptionService.cs"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0dba0040b84f32a9bcdf2cb6cdf3ce5f98f75412fabb6943ad40b0b21100a4b"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/SubscriptionService.cs"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0dba0040b84f32a9bcdf2cb6cdf3ce5f98f75412fabb6943ad40b0b21100a4b"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/SubscriptionService.cs"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0dba0040b84f32a9bcdf2cb6cdf3ce5f98f75412fabb6943ad40b0b21100a4b"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/SubscriptionService.cs"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0dba0040b84f32a9bcdf2cb6cdf3ce5f98f75412fabb6943ad40b0b21100a4b"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/SubscriptionService.cs"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0dba0040b84f32a9bcdf2cb6cdf3ce5f98f75412fabb6943ad40b0b21100a4b"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Domain/ValueObjects/TokenAmount.cs"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"b03aab46702cf0f94e72712c8aed1107c809736049409df404698ea84f27e4fb"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Persistence/Configurations/SignalCategoryConfiguration.cs"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6890aa895fd8704f9c057650ec3e8f7ec9763d36957e06350e81bb52acefaa8"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Persistence/Configurations/UserSignalPreferenceConfiguration.cs"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"215ca31cfc76cf9ede45b42f5778f6f2edd0e80d2dbec85550d6435b1434f373"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Extensions/ServiceCollectionExtensions.cs"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee67913ec42df0f53f73449f8ab40584bd1fb2df8d013c6377a804d53d6a1489"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/TelegramNotificationService.cs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7b2acd144c59d86d55f6cb994717f5d05271d74c7673e8870e514ff8d0f8827"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/Controllers/ForwardingController.cs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"f864f37198f998adab137c10b35a7066216d446cc832a642a7930f0d9fa3894d"}},{"ruleId":"D17","level":"note","message":{"text":"ObsoleteWithoutCallers: [Obsolete] SendBatchNotificationAsync"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"BackgroundTasks/Services/NotificationSendingService.cs"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"10ad19f98288b7637a7f642b432d6b9738796e8589931706e06781fcd5e8ac19"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 5 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Repositories/SignalCategoryRepository.cs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"97be6ec111d61d08cdb9419d9bac52c5c098e82643f2451b42989957bb78a5de"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 5 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/Program.cs"},"region":{"startLine":1214}}}],"partialFingerprints":{"codehealthFindingId/v1":"018cc03727ed32f8ce2cba0c5308d8d85ab6a03a1d082937741c069571898530"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Shared/Security/ExceptionSanitizer.cs"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"96fff12b3a4e0f455a96ca0db3b5db63c1c9c7198215cb4db2b8ce7e417e11b0"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/Program.cs"},"region":{"startLine":1564}}}],"partialFingerprints":{"codehealthFindingId/v1":"4726f728b7916838827228d7cfb986a1dcb56103a6a410c43d3edd3935a07450"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Use a secure key vault or environment variable \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":"Shared/Security/SecureExceptionSanitizer.cs"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"04ad989dfdc8101a66df9d14b00e1e427796f904b584b7fab5bde056f171ad86"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Replace with your actual Privacy Policy URL and Support Contact information. \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":"TelegramPanel/Application/CommandHandlers/Settings/SettingsCallbackQueryHandler.cs"},"region":{"startLine":1130}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa7e2474faf3b050956e6292c4e39849e12b7255624471337a566a83e7874b61"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Here you would typically route to a command handler, state machine, etc. \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":"TelegramPanel/Infrastructure/Services/UpdateHandler.cs"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"f389c059b61766a76e0cb1334c5e42e58d16e56b2a26ccf3da275d4010fa83ef"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Consider specific admin role if available e.g., [Authorize(Roles = AppRoles.Administrator)] \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":"WebAPI/Controllers/TelegramConfigurationController.cs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdf2d53a4e241ff1972c1bf0d973e10d2fb162c57c446d88969dd015b2069870"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Replace with a secure key management solution \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":"WebAPI/Controllers/TestController.cs"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"7509384b3553eba2a3370d8c95bfdb494df32fcf9846b8781822e1e877990a96"}},{"ruleId":"D17","level":"error","message":{"text":"NoWarnInCsproj: 1591"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/WebAPI.csproj"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"d872fb571f9e6f160cc67a71d8c9061a18f9c1ea54684ba8443dd23e8a1fb659"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: MapCoinGeckoIdToFmpSymbol: Method MapCoinGeckoIdToFmpSymbol \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Crypto/Services/CryptoDataOrchestrator.cs"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"8753d6beffc8b12e6210fff79846ebe70b47fb3c3a1c0b0d664ab71d1f4b195a"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: BroadcastOrchestrationService: NamedType BroadcastOrchestrationService \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/BroadcastOrchestrationService.cs"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea4af305dc20bb82a42b7ab74947c758b0099f597d7c5fb85222c72aa820a3f1"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: ForwardingRuleWithReplacementsDto: NamedType ForwardingRuleWithReplacementsDto \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Features/Forwarding/Repositories/ForwardingRuleRepository.cs"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc30e12c6ac878e41e415559b7f62cb47ea7e78ff17803636dd1b8204f12848d"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: SanitizeSensitiveData: Method SanitizeSensitiveData \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Repositories/UserRepository.cs"},"region":{"startLine":945}}}],"partialFingerprints":{"codehealthFindingId/v1":"11728b0ad80deff4e3bf58592f9a8860403532656b07becebd603545ec9e4543"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: SanitizeSensitiveData: Method SanitizeSensitiveData \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/DynamicConfigurationService.cs"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bc3791d936db3d3fc2006e91dd55e17b331aa696b65a934a546ff19b3dd26ea"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: HandleFetchException: Method HandleFetchException \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/RssReaderService.cs"},"region":{"startLine":1593}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cb906b2c213c4766d7264f45fdb1284af0e22e86425b453c48cabfdb1c8c16a"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: EnhanceMessageWithAiAsync: Method EnhanceMessageWithAiAsync \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":1336}}}],"partialFingerprints":{"codehealthFindingId/v1":"65f3587015eaf4ae6ddcc7ae6996cbfba62ef7e8d237429db3b98b71eeb17ade"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: RecoverCaptionFromMedia: Method RecoverCaptionFromMedia \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":1934}}}],"partialFingerprints":{"codehealthFindingId/v1":"26952195eef2c91823fb86e33ba72083369e746b9dc86527765e33cef9988f76"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: EnhanceCaptionWithAiAsync: Method EnhanceCaptionWithAiAsync \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":1956}}}],"partialFingerprints":{"codehealthFindingId/v1":"900d6f3daa55865babb601cb72deb3bbe55408bef9b6609e9937a3c8c36f110a"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: CheckGeminiJobResultAsync: Method CheckGeminiJobResultAsync \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":2623}}}],"partialFingerprints":{"codehealthFindingId/v1":"6042cc17e75466eff955750f443d90e853ba7faf6e89c58d6cec5acbc9857d5f"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: EscapeTelegramMarkdownV2: Method EscapeTelegramMarkdownV2 \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"BackgroundTasks/Services/NotificationSendingService.cs"},"region":{"startLine":552}}}],"partialFingerprints":{"codehealthFindingId/v1":"32dc9722b31a895e11e63833d53704d0959a54a4b5ad5ecc9f402db1e63e3bbe"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: UserLookupHandler: NamedType UserLookupHandler \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Admin/UserLookupHandler.cs"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb7f262c37fefc7f75c9aa7e251b94956d73f60580b92f4df6a3aa1659645105"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: BuildPaginatedKeyboard: Method BuildPaginatedKeyboard \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/Educational/EducationalContentHandler.cs"},"region":{"startLine":672}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ebde567d372aa4177bcb68cb559cb486388c59d49451a55dffeb0ab4dcf163f"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: GetErrorStateKeyboard: Method GetErrorStateKeyboard \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/News/FundamentalAnalysisCallbacks.cs"},"region":{"startLine":431}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0ad7ffbca95ef7c0980fab8570aa31af7f2f195b0a9bc8c18b78d476c428d39"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: ShouldShowProcessingToast: Method ShouldShowProcessingToast \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Settings/SettingsCallbackQueryHandler.cs"},"region":{"startLine":363}}}],"partialFingerprints":{"codehealthFindingId/v1":"80960733f6641667c25ae96100a8d22ffad02812bf4cffd488fdcc8fd4a5b1cf"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: FrankfurterResponse: NamedType FrankfurterResponse \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Services/MarketDataService.cs"},"region":{"startLine":541}}}],"partialFingerprints":{"codehealthFindingId/v1":"14f1316fd988b23e73726784fed4c2cc664ccbb895ed5e156189b2027628cd85"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: EscapeTelegramMarkdownV2: Method EscapeTelegramMarkdownV2 \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/TelegramMessageSender.cs"},"region":{"startLine":588}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ee4e8ee74c5843c2f2f6d280cc8d7e1e6c4ed9b2a3f597377e6320f6d0a8097"}},{"ruleId":"D18","level":"note","message":{"text":"Shell project: Application.Tests: \u0060Application.Tests\u0060 contributes only 0 significant line(s) \u2014 an empty/placeholder project is structural noise. Remove it or fold its contents into a real project."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application.Tests/Application.Tests.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab8497fed12d4fe5164632f6c19bf954b262bdab301ab1eb3f4f3e45d4ea68f3"}},{"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":"D23","level":"note","message":{"text":"Bounded contexts not declared: At 56k LoC across 8 projects the codebase is large and multi-module, so explicit bounded contexts are needed. Declare architecture.contexts (\u22652) in config to assess cross-boundary type coupling."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"1c7e276c9c682731f01819ed5378b90ca320cde1b583c90920172911598362b3"}},{"ruleId":"D24","level":"note","message":{"text":"redundant comment: \u0022--- NEW METHODS FOR THE UPGRADE ---\u0022 \u2014 trim - generated marker restating new methods; remove or link to migration notes"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Common/Interfaces/Cashe/ICacheService.cs"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"05619da9209dc991b296b006f557598301c98201266651e4c262b70c78da34b6"}},{"ruleId":"D26","level":"note","message":{"text":"Split Application: Catch-all name that is huge (11k LoC) and sprawls over 34 unrelated namespaces. Suggested: by namespace: split the 34 namespaces into cohesive application modules"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9e8c5585c22a3d833b59e053c49b63bd595b6af14c0afc4314e5028abf50ebe9"}},{"ruleId":"D26","level":"note","message":{"text":"Split Infrastructure: Generic catch-all at 20k LoC across 20 namespaces is a sprawling grab-bag. Suggested: by namespace: separate the 20 namespaces into focused infrastructure packages"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"95b21da52b0afd9817537c6389c05a7abb69f1c85cf04409aeb4b3fa8b01f54e"}},{"ruleId":"D26","level":"note","message":{"text":"Split TelegramPanel: Catch-all name that is large and spans 31 unrelated namespaces despite moderate size. Suggested: by namespace: break the 31 namespaces into cohesive Telegram panel modules"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"8263e8d3eefc4e3e5dd08527aca156edaa5aa12ed7ecbaf8131cd8787016e1b3"}},{"ruleId":"D28","level":"error","message":{"text":"Secret: generic-api-key: matched rule \u0027generic-api-key\u0027"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Services/CloudflareRadarService.cs"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b99b3f8eb08a9e1f56bd2ccadcee95252368b6ca8c36e9d149be80d5dc0809d"}},{"ruleId":"D28","level":"error","message":{"text":"Secret: generic-api-key: matched rule \u0027generic-api-key\u0027"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/ExternalServices/FredApiClient.cs"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"072ba9e403815e96217b3d4c5d02b767e8244cae97b4c0de072fc126c03b43ce"}},{"ruleId":"D28","level":"error","message":{"text":"Secret: generic-api-key: matched rule \u0027generic-api-key\u0027"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/Fmp/FmpApiClient.cs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"6873788ab9cb6d7ed03fe66a41a59b909fec3694e0aef809c373f19642f7e9f0"}},{"ruleId":"D28","level":"note","message":{"text":"Rotate the exposed credentials \u2014 git history can\u0027t be un-committed: Some of these secrets are in git HISTORY: deleting the file does not remove them (the commit persists on every clone, fork and backup). The remediation is to ROTATE each historically-exposed credential and treat it as compromised \u2014 not to delete the file. Rewriting history is disruptive and unreliable across existing forks. (Working-tree-only secrets \u2014 no commit \u2014 can instead be removed from the file and moved to a secret store.)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"3cdfd7beb31b791ae18dcb425e21eb157c842e7bbcd522cc330573c1a6538db1"}},{"ruleId":"D30","level":"error","message":{"text":"High CVE: AutoMapper 14.0.0: AutoMapper 14.0.0 (direct) has a High advisory; affects 6 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"2f3f977fd628450f0f2d394acbc594ffb0c42971e812ca2f57d11b102cf0de54"}},{"ruleId":"D30","level":"error","message":{"text":"High CVE: Newtonsoft.Json 11.0.1: Newtonsoft.Json 11.0.1 (transitive) has a High advisory; affects 5 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"165f0e39d55927e001892f9a59b099ef6f3b8d1c9a1dd944473936e47ebbce65"}},{"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 4 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: SQLitePCLRaw.lib.e_sqlite3 2.1.10: SQLitePCLRaw.lib.e_sqlite3 2.1.10 (transitive) has a High advisory; affects 3 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4bb21bfe4dacebf32c74969b01bdfd4143dcc202111d99f8d1abd5eb6de9eec2"}},{"ruleId":"D31","level":"note","message":{"text":"Low IaC: DS-0026: No HEALTHCHECK defined"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"BackgroundTasks/Dockerfile"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf195b36f0738a36dc3efcb72cd94a61de94057e43736e6ae5996c6e910720d7"}},{"ruleId":"D34","level":"note","message":{"text":"Dormant codebase: 167 of 221 significant files have no living knowledge \u2014 the codebase as a whole is dormant, not 167 separate risks. Re-engage owners or document before change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4c69f1e54b7dd6fe9029dd02df6ba8f8145b789f2f18dbdaa086c40ded49dba6"}},{"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: 41 authored method(s) exceed the IL budget: 41 of 2004 first-party methods compile to oversized IL bodies (\u003E 250 instructions); worst: Infrastructure.Services.AdviceService..cctor @ Infrastructure/Services/AdviceService.cs:15, 5941 IL instructions; large bodies don\u0027t JIT-inline, which pulled this dimension to 9.6/10; splitting the hottest bodies recovers the most."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/AdviceService.cs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"4afaf46bbfd451c1e58db182c82f3aa2c64928bafb923a0556aa6a52712a6f30"}}],"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}}}]}