From continued SonarQube triage (2026-07-17), after re-auditing on the fresh baseline. RedisClusterState.{Ghosts,Survivors,ConnectedMasters} were expression-bodied => Nodes.Where(...).ToList(), allocating a fresh filtered list on each read. Not a correctness bug — Nodes is init-only/immutable so results are stable, and no caller depends on referential identity (verified: all usages are .Count/.Select/.Single/.FirstOrDefault). But it is a real minor inefficiency: RedisClusterProbe reads Ghosts 4x in one alert path, each re-running the filter. Fixed by lazy-caching each into a backing field (materialize once); zero behavior/API change, SystemRemediation tests 82/82. PR incoming; will close on merge.
From continued SonarQube triage (2026-07-17), after re-auditing on the fresh baseline. `RedisClusterState.{Ghosts,Survivors,ConnectedMasters}` were expression-bodied `=> Nodes.Where(...).ToList()`, allocating a fresh filtered list on each read. Not a correctness bug — Nodes is init-only/immutable so results are stable, and no caller depends on referential identity (verified: all usages are .Count/.Select/.Single/.FirstOrDefault). But it is a real minor inefficiency: RedisClusterProbe reads Ghosts 4x in one alert path, each re-running the filter. Fixed by lazy-caching each into a backing field (materialize once); zero behavior/API change, SystemRemediation tests 82/82. PR incoming; will close on merge.
Verified fixed on master — closing. (Ticket-triage loop 2026-07-18.)
Shipped in commit a3e59a5dperf(redis-heal): cache RedisClusterState's derived node projections (S2365) / PR #358 — the commit cited #649 (shifted-ref pattern, same as #656/#657), so this stayed open. Current master has Ghosts/Survivors/ConnectedMasters lazy-cached into backing fields (_ghosts ??= …) exactly as this ticket prescribed. SystemRemediation tests green. No code change required.
**Verified fixed on master — closing.** (Ticket-triage loop 2026-07-18.)
Shipped in commit `a3e59a5d` *perf(redis-heal): cache RedisClusterState's derived node projections (S2365)* / PR #358 — the commit cited **#649** (shifted-ref pattern, same as #656/#657), so this stayed open. Current master has `Ghosts`/`Survivors`/`ConnectedMasters` lazy-cached into backing fields (`_ghosts ??= …`) exactly as this ticket prescribed. SystemRemediation tests green. No code change required.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
From continued SonarQube triage (2026-07-17), after re-auditing on the fresh baseline.
RedisClusterState.{Ghosts,Survivors,ConnectedMasters}were expression-bodied=> Nodes.Where(...).ToList(), allocating a fresh filtered list on each read. Not a correctness bug — Nodes is init-only/immutable so results are stable, and no caller depends on referential identity (verified: all usages are .Count/.Select/.Single/.FirstOrDefault). But it is a real minor inefficiency: RedisClusterProbe reads Ghosts 4x in one alert path, each re-running the filter. Fixed by lazy-caching each into a backing field (materialize once); zero behavior/API change, SystemRemediation tests 82/82. PR incoming; will close on merge.Verified fixed on master — closing. (Ticket-triage loop 2026-07-18.)
Shipped in commit
a3e59a5dperf(redis-heal): cache RedisClusterState's derived node projections (S2365) / PR #358 — the commit cited #649 (shifted-ref pattern, same as #656/#657), so this stayed open. Current master hasGhosts/Survivors/ConnectedMasterslazy-cached into backing fields (_ghosts ??= …) exactly as this ticket prescribed. SystemRemediation tests green. No code change required.