Skip to content

🐛 P0: fix Halibut 8.1 cache-key bug silently breaking every health check

Placeholder ppxd requested to merge investigation/halibut-cache-key-bug into main

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)

  • TentacleHealthCheckStrategy line 88-91 → catches as 'connectivity failed'
  • KubernetesAgentHealthCheckStrategy line 75-78 → catches as 'connectivity failed'
  • HalibutLivenessProbe line 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)

🤖 Generated with Claude Code

Merge request reports

Loading