🐛 P0: fix Halibut 8.1 cache-key bug silently breaking every health check
TL;DR
Production bug: every Tentacle / K8s agent capabilities probe in production has been throwing ArgumentOutOfRangeException CLIENT-SIDE (before any RPC) because CapabilitiesRequest was an empty class — Halibut 8.1's cache-key generator rejects empty types when [CacheResponse] is on the method.
The exception is caught broadly in 3 production callers and converted to misleading "Tentacle connectivity failed" error messages.
Fix: CapabilitiesRequest now implements IEnumerable<string> (empty sequence) + [JsonObject(OptIn)] to preserve the {} wire shape for backward compatibility.
Affected production callers (all 3)
-
TentacleHealthCheckStrategyline 88-91 → catches as 'connectivity failed' -
KubernetesAgentHealthCheckStrategyline 75-78 → catches as 'connectivity failed' -
HalibutLivenessProbeline 48-51 → returns false; aborts upgrade dispatch silently
Test plan
-
5006/5006 unit tests pass after fix -
1398/1398 tentacle tests pass -
71/71 E2E tests pass -
Reproducer test ( GetCapabilitiesAsync_DoesNotThrowCacheKeyException) confirms bug is fixed -
Type-shape Rule-8 pin prevents regression -
Wire-shape pin asserts {}shape preserved (mixed-version compat)