Treats Synapse transient replies (shape_compiling, model_loading, deadline_exceeded, queue_full, engine_crashed, quarantined lanes) as lane pauses instead of model failures. A cold build or refresh now waits out the warm-up and resumes, keeping the semantic index and its status, where before it published Failed and cleared the index.
Background indexing waits max(retry hint, backoff) and resumes its checkpoint; unbind, lane changes, or a newer refusal with its own wait interrupt it.
Queries fall back to keyword search at once, with a "model is warming up" footer and an ETA when the reply names one; transient refusals never count toward the circuit breaker or timeouts.
A page refused with safe_to_retry_same_request: false is split in half before resending; a one-row page is resent under a fresh request_key, and refused rows are bounded (1,024 rows, 1 hour) so abandoned builds can't leak keys forever.
A transient reply naming another lane is a fingerprint mismatch, never a pause of this one; a worker's retry time extends only the recorded pause it waits on.
Retry hints outside 100 ms..120 min (or malformed ones) fall back to the normal worker backoff.
Confidence Score: 5/5
The PR appears safe to merge; no new actionable issues were found.
Summary
Synapse transient replies now pause indexing instead of discarding the semantic index. Searches use keyword results while the model warms up.
Transient Synapse replies pause the embedding lane until it can try again.
Unsafe batch refusals lead to smaller pages or a fresh request key.
Background indexing waits out lane pauses and resumes its work.
Searches use keyword results and name the model warm-up when embedding pauses.
Diagram
%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[Synapse transient reply] --> B{Request type}
B -->|Search| C[Return keyword results]
C --> D[Show warm-up message when applicable]
B -->|Background indexing| E[Keep index and checkpoint]
E --> F[Wait for retry hint or backoff]
F --> G{Still current?}
G -->|No| H[Stop]
G -->|Yes| I[Retry]
I --> J{Same request unsafe?}
J -->|Larger page| K[Split page]
J -->|One row| L[Use fresh request key]
J -->|No| M[Reuse request]