Files
pad/docs
xarmian 03518466ab fix(server,metrics,docs): five codex round-2 findings (BUG-2724, BUG-2726)
Round 2 probed angles round 1 did not: rolling upgrade and rollback,
request cancellation, and whether any operator-facing text now
contradicts the code. Four of the five were the latter.

1. The admission slot was held through the Redis presence cleanup.
   Defers run LIFO, so the acquire-site release ran LAST — after
   Remove's round trip, bounded by presenceOpTimeout (5s) and a wait on
   the renewal goroutine. A reconnect arriving inside that window could
   be refused by a bound the connection had already stopped consuming,
   and the window is widest during a Redis outage, which is when clients
   reconnect most. A second deferred release, registered later so it runs
   first, closes it; the acquire-site defer stays as the safety net for
   early returns, and release is idempotent so deferring twice releases
   once.

2. pad_sse_connections_active is written by the events.EventBus wrapper,
   so it has only ever counted the workspace stream. That was every SSE
   connection Pad had a limit for until this branch; it no longer is, so
   an operator watching it against the global limit would be reading one
   endpoint's share of a two-endpoint budget. Adds
   pad_stream_connections_active, driven by the admission gate itself,
   and both Help strings now name their population. Wired from either
   SetMetrics or SetSSELimits (either can land first) and from the
   lazily-built gate, each covered by a test — a gauge stuck at zero
   while streams are held is the same shape of lie as a metric that is
   not registered at all.

3. The limits are enforced in-process and the docs called them "Global".
   With the shipped k8s manifest's two replicas, 1000 admits ~2000 and a
   user can hold 50 per pod. Documented as per-instance, with the
   multiply-by-replicas note and a pointer at the new gauge.

4. A namespace cutover partitions a rolling upgrade — namespaced and
   un-namespaced replicas are two installations for the length of the
   rollout — and rolling back with the variable still set silently
   restores the split. Both now stated, with the env var and the binary
   having to move together in both directions.

5. Client resync across that cutover is honest on the watch stream (the
   epoch key detects the changed id space) and SILENT on the activity
   stream, whose cold replay buffer answers a resume as "caught up".
   Documented, and filed as BUG-2731 rather than fixed here: it is
   pre-existing, fires on any replica restart, and the minimal fix
   changes reconnect behaviour for every deployment, which wants a
   ruling rather than a quiet patch.

Claude-Session: https://claude.ai/code/session_01JVDBKbgn3Xt7ndW1YoYd8X
2026-08-22 02:05:01 +00:00
..