feat(host): warn when Cluster:Roles and OTOPCUA_ROLES disagree; boot banner names the winning source

This commit is contained in:
Joseph Doherty
2026-08-20 10:08:03 -04:00
parent e46c1db5e5
commit 3314a1f98d
4 changed files with 92 additions and 14 deletions
@@ -796,6 +796,13 @@ Log.Information(
"OtOpcUa.Host starting with roles=[{Roles}] (admin={HasAdmin}, driver={HasDriver}) source={Source}",
string.Join(",", roles), hasAdmin, hasDriver, effectiveRoles.Source);
// R3-04 choice 5: Cluster:Roles and OTOPCUA_ROLES set to different normalized role sets is almost
// certainly not what the operator intended (Cluster:Roles still wins outright — this is
// observability, not a behaviour change). Logged here rather than inside the static factory because
// Serilog is not configured yet when EffectiveRoles.Resolve runs at the top of this file.
if (effectiveRoles.DisagreementWarning is not null)
Log.Warning("{Warning}", effectiveRoles.DisagreementWarning);
// #561 — startup growth self-check: the banner above went through the live pipeline; verify each
// configured file sink physically grew. A sink whose writes silently fail (the wonder-app-vd03
// 0-byte-log incident) is reported at boot — through SelfLog + stderr, which don't depend on the