{"$schema":"https://json.schemastore.org/sarif-2.1.0.json","version":"2.1.0","runs":[{"tool":{"driver":{"name":"codehealth","informationUri":"https://codehealth.canine.dev","rules":[{"id":"D1","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D1"},{"id":"D2","name":"Cognitive Complexity","shortDescription":{"text":"Cognitive Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D2"},{"id":"D3","name":"God Classes","shortDescription":{"text":"God Classes"},"helpUri":"https://codehealth.canine.dev/dimensions/D3"},{"id":"D4","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/D4"},{"id":"D5","name":"Coupling","shortDescription":{"text":"Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D5"},{"id":"D6","name":"Cohesion (LCOM4)","shortDescription":{"text":"Cohesion (LCOM4)"},"helpUri":"https://codehealth.canine.dev/dimensions/D6"},{"id":"D7","name":"Architectural Integrity","shortDescription":{"text":"Architectural Integrity"},"helpUri":"https://codehealth.canine.dev/dimensions/D7"},{"id":"D8","name":"Code Coverage","shortDescription":{"text":"Code Coverage"},"helpUri":"https://codehealth.canine.dev/dimensions/D8"},{"id":"D9","name":"Test Distribution","shortDescription":{"text":"Test Distribution"},"helpUri":"https://codehealth.canine.dev/dimensions/D9"},{"id":"D10","name":"Test Quality","shortDescription":{"text":"Test Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D10"},{"id":"D11","name":"Test Reliability","shortDescription":{"text":"Test Reliability"},"helpUri":"https://codehealth.canine.dev/dimensions/D11"},{"id":"D12","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/D12"},{"id":"D13","name":"Secret Scanning","shortDescription":{"text":"Secret Scanning"},"helpUri":"https://codehealth.canine.dev/dimensions/D13"},{"id":"D14","name":"License Compliance","shortDescription":{"text":"License Compliance"},"helpUri":"https://codehealth.canine.dev/dimensions/D14"},{"id":"D15","name":"Churn \u00D7 Complexity Hotspots","shortDescription":{"text":"Churn \u00D7 Complexity Hotspots"},"helpUri":"https://codehealth.canine.dev/dimensions/D15"},{"id":"D16","name":"Bus Factor","shortDescription":{"text":"Bus Factor"},"helpUri":"https://codehealth.canine.dev/dimensions/D16"},{"id":"D17","name":"Explicit Debt","shortDescription":{"text":"Explicit Debt"},"helpUri":"https://codehealth.canine.dev/dimensions/D17"},{"id":"D18","name":"Solution Shape","shortDescription":{"text":"Solution Shape"},"helpUri":"https://codehealth.canine.dev/dimensions/D18"},{"id":"D19","name":"Documentation Quality","shortDescription":{"text":"Documentation Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D19"},{"id":"D20","name":"ADR Quality","shortDescription":{"text":"ADR Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D20"},{"id":"D21","name":"Naming Consistency","shortDescription":{"text":"Naming Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D21"},{"id":"D22","name":"Internal API Consistency","shortDescription":{"text":"Internal API Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D22"},{"id":"D23","name":"Boundary Type-Coupling","shortDescription":{"text":"Boundary Type-Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D23"},{"id":"D24","name":"Comment Value","shortDescription":{"text":"Comment Value"},"helpUri":"https://codehealth.canine.dev/dimensions/D24"},{"id":"D25","name":"ADR Conformance","shortDescription":{"text":"ADR Conformance"},"helpUri":"https://codehealth.canine.dev/dimensions/D25"},{"id":"D26","name":"Project Cohesion","shortDescription":{"text":"Project Cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/D26"},{"id":"D27","name":"Navigability","shortDescription":{"text":"Navigability"},"helpUri":"https://codehealth.canine.dev/dimensions/D27"},{"id":"D28","name":"Secrets (history)","shortDescription":{"text":"Secrets (history)"},"helpUri":"https://codehealth.canine.dev/dimensions/D28"},{"id":"D29","name":"Static Analysis (SAST)","shortDescription":{"text":"Static Analysis (SAST)"},"helpUri":"https://codehealth.canine.dev/dimensions/D29"},{"id":"D30","name":"Dependency Vulnerabilities","shortDescription":{"text":"Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D30"},{"id":"D31","name":"IaC \u0026 Container Security","shortDescription":{"text":"IaC \u0026 Container Security"},"helpUri":"https://codehealth.canine.dev/dimensions/D31"},{"id":"D32","name":"Data Compliance (PII/GDPR)","shortDescription":{"text":"Data Compliance (PII/GDPR)"},"helpUri":"https://codehealth.canine.dev/dimensions/D32"},{"id":"D33","name":"JS/npm Dependency Vulnerabilities","shortDescription":{"text":"JS/npm Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D33"},{"id":"D34","name":"Knowledge Freshness","shortDescription":{"text":"Knowledge Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/D34"},{"id":"D35","name":"Change Coupling","shortDescription":{"text":"Change Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D35"},{"id":"D36","name":"Supply-chain Provenance \u0026 Signing","shortDescription":{"text":"Supply-chain Provenance \u0026 Signing"},"helpUri":"https://codehealth.canine.dev/dimensions/D36"},{"id":"D37","name":"Vulnerability-disclosure Policy","shortDescription":{"text":"Vulnerability-disclosure Policy"},"helpUri":"https://codehealth.canine.dev/dimensions/D37"},{"id":"D38","name":"OSV Dependency Vulnerabilities","shortDescription":{"text":"OSV Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D38"}]}},"results":[{"ruleId":"D1","level":"warning","message":{"text":"TelegramUserApiClient.ResolvePeerAsync (cyclomatic 55): TelegramUserApiClient.ResolvePeerAsync has cyclomatic complexity 55 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":2152}}}],"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":198}}}],"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":719}}}],"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":"NotificationSendingService.IsTransientException (cyclomatic 25): NotificationSendingService.IsTransientException has cyclomatic complexity 25 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"BackgroundTasks/Services/NotificationSendingService.cs"},"region":{"startLine":575}}}],"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":721}}}],"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":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d20b353c52c7aeffdc3d9e224c7a34528510c667fa6bda0d1163d63e348c860"}},{"ruleId":"D1","level":"warning","message":{"text":"TelegramUserApiClient.TelegramUserApiClient.ctor (cyclomatic 24): TelegramUserApiClient.TelegramUserApiClient.ctor has cyclomatic complexity 24 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"540bbff7411540992a86ef6bb52ada20aa37f226f8bedab9e1cddf1c31e1c194"}},{"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":1051}}}],"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":1332}}}],"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":"MessageForwardingService.ConvertTelegramBotEntityToTLEntity (cyclomatic 23): MessageForwardingService.ConvertTelegramBotEntityToTLEntity has cyclomatic complexity 23 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Services/MessageForwardingService.cs"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"d24d6cc1c8f3330689a960af134a8a1073850c1b915ff968fc25d65bc833957d"}},{"ruleId":"D1","level":"warning","message":{"text":"ForwardingJobActions.CloneEntityWithNewOffset (cyclomatic 22): ForwardingJobActions.CloneEntityWithNewOffset has cyclomatic complexity 22 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":1021}}}],"partialFingerprints":{"codehealthFindingId/v1":"7eafd3d05f6390861d25d21a610207605300954b4f2923aa2a0a88813bfbb7dc"}},{"ruleId":"D1","level":"warning","message":{"text":"ServiceCollectionExtensions.AddInfrastructureServices (cyclomatic 22): ServiceCollectionExtensions.AddInfrastructureServices has cyclomatic complexity 22 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Data/ServiceCollectionExtensions.cs"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"69c267c2ad42471704356f5715983dc9532cc4235de955272b73c9450be5b6b4"}},{"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":418}}}],"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":522}}}],"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":656}}}],"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":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f3e40db4ae8e8d055431fa821abf831c49a744217123cf946ffe38de0b75fe1"}},{"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":338}}}],"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":436}}}],"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":1493}}}],"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":74}}}],"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":442}}}],"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":25}}}],"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":719}}}],"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":2152}}}],"partialFingerprints":{"codehealthFindingId/v1":"fefa969d450474224cb7ddab28d8fe77cd9cc8836efe1699d7c9e08f9f2c586d"}},{"ruleId":"D2","level":"warning","message":{"text":"CloudflareRadarCallbackHandler.FormatCountryReportMessage (cognitive 71): CloudflareRadarCallbackHandler.FormatCountryReportMessage has cognitive complexity 71 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/Cloudflare/CloudflareRadarCallbackHandler.cs"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ba0cd9cbdf601bfea9f04f7331d7325075edd0337d3643bdae9d7aef5cd752d"}},{"ruleId":"D2","level":"warning","message":{"text":"CryptoCallbackHandler.HandleAsync (cognitive 51): CryptoCallbackHandler.HandleAsync has cognitive complexity 51 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/CoinGecko/CryptoCallbackHandler.cs"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1607fde5d385bae9a96d3c2390685a194f33ebfe016221515ef592dda17063e"}},{"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":522}}}],"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":656}}}],"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":721}}}],"partialFingerprints":{"codehealthFindingId/v1":"89b6cc84ec3c5388180dfe13e8884cab60c4befdb378143f045f464acb81eeb1"}},{"ruleId":"D2","level":"warning","message":{"text":"ServiceCollectionExtensions.AddInfrastructureServices (cognitive 33): ServiceCollectionExtensions.AddInfrastructureServices has cognitive complexity 33 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Data/ServiceCollectionExtensions.cs"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"f45796d92b7421864f4c05657bdd89f71680377fd253ea0aa70729c5f71005d0"}},{"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":1332}}}],"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":336}}}],"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":338}}}],"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":436}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3647e3b10e9923efc902288038fec88cbd1f94477077ee9588a9790c2790c18"}},{"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":262}}}],"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":442}}}],"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":1493}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ba43985dd4a0fa098b67bd201b9f48160e9733b73461a89d24770ceb0692ad2"}},{"ruleId":"D2","level":"warning","message":{"text":"TelegramUserApiClient.SendInPartsAsync (cognitive 25): TelegramUserApiClient.SendInPartsAsync has cognitive complexity 25 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":1482}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d6f74c6b408824edb434d21b4dee85064a3efa90900a2486670904bf0e66a65"}},{"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":"AdminCallbackHandler.HandleServerStatsAsync (cognitive 23): AdminCallbackHandler.HandleServerStatsAsync has cognitive complexity 23 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Admin/AdminCallbackHandler.cs"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"344a83ace22e1f4355be9835df973b6848157bb73315b631c52a55cd2949b69e"}},{"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":"TelegramUserApiClient.GetMessagesAsync (cognitive 21): TelegramUserApiClient.GetMessagesAsync has cognitive complexity 21 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":1051}}}],"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":"RssReaderService.TryExtractFromMediaContent (cognitive 19): RssReaderService.TryExtractFromMediaContent has cognitive complexity 19 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/RssReaderService.cs"},"region":{"startLine":1925}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ac3cab466fb866f7150bf11d1eda0c22145a458c20e36136e7d50626171bf76"}},{"ruleId":"D2","level":"warning","message":{"text":"TelegramUserApiClient.TelegramUserApiClient.ctor (cognitive 19): TelegramUserApiClient.TelegramUserApiClient.ctor has cognitive complexity 19 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cf519fbb26c58f5dc8428c2ea946206c6bff05928a41c6b51a6f531d636df65"}},{"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":347}}}],"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":29}}}],"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":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"db0475ac67790a9f1b95037073e32186dc4ec15412128e0e0bd84617bc7ce75e"}},{"ruleId":"D2","level":"warning","message":{"text":"GeminiService.AttemptApiCallAsync (cognitive 18): GeminiService.AttemptApiCallAsync has cognitive complexity 18 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/GeminiService.cs"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"543e8e3a1ab705ff92d4515c0110c20b4913ba0f095c9146fd800c18784c5c29"}},{"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":439}}}],"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":575}}}],"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":700}}}],"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":1013}}}],"partialFingerprints":{"codehealthFindingId/v1":"d12940db94e2f8fb79ef7bd62df3acfb22bdb24c82cc126cb6cdeb4d34aec9f5"}},{"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":"ExternalDependencyManager.EnsurePostgresAsync (cognitive 16): ExternalDependencyManager.EnsurePostgresAsync has cognitive complexity 16 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/ExternalServices/ExternalDependencyManager.cs"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c196967a5e5014fbc1dd977b91ce3e79b0e662e2e60c9157d2448a45d15ca7f"}},{"ruleId":"D2","level":"warning","message":{"text":"ExternalDependencyManager.DownloadAndExtractPostgresAsync (cognitive 16): ExternalDependencyManager.DownloadAndExtractPostgresAsync has cognitive complexity 16 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/ExternalServices/ExternalDependencyManager.cs"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"2da1605ccf5324c04a8939717891102893948b5e8a94ff3038f59b0a287265ae"}},{"ruleId":"D2","level":"warning","message":{"text":"DynamicConfigurationService.UpdateSettingsAsync (cognitive 16): DynamicConfigurationService.UpdateSettingsAsync has cognitive complexity 16 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/DynamicConfigurationService.cs"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef5839a53515e97869461c25e6810d75cdf7cb5bc9b189724000ed36a5da6395"}},{"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":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a998422dc6f018d9a61e5be4c84d6e0404819cbb96bafc597613920018c4c30"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Services/ForwardingJobActions.cs: FileTooLong \u2014 592 lines, 0 methods."},"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 600 lines, 0 methods."},"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 760 lines, 0 methods."},"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, 0 methods."},"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 1274 lines, 0 methods."},"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 750 lines, 0 methods."},"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 1289 lines, 0 methods."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b64955e14902fda4e48942d2eddc654b615ed34e11da16f9a34d2788c55050a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: WebAPI/Program.cs: FileTooLong \u2014 1005 lines, 0 methods."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/Program.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"6465f6e2599e8014ad249798fe53ba6233f65eb446c0a7536df124307d81e212"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Settings/SettingsCallbackQueryHandler.cs: FileTooLong \u2014 697 lines, 0 methods."},"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 576 lines, 0 methods."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/TelegramMessageSender.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"679de62a33508ead92012161204e8a33049a045b16dde1865b0967d65697ccf3"}},{"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 574 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: 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 1023 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 1238 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: NotificationSendingService: ClassTooLong \u2014 437 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: 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:644-671"},"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:317-343 | TelegramPanel/Application/CommandHandlers/Admin/AdminCallbackHandler.cs:363-388"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Admin/AdminCallbackHandler.cs"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2dbbab116f8e26e3279252c770080fcef2964b767b5e2e7f714ed03ccef37cc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): Infrastructure/Repositories/UserRepository.cs:1520-1542 | Infrastructure/Repositories/UserRepository.cs:1607-1628"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Repositories/UserRepository.cs"},"region":{"startLine":1520}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ebf4c38abb51b1e1f6cc40a8893c274ada3e8629ceef9e62de355749841a0ab"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): Application/Features/Forwarding/Services/ForwardingJobActions.cs:85-105 | Application/Features/Forwarding/Services/ForwardingJobActions.cs:137-157"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":85}}}],"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:60-76 | WebAPI/Controllers/LogController.cs:34-50"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/Admin/AdminService.cs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"e985b6c01ed6c40b76d720fc270e17cad0d96ad0169c7ba94cb4647efdb6ffcc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): Infrastructure/Services/Admin/AdminService.cs:106-122 | WebAPI/Controllers/LogController.cs:95-111"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/Admin/AdminService.cs"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"e985b6c01ed6c40b76d720fc270e17cad0d96ad0169c7ba94cb4647efdb6ffcc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): WebAPI/Controllers/LogController.cs:152-166 | WebAPI/Controllers/LogController.cs:298-312"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/Controllers/LogController.cs"},"region":{"startLine":152}}}],"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:49-62 | Application/Features/Forwarding/Services/ForwardingJobActions.cs:113-126"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd31817e4f42d2e643bbdd164e6b18614dc32628b32f3c1a746ed2f4a7643feb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): Infrastructure/Features/Forwarding/Repositories/ForwardingRuleRepository.cs:407-420 | Infrastructure/Features/Forwarding/Repositories/ForwardingRuleRepository.cs:468-481"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Features/Forwarding/Repositories/ForwardingRuleRepository.cs"},"region":{"startLine":407}}}],"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): Shared/Security/ExceptionSanitizer.cs:469-482 | Shared/Security/ExceptionSanitizer.cs:496-509"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Shared/Security/ExceptionSanitizer.cs"},"region":{"startLine":469}}}],"partialFingerprints":{"codehealthFindingId/v1":"917d411b9631b4514b131709d16ebc112699072b92985ebe564d9363e5cd9a63"}},{"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:86-98 | WebAPI/Controllers/ConfigController.cs:48-59 | WebAPI/Controllers/ConfigController.cs:61-71"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/DynamicConfigurationService.cs"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fc04841e1084e7b56067a9fdb5b2b2492bf2041d93613ec38aecbf4f8eb0e19"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): Application/Features/Forwarding/Services/ForwardingJobActions.cs:122-134 | Application/Features/Forwarding/Services/ForwardingJobActions.cs:165-177"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":122}}}],"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:284-292"},"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:1391-1400 | WebAPI/Program.cs:1460-1472"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/Program.cs"},"region":{"startLine":1391}}}],"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:2283-2294 | Infrastructure/Services/TelegramUserApiClient.cs:2320-2331"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":2283}}}],"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:1873-1883 | Infrastructure/Services/RssReaderService.cs:1884-1894 | Infrastructure/Services/RssReaderService.cs:1895-1905"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/RssReaderService.cs"},"region":{"startLine":1873}}}],"partialFingerprints":{"codehealthFindingId/v1":"442847283f9eee26fe2b5939b9c350e0e7116fef8eb1a95232366cc3fce473f9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): Infrastructure/Services/TelegramUserApiClient.cs:2301-2309 | Infrastructure/Services/TelegramUserApiClient.cs:2337-2345"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":2301}}}],"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:243-249 | Application/Features/Forwarding/Services/ForwardingJobActions.cs:259-266"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Features/Forwarding/Services/ForwardingJobActions.cs"},"region":{"startLine":243}}}],"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:1894-1900 | Infrastructure/Services/RssReaderService.cs:1906-1912"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/RssReaderService.cs"},"region":{"startLine":1894}}}],"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":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): Infrastructure/Repositories/UserRepository.cs:57-62 | WebAPI/Program.cs:1979-1984"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Repositories/UserRepository.cs"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad9713bdf0301f80f81ffc9509b915b88118531d9ec36d3af807564e456b6f63"}},{"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":"D6","level":"warning","message":{"text":"Low cohesion: FallbackDatabase (LCOM4 468): FallbackDatabase\u0027s methods form 468 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/EmbeddedRedisService.cs"},"region":{"startLine":497}}}],"partialFingerprints":{"codehealthFindingId/v1":"faf56060861e7f878b25bef084d1bc9bc2669e062c808d2f58a7c74ea9c8ab92"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: FallbackRedisService (LCOM4 31): FallbackRedisService\u0027s methods form 31 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/EmbeddedRedisService.cs"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"7168ee6a2c03aba01ae3d1ddb501530cf1e8a7bed57f0ec57c8bd79d8282795a"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: CryptoPayApiClient (LCOM4 5): CryptoPayApiClient\u0027s methods form 5 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/ExternalServices/CryptoPayApiClient.cs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"498436de06133c7a9cb1ae3c627f4f345ab0ba040c1ee1bb0a0c909ad32498c7"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: Result (LCOM4 4): Result\u0027s methods form 4 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Shared/Results/Result.cs"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a9ee6a1fb116c43f937143799c640fc5f9bc6814708508b618b2333fccb4dbc"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: MarketDataService (LCOM4 4): MarketDataService\u0027s methods form 4 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Services/MarketDataService.cs"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b35e6268a8b7f0b1c70bcff9a2ed198baa5708e3bc2106e8c24655ead79b835"}},{"ruleId":"D7","level":"note","message":{"text":"No checkable ADRs to assess: No architecture decision records were found and the project graph is acyclic, so architectural integrity could not be assessed. Add ADRs (with \u0060enforcement: analyzer|test\u0060) to make the architecture\u0027s rules checkable."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9bfa095522c5f2e53a7c1c0405fd8830d318409a6fb74f4288bab05aaf716e52"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: LocalizationService.cs: 0.0% line coverage (0/66)."},"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/712)."},"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/374)."},"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: 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: 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: 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/238)."},"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/48)."},"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":719}}}],"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":193}}}],"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":1021}}}],"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":418}}}],"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":336}}}],"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":442}}}],"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":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"1af35131a196e1957967014b8789c7428351f48c77d46e5a1faca72f0ba6781b"}},{"ruleId":"D9","level":"note","message":{"text":"Unit tests: 1 unit test method(s)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"3067d72f6515925eded797ae6deb86f74d157d3bd0b8e2d3a80edaa12ea95d24"}},{"ruleId":"D9","level":"note","message":{"text":"Integration tests: 0 integration test method(s)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"b8ce5913e7f0487c282aa29038cefc209006d3bfe4e8418292f03d5a2d9bc5b9"}},{"ruleId":"D9","level":"note","message":{"text":"BDD tests: 0 BDD test method(s)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"2335ff4716b8a3faefb3014515ddf9f836e46276f415e6cd56462b6bf7742991"}},{"ruleId":"D9","level":"note","message":{"text":"E2E tests: 0 end-to-end test method(s)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9a982d279a9674eceb951bedcbe3f8d344879045f8bee5f9f6f059139e0ed590"}},{"ruleId":"D9","level":"note","message":{"text":"Tests co-located / outside the solution: 1 test method(s) were found on disk (co-located in feature projects, or outside the analyzed solution) rather than in dedicated test projects, so the unit/integration/E2E pyramid can\u0027t be classified \u2014 they\u0027re counted as one undifferentiated suite."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"0904ffa5eabf8d5decf791cce158e53221dbcbc8b7735f3a50d064243f7de222"}},{"ruleId":"D10","level":"error","message":{"text":"No assertions: Test1: Test method has no assertions \u2014 it may not test anything."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Tests.Application/UnitTest1.cs"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab17efe7d8a336626eb3428575161c6c668064dfa53450099a2658c77cde6ceb"}},{"ruleId":"D10","level":"note","message":{"text":"Mock framework: Moq: Application.Tests references Moq."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"73fecfed0c3032ded0d3446adbea832a077888cea2ae1e5f94659577d9c5590f"}},{"ruleId":"D11","level":"note","message":{"text":"No tests discovered: Test reliability not scored \u2014 the test tier(s) built and ran but no tests were discovered, so reliability couldn\u0027t be exercised."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6e4c0ab67b9e87c02498c138fb50373fdab655734b894db638fb9443a28b824b"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.EntityFrameworkCore.Abstractions: Microsoft.EntityFrameworkCore.Abstractions 9.0.6 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"253f899771725eb02504373ab5b2e69e325753ec3b112322803d37b465607f82"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: AutoMapper: AutoMapper 14.0.0 \u2192 16.1.1 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"c31fd8db76c535ee00b664fa648189351576c63c0d5403c7648ff2a267cc3609"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: FluentValidation.DependencyInjectionExtensions: FluentValidation.DependencyInjectionExtensions 12.0.0 \u2192 12.1.1 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"601e32ea3c4fcc6b79c042517b85e0277cf85af7dec8d019f7cb9fc6fe2c5049"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Hangfire.Core: Hangfire.Core 1.8.20 \u2192 1.8.23 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ee7a54e649a90b8a30995bdea79b7cfc5236e2a49c31b0939a6cb945728d7339"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: MediatR: MediatR 12.5.0 \u2192 14.1.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"0124487aa08113c6c28616fa62403bb86bbc9336f488c192d0de2988819b3b11"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.EntityFrameworkCore: Microsoft.EntityFrameworkCore 9.0.5 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d6bc2cfd10f7debbe91b72d5c6f7efc119f7ab6934ee550f9b52ebd81d514ebe"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Polly: Polly 8.5.2 \u2192 8.7.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d8e52652bf969ee5b0c88fa2f9936ec03434008405c42e83b1ba8fd6eaec5292"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: StackExchange.Redis: StackExchange.Redis 2.8.41 \u2192 3.0.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"5afdac0f5c7640475c2ad2e8c61931940fd7dc80ae82331dd5a80e5104588bf8"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Telegram.Bot: Telegram.Bot 22.5.1 \u2192 22.10.1 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"db4eead1692c5c8caa5894f728cb09b465bdb00d80c425601f2748e5412345b0"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: WTelegramClient: WTelegramClient 4.3.4 \u2192 4.4.6 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"a73eb89574e372516212b25cc34daae255326a7c503caa4ba35cb0008dbd2f5b"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Dapper: Dapper 2.1.66 \u2192 2.1.79 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4fe29cdf6ffa4e04e6b92e6e75cc02cb00db354a969a8579b466d8b1ddfc0024"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: EntityFramework: EntityFramework 6.5.1 \u2192 6.5.2 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"90049c00f3795ae85fd7c8a10a2cc99ee4a0d26b049dac97f7270794e4736ad1"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Hangfire: Hangfire 1.8.20 \u2192 1.8.23 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4cd37c4c08a4825c595ad4fa5946900c290c7f634734b334c8042bc617e0edd9"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Hangfire.Core: Hangfire.Core 1.8.20 \u2192 1.8.23 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ee7a54e649a90b8a30995bdea79b7cfc5236e2a49c31b0939a6cb945728d7339"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Hangfire.NetCore: Hangfire.NetCore 1.8.20 \u2192 1.8.23 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e6f8ac9ef2a68bc9ea242c990fb615c4f5d70b004f64d25ac8fb6798dd84180b"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Hangfire.PostgreSql: Hangfire.PostgreSql 1.20.12 \u2192 1.21.1 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"698e05a71c89cfaf03c58e1ba811bb224409b7270d13639f94d67ffc19636c15"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Hangfire.Storage.SQLite: Hangfire.Storage.SQLite 0.4.2 \u2192 0.4.3 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"555239fcaff8a84e5579476b261a24fb004baf784360faffc53f549c76d2caa8"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: HtmlAgilityPack: HtmlAgilityPack 1.12.1 \u2192 1.12.4 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4f5fabb70967a15800a5942a05f3aa52a0a1c179fa6aecd29ab9abbc6f7961fc"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Markdig: Markdig 0.38.0 \u2192 1.3.2 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f119054aec1dbac5b48660d1d8981e271ea79618115c6232e578ef63fa879c82"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.EntityFrameworkCore: Microsoft.EntityFrameworkCore 9.0.6 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d6bc2cfd10f7debbe91b72d5c6f7efc119f7ab6934ee550f9b52ebd81d514ebe"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.EntityFrameworkCore.Design: Microsoft.EntityFrameworkCore.Design 9.0.5 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f0111cd3bd807fdd263e0b2cad0da7c6f7542fd96baefd8c9ce61bcd6881208d"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.EntityFrameworkCore.InMemory: Microsoft.EntityFrameworkCore.InMemory 9.0.6 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"0394371245a954deba277b1b8b58aa7c275d12787a9125bb7cf21300e4b0bff2"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.EntityFrameworkCore.Sqlite: Microsoft.EntityFrameworkCore.Sqlite 9.0.5 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ca1f26ceea81e25ff353f12edb9683cd25576659307f775be3350af4c8f46ce2"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.EntityFrameworkCore.SqlServer: Microsoft.EntityFrameworkCore.SqlServer 9.0.5 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"937054724777e95f02b0cf71e7f6c536b9c54ad74128487d9f2e2a723becb2ef"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.Extensions.Configuration: Microsoft.Extensions.Configuration 9.0.5 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"cfed1a37193e5ac5f3e8801aaabf2ac7777d85c43d5c1d77559be94c1b696e23"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.Extensions.Configuration.Abstractions: Microsoft.Extensions.Configuration.Abstractions 9.0.6 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f0a08276c2cbe910ac2a45606657135e91a04485a0b22c069a39922fa95c33f1"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.Extensions.Configuration.Binder: Microsoft.Extensions.Configuration.Binder 9.0.5 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ce1a528a9e3cd5909db722fbe0290d27d676e71a1901c054e67ab0257e888d59"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.Extensions.Http: Microsoft.Extensions.Http 9.0.5 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"eb31aac3e6fd86a25ba0b9f7257f0945b4c086f9eec7b1bdd6367ca7bd710ad4"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.Extensions.Http.Polly: Microsoft.Extensions.Http.Polly 9.0.5 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"c60e25816239f905ffa6232abdd5b555ff157eff0d54b613d34f5fa83fb1e04d"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Npgsql.EntityFrameworkCore.PostgreSQL: Npgsql.EntityFrameworkCore.PostgreSQL 9.0.4 \u2192 10.0.2 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"43f53420cfcb3ff81b5e43baa23509bd321880c1a2b709fdd0007ad3bbd87c95"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Polly: Polly 8.5.2 \u2192 8.7.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d8e52652bf969ee5b0c88fa2f9936ec03434008405c42e83b1ba8fd6eaec5292"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: RestSharp: RestSharp 112.1.0 \u2192 114.0.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"304ffca1c67703bbeeda80b01ee9cf61bf3253fa95957cb50e144d18ff6799bd"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: StackExchange.Redis: StackExchange.Redis 2.8.41 \u2192 3.0.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"5afdac0f5c7640475c2ad2e8c61931940fd7dc80ae82331dd5a80e5104588bf8"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: System.Net.Http.Json: System.Net.Http.Json 9.0.5 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"7d6b7c1402b3da990a0892ecad0f65a96caf3f5e863495c40714d3a1ad0a8272"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: System.ServiceModel.Syndication: System.ServiceModel.Syndication 9.0.5 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d9a9414065f1a67c902c79497bd6ac4f017ed1e3b80b63891bc3f794198aad16"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: EFCore.AutomaticMigrations: EFCore.AutomaticMigrations 9.0.0 \u2192 10.0.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d03f7e0866d30fda7e5d62a04c56dc850ed0c12dcbe837263af2aec28aeff344"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: FluentValidation: FluentValidation 12.0.0 \u2192 12.1.1 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"cccb73c624602bf750e54c68d0d7c0c94c1c76245e5db9a95611b4ff77609524"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Hangfire.AspNetCore: Hangfire.AspNetCore 1.8.20 \u2192 1.8.23 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"c904eff72f4539c07fbd21f998671129abac0b999357dcd587e01eee8380169f"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Hangfire.Core: Hangfire.Core 1.8.20 \u2192 1.8.23 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ee7a54e649a90b8a30995bdea79b7cfc5236e2a49c31b0939a6cb945728d7339"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Hangfire.MemoryStorage: Hangfire.MemoryStorage 1.8.1.1 \u2192 1.8.1.2 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"8b86590071bb3060032e8c7da3e746a5ab788c7be14f61336091c47bb7dff47e"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Hangfire.PostgreSql: Hangfire.PostgreSql 1.20.12 \u2192 1.21.1 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"698e05a71c89cfaf03c58e1ba811bb224409b7270d13639f94d67ffc19636c15"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Hangfire.SqlServer: Hangfire.SqlServer 1.8.20 \u2192 1.8.23 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"3b5c6787d952af9cf8b98dbc87c4475a122722fd3b7cc1713c6f6d0d67e4d5b4"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: MediatR: MediatR 12.5.0 \u2192 14.1.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"0124487aa08113c6c28616fa62403bb86bbc9336f488c192d0de2988819b3b11"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.AspNetCore.Authentication.JwtBearer: Microsoft.AspNetCore.Authentication.JwtBearer 9.0.5 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f3f32aca35b9f2bce59fe364cd5f9f329a8794586827406d6d886ee25017cd7b"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.AspNetCore.OpenApi: Microsoft.AspNetCore.OpenApi 9.0.4 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"025dc7c0217feb228b75eaea392c70fe83ab95d0d1792231fc25b08a032ae7fb"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.EntityFrameworkCore.Design: Microsoft.EntityFrameworkCore.Design 9.0.6 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f0111cd3bd807fdd263e0b2cad0da7c6f7542fd96baefd8c9ce61bcd6881208d"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.Extensions.Hosting.WindowsServices: Microsoft.Extensions.Hosting.WindowsServices 9.0.5 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9eeba6a533694fb0792ff11f1e89ab27b9bfeaebd32317146fe83b8a544be1dc"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.Extensions.Http.Polly: Microsoft.Extensions.Http.Polly 9.0.5 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"c60e25816239f905ffa6232abdd5b555ff157eff0d54b613d34f5fa83fb1e04d"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Npgsql.EntityFrameworkCore.PostgreSQL: Npgsql.EntityFrameworkCore.PostgreSQL 9.0.4 \u2192 10.0.2 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"43f53420cfcb3ff81b5e43baa23509bd321880c1a2b709fdd0007ad3bbd87c95"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Polly: Polly 8.6.2 \u2192 8.7.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d8e52652bf969ee5b0c88fa2f9936ec03434008405c42e83b1ba8fd6eaec5292"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Serilog.AspNetCore: Serilog.AspNetCore 9.0.0 \u2192 10.0.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"c541905d32e1db83986413f99d40843f5fdb7b6824af3058e03921b13d0fef06"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Swashbuckle.AspNetCore: Swashbuckle.AspNetCore 8.1.1 \u2192 10.2.2 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"7072588f3b2ee7033c63d6a991ecaec0341a91e5761c9129d0e837df018c7856"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Telegram.Bot: Telegram.Bot 22.5.1 \u2192 22.10.1 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"db4eead1692c5c8caa5894f728cb09b465bdb00d80c425601f2748e5412345b0"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Testcontainers.Redis: Testcontainers.Redis 4.6.0 \u2192 4.12.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"8b902c76e4857cf59211a35832ca1fe72db789b33f7210426c53a44e4ad1a872"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Hangfire: Hangfire 1.8.20 \u2192 1.8.23 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4cd37c4c08a4825c595ad4fa5946900c290c7f634734b334c8042bc617e0edd9"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.Extensions.Hosting: Microsoft.Extensions.Hosting 9.0.5 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"7ab1a2a10fddec7f47b45ca7f28a911f7193ca526c2234e8b064a9a442c35fac"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Polly: Polly 8.5.2 \u2192 8.7.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d8e52652bf969ee5b0c88fa2f9936ec03434008405c42e83b1ba8fd6eaec5292"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Polly.Core: Polly.Core 8.5.2 \u2192 8.7.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f34326f0c0b135a883836c532acf2c082bae8295b772eeab83df01de901b3ee9"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Quartz: Quartz 3.14.0 \u2192 3.18.1 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"52f6f9019f2423f45a4d0a4e3a8ec5c873be5be2574480089fd295ed8ccea268"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Telegram.Bot: Telegram.Bot 22.5.1 \u2192 22.10.1 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"db4eead1692c5c8caa5894f728cb09b465bdb00d80c425601f2748e5412345b0"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: coverlet.collector: coverlet.collector 6.0.2 \u2192 10.0.1 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9e862b60ea0e6244916f0a40a9c1d5da15704f97aa0d556f0c0430eff9e4638f"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.NET.Test.Sdk: Microsoft.NET.Test.Sdk 17.13.0 \u2192 18.6.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e92dcd48f7ffe19d959e6b8961b53cbea7b17fb2d62d0f9d1f5c4c7b07984fab"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: xunit: xunit 2.9.2 \u2192 2.9.3 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e2d71eb3db50b167e2915ebb5c8a26b562df41b418b815fc7c968a7e82ac3675"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: xunit.runner.visualstudio: xunit.runner.visualstudio 2.8.2 \u2192 3.1.5 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"87a27f08f73b189de0e26c050a80006f291ef3318601521723ed613d4d974e96"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Dapper: Dapper 2.1.35 \u2192 2.1.79 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4fe29cdf6ffa4e04e6b92e6e75cc02cb00db354a969a8579b466d8b1ddfc0024"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: EntityFramework: EntityFramework 6.5.1 \u2192 6.5.2 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"90049c00f3795ae85fd7c8a10a2cc99ee4a0d26b049dac97f7270794e4736ad1"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Hangfire.AspNetCore: Hangfire.AspNetCore 1.8.20 \u2192 1.8.23 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"c904eff72f4539c07fbd21f998671129abac0b999357dcd587e01eee8380169f"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Hangfire.Core: Hangfire.Core 1.8.20 \u2192 1.8.23 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ee7a54e649a90b8a30995bdea79b7cfc5236e2a49c31b0939a6cb945728d7339"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Hangfire.MemoryStorage: Hangfire.MemoryStorage 1.8.1.1 \u2192 1.8.1.2 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"8b86590071bb3060032e8c7da3e746a5ab788c7be14f61336091c47bb7dff47e"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Hangfire.PostgreSql: Hangfire.PostgreSql 1.20.12 \u2192 1.21.1 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"698e05a71c89cfaf03c58e1ba811bb224409b7270d13639f94d67ffc19636c15"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Hangfire.SqlServer: Hangfire.SqlServer 1.8.20 \u2192 1.8.23 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"3b5c6787d952af9cf8b98dbc87c4475a122722fd3b7cc1713c6f6d0d67e4d5b4"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.Data.SqlClient: Microsoft.Data.SqlClient 5.1.6 \u2192 7.0.1 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6bf9c4b6ea6c7b54f640820461e643013418803d85fd3de4a02535bc63530286"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.Extensions.Logging.Abstractions: Microsoft.Extensions.Logging.Abstractions 9.0.5 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"5d1d778014b65cbfa7ca8eb15a6eacf49d85cea868e48c56a7866e7acc38b158"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Serilog: Serilog 4.2.0 \u2192 4.3.1 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"960fbbfaff057572c558f30824c18cce4ce212d442e0a2fa2e34bda122ebbe90"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: System.Management: System.Management 7.0.0 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6fd0a16e24c5e83b2ed063c0a98363cb209e4b43365281dd8dadb5d6e697eed1"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: System.ServiceProcess.ServiceController: System.ServiceProcess.ServiceController 7.0.0 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"195b7bcd67b85486c1121d787e68250a1bcf4d1726cfc3e2e2b33b4cfba3fae0"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Hangfire.Core: Hangfire.Core 1.8.20 \u2192 1.8.23 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ee7a54e649a90b8a30995bdea79b7cfc5236e2a49c31b0939a6cb945728d7339"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.AspNetCore.Mvc.Core: Microsoft.AspNetCore.Mvc.Core 2.3.0 \u2192 2.3.11 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f7761239971ecea86eb0080af3479714630c7d92a371f4763117e2bb14a6f9bd"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.Extensions.DependencyInjection: Microsoft.Extensions.DependencyInjection 9.0.5 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ef055357f0d3faf9f0ba06a196104811089401bd5b0d3e787f800b06c65ae3e4"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.Extensions.Hosting: Microsoft.Extensions.Hosting 9.0.5 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"7ab1a2a10fddec7f47b45ca7f28a911f7193ca526c2234e8b064a9a442c35fac"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.Extensions.Http: Microsoft.Extensions.Http 9.0.5 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"eb31aac3e6fd86a25ba0b9f7257f0945b4c086f9eec7b1bdd6367ca7bd710ad4"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.Extensions.Logging: Microsoft.Extensions.Logging 9.0.5 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9b4f427ec6d44fe9cdd80a7049555465b940af58d481e6155b9963a2b5c3fd32"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Polly: Polly 8.5.2 \u2192 8.7.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d8e52652bf969ee5b0c88fa2f9936ec03434008405c42e83b1ba8fd6eaec5292"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Scrutor: Scrutor 6.0.1 \u2192 7.0.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"703b793e70fb5993af875f880dec2a4490a5777b67812bc67b0e703a4e7f6ee2"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: System.Threading.Channels: System.Threading.Channels 9.0.5 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"531c5b782a2c219de523477597b8e0e822483394da14d067f97b582b6ced15f5"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Telegram.Bot: Telegram.Bot 22.5.1 \u2192 22.10.1 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"db4eead1692c5c8caa5894f728cb09b465bdb00d80c425601f2748e5412345b0"}},{"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":16}}}],"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":"note","message":{"text":"Licenses scanned: 67 packages scanned; 6 distinct SPDX licenses."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"1d29d66daec20840f6831f63c1b66b87c40390635ef3e9f728002964c77e88d4"}},{"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":"D15","level":"warning","message":{"text":"git history depth insufficient: git history depth insufficient \u2014 install a full clone for reliable trend signal."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ab15c4a7c72fcad940ff795282e210fd7f3769431dab6bffd8ce9ee8f7ee13f1"}},{"ruleId":"D16","level":"warning","message":{"text":"single-maintainer \u2014 knowledge-concentration (bus factor) risk: single-maintainer \u2014 knowledge-concentration (bus factor) risk (0 author(s) across 0 commit(s) sampled)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"b4b49d961df742f0e507f4cc5c8094fb077ba0391a27fd015d18320865187719"}},{"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: 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: 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":"note","message":{"text":"Justified suppression: empty catch \u2014 narrow/filtered/commented, treated as intentional"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/ExternalServices/CryptoPayApiClient.cs"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"a933e905c67560b6308b8122fd9b013885bdfee57b4f0c70cb20551e786c15fb"}},{"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: 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: 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: 5 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Repositories/SignalCategoryRepository.cs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"97be6ec111d61d08cdb9419d9bac52c5c098e82643f2451b42989957bb78a5de"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"191c9789d714bea86c191a8ad4cf73606e121983107a4d168c4481d6b7792f6d"}},{"ruleId":"D17","level":"note","message":{"text":"Justified suppression: empty catch (ObjectDisposedException) \u2014 narrow/filtered/commented, treated as intentional"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/TelegramUserApiClient.cs"},"region":{"startLine":945}}}],"partialFingerprints":{"codehealthFindingId/v1":"712abad6e8f0ef1e34b33eac46f26890d9ed16878c801f08a54063eeffd8dc20"}},{"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":"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":10}}}],"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":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"7509384b3553eba2a3370d8c95bfdb494df32fcf9846b8781822e1e877990a96"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 5 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/Program.cs"},"region":{"startLine":1283}}}],"partialFingerprints":{"codehealthFindingId/v1":"018cc03727ed32f8ce2cba0c5308d8d85ab6a03a1d082937741c069571898530"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/Program.cs"},"region":{"startLine":2051}}}],"partialFingerprints":{"codehealthFindingId/v1":"4726f728b7916838827228d7cfb986a1dcb56103a6a410c43d3edd3935a07450"}},{"ruleId":"D17","level":"note","message":{"text":"ObsoleteWithoutCallers: [Obsolete] SendBatchNotificationAsync"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"BackgroundTasks/Services/NotificationSendingService.cs"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"10ad19f98288b7637a7f642b432d6b9738796e8589931706e06781fcd5e8ac19"}},{"ruleId":"D17","level":"note","message":{"text":"Justified suppression: empty catch (OperationCanceledException) \u2014 narrow/filtered/commented, treated as intentional"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"BackgroundTasks/Worker.cs"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4dcdd2360cca6db919d366a894a142fb9fa62337ff1b87251b533d9669318e8"}},{"ruleId":"D17","level":"note","message":{"text":"Justified suppression: #pragma warning disable SYSLIB0051 // Type or member is obsolete"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Shared/Exceptions/AppException.cs"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4175fd0c896275d1b26a5ae768e399126de94fdedb4889e74dfbeaa0c585596"}},{"ruleId":"D17","level":"note","message":{"text":"Justified suppression: #pragma warning disable SYSLIB0051 // Type or member is obsolete"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Shared/Extensions/RepositoryException.cs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"47e7e3309c67992eee5eb9623d1dfe21639be071b23513497a7b169284f274d0"}},{"ruleId":"D17","level":"error","message":{"text":"EmptyCatchBlock: empty catch block"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Shared/Security/ExceptionSanitizer.cs"},"region":{"startLine":399}}}],"partialFingerprints":{"codehealthFindingId/v1":"96fff12b3a4e0f455a96ca0db3b5db63c1c9c7198215cb4db2b8ce7e417e11b0"}},{"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":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"04ad989dfdc8101a66df9d14b00e1e427796f904b584b7fab5bde056f171ad86"}},{"ruleId":"D17","level":"note","message":{"text":"Justified suppression: empty catch (OperationCanceledException) \u2014 narrow/filtered/commented, treated as intentional"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/Analysis/MarketAnalysisCallbackHandler.cs"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ad74a84ac269f401a9ba340fb30e02a7049e8894fa3d10325084743f9055196"}},{"ruleId":"D17","level":"note","message":{"text":"Justified suppression: empty catch \u2014 narrow/filtered/commented, treated as intentional"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/Analysis/MarketAnalysisCallbackHandler.cs"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ad74a84ac269f401a9ba340fb30e02a7049e8894fa3d10325084743f9055196"}},{"ruleId":"D17","level":"note","message":{"text":"Justified suppression: empty catch (ApiRequestException) when (\u2026) \u2014 narrow/filtered/commented, treated as intentional"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/Cloudflare/CloudflareRadarCallbackHandler.cs"},"region":{"startLine":431}}}],"partialFingerprints":{"codehealthFindingId/v1":"64a8de884e99a13f96a97bc42e05fa4c35d44cc4cafa8861237ed6edb8369ee4"}},{"ruleId":"D17","level":"note","message":{"text":"Justified suppression: empty catch \u2014 narrow/filtered/commented, treated as intentional"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/Cloudflare/CloudflareRadarCallbackHandler.cs"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"64a8de884e99a13f96a97bc42e05fa4c35d44cc4cafa8861237ed6edb8369ee4"}},{"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":"note","message":{"text":"Justified suppression: empty catch (Exception) \u2014 narrow/filtered/commented, treated as intentional"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Application/CommandHandlers/Features/EconomicCalendar/EconomicCalendarCallbackHandler.cs"},"region":{"startLine":404}}}],"partialFingerprints":{"codehealthFindingId/v1":"961977e431475f8f50145019127cec82bbf9acb6baecce9917d1e6dee8654410"}},{"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":"note","message":{"text":"Justified suppression: empty catch \u2014 narrow/filtered/commented, treated as intentional"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Logging/TelegramAdminSink.cs"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"90d4db9453e6a28cc39c85dc4ee86cf1ccdbe153b429ddd595b7d55f0449e068"}},{"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":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/TelegramNotificationService.cs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7b2acd144c59d86d55f6cb994717f5d05271d74c7673e8870e514ff8d0f8827"}},{"ruleId":"D17","level":"note","message":{"text":"Justified suppression: empty catch (OperationCanceledException) \u2014 narrow/filtered/commented, treated as intentional"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/UpdateProcessingService.cs"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"40816c2a0f8e48833df8fc9a2700c26097ea513bbae22d99b2528691ca7d157f"}},{"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":"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: DispatchException: NamedType DispatchException \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Services/DispatchException.cs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"9aa467b0eb7c55d39deeeb3f1bd96425d6ee1986a2fba161962fd95c4ea366cc"}},{"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":70}}}],"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":934}}}],"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":79}}}],"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":1592}}}],"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":1266}}}],"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":1870}}}],"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":1892}}}],"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":2559}}}],"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":550}}}],"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: BuildExceptionAttachment: Method BuildExceptionAttachment \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Logging/TelegramAdminSink.cs"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"426b5b789c489158e86369cd6f7abe78c30ed633076338b156af64c4b0e71977"}},{"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":587}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ee4e8ee74c5843c2f2f6d280cc8d7e1e6c4ed9b2a3f597377e6320f6d0a8097"}},{"ruleId":"D18","level":"note","message":{"text":"Shell project: Application.Tests: \u0060Application.Tests\u0060 contributes only 3 significant line(s) \u2014 an empty/placeholder project is structural noise. Remove it or fold its contents into a real project."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application.Tests/Application.Tests.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab8497fed12d4fe5164632f6c19bf954b262bdab301ab1eb3f4f3e45d4ea68f3"}},{"ruleId":"D18","level":"note","message":{"text":"Domain (Production): 28 .cs files, 2057 LoC (966 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Domain/Domain.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b1fa867aa27c02919f14f173bc1bb08f8282a3fe6a0dc5381ccc191d26ad035"}},{"ruleId":"D18","level":"note","message":{"text":"Application (Production): 132 .cs files, 12793 LoC (6952 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Application.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"05776b5f550480b53ff7e33bc51e4136bd62616eeada19022d00bae430d73f1d"}},{"ruleId":"D18","level":"note","message":{"text":"Infrastructure (Production): 89 .cs files, 34932 LoC (24568 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Infrastructure.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a18c4bc79bb6342b9dfccf7c83bb11f4a70e3d18a386c7abcd61df7e76754f4d"}},{"ruleId":"D18","level":"note","message":{"text":"WebAPI (Production): 24 .cs files, 5250 LoC (3820 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/WebAPI.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6154b12c2a586d1a06a81093425a4d7a27a790c1cd408761c107c2a775f8d1c"}},{"ruleId":"D18","level":"note","message":{"text":"BackgroundTasks (Production): 6 .cs files, 1800 LoC (1104 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"BackgroundTasks/BackgroundTasks.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b89cea0ab73c369b003986c37a2694114d455fa99606ec4bb0890144198a25cf"}},{"ruleId":"D18","level":"note","message":{"text":"Application.Tests (Test): 1 .cs files, 4 LoC (3 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application.Tests/Application.Tests.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d88f76814cf67e3d3446b27e9500572e01cd7d0f1573c7e3ee846ca0159f5628"}},{"ruleId":"D18","level":"note","message":{"text":"Shared (Production): 14 .cs files, 1809 LoC (1013 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Shared/Shared.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bc161ec70fa0518c4ea9159dc4b4d85a87efbc324035bf2c424a72f3a0536a5"}},{"ruleId":"D18","level":"note","message":{"text":"TelegramPanel (Production): 90 .cs files, 18109 LoC (12994 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/TelegramPanel.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5e4f7054166135d61d0aa76dbc610dcdc298cb8e9138dfc3d13dd1be1654b02"}},{"ruleId":"D19","level":"note","message":{"text":"The file contains documentation for a third-party dependency (Redis) rather than the project\u0027s own code, which is an unusual location for project documentation.: Move this file to a \u0027third-party\u0027 or \u0027dependencies\u0027 folder, or remove it if it\u0027s just a copy of upstream docs. Ensure the project\u0027s own API documentation is in the main docs folder."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/redis-server/README.txt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b4f3fab91f0030580d6d562e376ab994b8a68759f65300438143a65c3f80995"}},{"ruleId":"D19","level":"note","message":{"text":"XML-doc coverage: Domain: Domain: 57 % XML-doc coverage (154/268)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Domain/Domain.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c28bf87c6111f492233cb98a40a42525442156e49b25ee13ccb486a9c0d8737"}},{"ruleId":"D19","level":"note","message":{"text":"XML-doc coverage: Application: Application: 69 % XML-doc coverage (453/652)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Application/Application.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8fcc3e81d5cc47e43d0c220a60d355b9853cf9976702960c2fdd7dd6c0c304d"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: Infrastructure: Infrastructure: 22 % XML-doc coverage (267/1239)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Infrastructure.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4beca30bee59f4f098a8d024d0d852b687b8f3fafe2a2df48445ae1d3f5ef88f"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: WebAPI: WebAPI: 23 % XML-doc coverage (46/203)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"WebAPI/WebAPI.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c59305ce8c2af5e09f94c22a17d0b2418549eb2482f246559fc17a639a98a360"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: BackgroundTasks: BackgroundTasks: 26 % XML-doc coverage (9/34)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"BackgroundTasks/BackgroundTasks.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a94487dc2693fe9d9d08846751d15305d01de72f3c75884a1a377e4cb1c5ea3"}},{"ruleId":"D19","level":"note","message":{"text":"XML-doc coverage: Shared: Shared: 79 % XML-doc coverage (64/81)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Shared/Shared.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"56989a01f535be0cfe0621bb63508c97f9922254f5ecdb247d5874b0adf0e876"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: TelegramPanel: TelegramPanel: 30 % XML-doc coverage (178/584)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/TelegramPanel.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"669446a293cb2b656d260550638c46d2c1711090aea37093eb0b65664531e654"}},{"ruleId":"D20","level":"note","message":{"text":"No ADRs found: No ADRs found at common paths; consider documenting architectural decisions in Docs/ADL/ or similar."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d2bea044ff79d7d275f5a91a6e2f548586178eaf480274c33960ad020c854631"}},{"ruleId":"D22","level":"note","message":{"text":"No exposed public API: No intentionally-exposed types (IsPackable or .Contracts) to evaluate."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"2712d35e1d1ba8e91a90125d29842b77d4ca65e0eeaa52476c739f7165820a6f"}},{"ruleId":"D23","level":"note","message":{"text":"Bounded contexts not declared: The codebase is large and multi-project, indicating distinct modules that likely require explicit boundary declarations to manage coupling. 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: \u0022This is usually fine.\u0022 \u2014 Remove. It adds no new information."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/TelegramMessageSender.cs"},"region":{"startLine":618}}}],"partialFingerprints":{"codehealthFindingId/v1":"1033f6573940fcb689e8f071342b51c6f9a27ae31343caa0d4e088fd224337d1"}},{"ruleId":"D24","level":"note","message":{"text":"redundant comment: \u0022For JobDisplayName, AutomaticRetry\u0022 \u2014 Remove. It\u0027s just a list of types/properties."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Infrastructure/Services/RssFetchingCoordinatorService.cs"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"826ade74e4cb5adda7ea475f72e5ac895a556d1043d05c635ea099248bd456ed"}},{"ruleId":"D25","level":"note","message":{"text":"no ADRs to check: No ADRs found, so conformance can\u0027t be assessed."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"5f96235c58be08aaae505ba823e9095f206fbc6a447f646e346ee9bd81a5f481"}},{"ruleId":"D26","level":"note","message":{"text":"Split Application: With 142 public types across 34 namespaces, the project is large and spans a wide variety of unrelated areas, indicating a lack of single-responsibility focus. Suggested: by namespace: split into multiple smaller projects based on the 34 distinct namespaces"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9e8c5585c22a3d833b59e053c49b63bd595b6af14c0afc4314e5028abf50ebe9"}},{"ruleId":"D26","level":"note","message":{"text":"Split TelegramPanel: The project contains 118 public types across 31 namespaces, indicating a broad scope that likely mixes distinct functional areas. Suggested: by namespace: split into multiple smaller projects based on the 31 distinct namespaces"},"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":20}}}],"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/Services/Fmp/FmpApiClient.cs"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"6873788ab9cb6d7ed03fe66a41a59b909fec3694e0aef809c373f19642f7e9f0"}},{"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":25}}}],"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/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":"error","message":{"text":"Secret: generic-api-key: matched rule \u0027generic-api-key\u0027"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"TelegramPanel/Infrastructure/Services/CloudflareRadarService.cs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b99b3f8eb08a9e1f56bd2ccadcee95252368b6ca8c36e9d149be80d5dc0809d"}},{"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":"note","message":{"text":"Not applicable: the solution did not restore on the analyzer\u0027s .NET SDK (an SDK/target-framework/restore mismatch, common for an older codebase), so there was no restored dependency graph to scan for NuGet CVEs \u2014 excluded rather than scored; re-run on an SDK that can restore this solution"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"34ff807233366ca1607a49113cb8f9a094878853712c06642d2146b82741378f"}},{"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":"D32","level":"note","message":{"text":"Not applicable: No PII/GDPR-handling patterns detected (p/gdpr ruleset) \u2014 no data-compliance surface to assess."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"df51e593e9b0b9805626d04fe36a3d12c504b5d7d5da30dc59b5b0f134b5753b"}},{"ruleId":"D34","level":"note","message":{"text":"early-stage repository \u2014 too little history to judge knowledge freshness: early-stage repository \u2014 too little history to judge knowledge freshness (0 commit(s) sampled)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"58b42e8ad1f5e125e8a2d365554e56d01e64a556b28e0c9985ff169722b7c54a"}},{"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"}}],"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}}}]}