diff --git a/code-reviews/ClusterInfrastructure/findings.md b/code-reviews/ClusterInfrastructure/findings.md index 16a7087..e067a3d 100644 --- a/code-reviews/ClusterInfrastructure/findings.md +++ b/code-reviews/ClusterInfrastructure/findings.md @@ -83,7 +83,49 @@ should clearly state it is unimplemented so callers do not assume otherwise. **Resolution** -_Unresolved._ +_Re-triaged 2026-05-16 — remains Open, needs a design decision from the user._ + +Verified against the source at the reviewed commit: the finding's factual claims hold. +`src/ScadaLink.ClusterInfrastructure` still contains only `ClusterOptions.cs` and a +no-op `ServiceCollectionExtensions.cs`, and the `.csproj` references no Akka packages. + +However, the documented cluster behaviour is **not actually absent from the system** — +it has been implemented in the **Host** project rather than in this module: + +- `src/ScadaLink.Host/Actors/AkkaHostedService.cs` bootstraps the `ActorSystem`, + generates the HOCON from `ClusterOptions` (it imports `ScadaLink.ClusterInfrastructure` + and injects `IOptions`), and configures the `keep-oldest` split-brain + resolver with `down-if-alone = on` (see `AkkaHostedService.cs:95-96`). +- `src/ScadaLink.Host/Health/AkkaClusterHealthCheck.cs`, `AkkaClusterNodeProvider.cs`, + and `Health/ActiveNodeHealthCheck.cs` cover cluster membership / active-node detection. +- Akka cluster/remote package references live in `ScadaLink.Host.csproj` and the + per-component projects (`SiteRuntime`, `Communication`, etc.). + +So the real situation is an **ownership / design-doc drift**, not missing behaviour: +`Component-ClusterInfrastructure.md` assigns the Akka bootstrap, HOCON generation, +split-brain config and `CoordinatedShutdown` wiring to this module, but the +implementation deliberately lives in the Host. `ClusterOptions` is the one piece this +module legitimately owns and it is consumed correctly by the Host. + +Resolving CI-001 as literally written is **not a small, well-scoped fix** — it is one +of two substantial decisions, both requiring the user: + +1. **Move the bootstrap into this module** — relocate the HOCON generation, split-brain + config, cluster-singleton helpers and `CoordinatedShutdown` wiring out of + `ScadaLink.Host` into `ScadaLink.ClusterInfrastructure`, add the Akka package + references, and re-wire the Host to call into it. This is a cross-module refactor + touching `src/ScadaLink.Host/*` and several other projects — outside the edit scope + permitted for this finding (only `src/ScadaLink.ClusterInfrastructure/`, + `tests/ScadaLink.ClusterInfrastructure.Tests/`, and this file may be edited). +2. **Accept the current placement** — keep the bootstrap in the Host and update + `Component-ClusterInfrastructure.md` (and the README component table) to record that + the Host owns the actor-system/cluster bootstrap and that this module's role is the + shared `ClusterOptions` contract. That fix is a design-doc edit, also outside this + module's permitted edit scope. + +Either path is a deliberate architecture decision, not a bug fix, so per +REVIEW-PROCESS.md §2 this finding is left **Open** and surfaced for the user to decide. +No code change was made. Module test suite verified green (3 passed) at re-triage time. ### ClusterInfrastructure-002 — No-op DI extension methods report success while doing nothing