Files
chevron7 12ebc8c9a5 fix(vibe): harden text-embedding bridge against busy/reconnecting Redis (#197)
The first #197 fix only hardened the pub/sub subscriber; a 3-model review panel
found it incomplete. This closes the rest:

- publish() now runs on a dedicated soft-options connection (enableOfflineQueue,
  infinite retries) instead of the strict shared client -- that strict publish
  was still throwing the same "Stream isn't writeable" error under load.
- subscriber lifecycle: terminal "end" drops the cache, a failed psubscribe
  disconnects the half-open socket instead of leaking it; transient drops
  self-heal via auto-reconnect.
- both subscribe and publish are time-bounded so an unreachable Redis fails the
  request instead of hanging indefinitely.
- analyzer failures ({success:false, embedding:null}, no error field) are now
  rejected cleanly instead of passing null into the pgvector cast (500).
- the analyzer publishes a failure response on internal exceptions so the caller
  fails fast instead of waiting out the full 15s timeout.

Reviewed by Opus/Sonnet/Haiku panels twice (original confirmed INCOMPLETE,
rewrite SHIP-WITH-CHANGES); surviving findings applied, two rejected with reason
(no publisher churn on transient error; keep setMaxListeners(0) to not re-trigger
the warning flood).

The reporter's 200k-track failure may also involve Redis memory pressure or
Python-analyzer saturation, which this makes tolerable but does not itself
resolve -- pending their redis INFO.
2026-06-04 17:42:40 -05:00
..